2

最初に少し背景を説明します。私の会社は、InformixデータベースをOracle10gに移行するかどうかを評価しています。いくつかのESQL/Cプログラムがあります。私はOracleMigrationワークベンチをいくつか実行し、いくつかのテストを混乱させてきました。今、私はいくつかのことに気づきました。

まず、null値をまったく処理しない動的SQLステートメントがあります。私が読んだことから、nvl()関数を利用するようにクエリを手動で変更するか、インジケーター変数を実装する必要があります。誰かが手動で変更する必要があるかどうかを確認できますか?変換されたESQL/Cプログラムに手動で変更を加える必要が少ないほど、優れています。

次に、さまざまなテーブルなどから日付を取得するクエリがいくつかあります。Informixでは、日付は1899年12月31日からの日数であるlong型として扱われます。

Pro * Cでは、日付はどの形式として選択されていますか?long変数に日付フィールドを選択しようとしたところ、「NUMBERが期待されましたが、DATEが取得されました」というOracleエラーが発生したため、数値ではないことがわかりました。したがって、日付フィールドの選択方法を変更する必要があると想定しています。日付フィールドを変換して長くなるように選択するか(つまり、1899年12月31日からの日数)、ホストを変更します。 Oracleが返すものと一致する変数(それは何ですか、文字列?)。

4

3 に答える 3

3

おそらくまだ気になっていないかもしれませんが、Oracleでは空のVARCHAR2フィールドがNULLであることに注意してください。この背後にあるロジックはわかりません(おそらく私はInformixの土地から来たためです)-覚えておいてください。私はそれが愚かだと思います-IMHOの空の文字列は意味があり、NULLとは異なります。

NOT NULL DEFAULT '-'すべてのVARCHAR2フィールドをまたはその他の任意の値に変更するか、すべてのクエリでVARCHAR2フィールドを返すインジケーターを使用するか、常にを使用しますNVL()

于 2009-05-05T17:41:48.920 に答える
3

Y A。説明したように、クエリを変更する必要があります。

長い間つまずきます。long は、Oracle では別の意味を持ちます。特定の DATE タイプがあります。通常、いずれかを選択する場合は、フォーマットを指定して TO_DATE 関数を使用し、結果を正確に必要なフォーマットで VARCHAR2 として取得します。

于 2009-05-05T15:44:52.727 に答える
2

オラクルの日付 (オラクルの内部形式で格納されている) を長整数に変換するには、クエリを変更する必要があります。日付には次の式を使用します。

to_number (to_char (date_column, 'J')) - to_number(to_char(to_date('12/31/1899', 'MM/DD/YYYY'), 'J'))

Oracle システムの 'J' (ユリウス日付) 形式は、紀元前 4712 年 12 月 31 日からの日数のカウントです。後の日付から数えたい場合は、その後の日付のユリウス日カウントを差し引く必要があります。

1 つの提案: プログラム内のすべてのクエリを変更する (問題が発生し、バグが発生する可能性がある) 代わりに、別のスキーマで一連のビューを作成します。これらのビューは、すべて同じ列を持つすべてのテーブルと同じ名前が付けられますが、NVL() および date() 式が含まれます (上記のように)。次に、ベース テーブル スキーマではなく、ビュー スキーマでアプリケーションをポイントします。テストがはるかに少なく、何かが欠けている場所が少なくなります。

たとえば、すべてのテーブルを「APPS_BASE」というスキーマに入れます (ユーザー「APPS_BASE」によって定義されます。次に、「APPS_VIEWS」という別のスキーマ/ユーザーを作成します。APPS_VIEWS でビューを作成します。

CREATE OR REPLACE VIEW EMP AS
SELECT name, birth_date
FROM   APPS_BASE.EMP;
于 2009-05-05T19:36:42.700 に答える