Informix から Oracle への一括インポート
-
11-09-2019 - |
質問
Informix SE データベースからいくつかのテーブルを取得し、Oracle 10g でテーブルを切り詰めて、Informix データを移入する必要があります。
一括インポートは機能しますか?データ型が衝突することはありますか?
毎日スケジュールできる単純な Java 実行可能ファイルを使用したいと考えています。Java プログラムは一括インポートを呼び出すことができますか?提供できる例はありますか?ありがとう。
解決
シナリオが面白い!
懸念すべき問題がいくつかあります。
- Oracle の一括インポートでは、データはどのような形式になると想定されますか?
- DATE 値と DATETIME 値の正しい形式は何ですか?
実際的には (Oracle ではなく Informix での経験に基づいて)、バルク ロードの前にテーブルを切り捨てるのではなく、新しく作成したテーブルにデータをバルク ロードし (比較的時間のかかるプロセス)、古いテーブルを新しい。何が最も速く機能するかに応じて、次のような一連の操作を実行します。
- 古いテーブルの名前をジャンクテーブルに変更します
- 新しいテーブルの名前を古いテーブルに変更します
続いて一連の「ジャンク テーブルの削除」操作を実行するか、私なら次のようにします。
- 古いテーブルを削除
- 新しいテーブルの名前を古いテーブルに変更します
この方法で操作を実行すると、「テーブルの切り捨て」に続いて「テーブルのロード」を行う場合と比較して、テーブルの「ダウンタイム」が最小限に抑えられます。
Oracle は SE に似ています。その DDL ステートメントは非トランザクションです (テーブルを削除し、新しいテーブルを作成し、一連の操作全体をロールバックするトランザクションが可能な IDS とは異なります)。
データをエクスポートするにはどうすればよいですか?
これは、Oracle ローダーの柔軟性に応じて異なります。Informix の標準出力形式 (UNLOAD 形式など) に適応できる場合、アンロード操作は簡単です。日付値が Oracle によって認識されるようにするには、DBDATE 環境変数を設定する必要がある場合があります。私はそれを信じることができました』DBDATE="Y4MD-"
』は受け入れられる可能性が高い。これは、2 を表す SQL 標準の 2009-12-02 表記です。nd 2009 年 12 月。
デフォルトの UNLOAD 形式は、「埋め込まれた改行、バックスラッシュ、およびパイプ記号をエスケープするバックスラッシュを含むパイプ区切りのフィールド」として要約できます。
abc|123|2009-12-02|a\|b\\c\
d||
これは、文字列、数値、日付、および別の文字列 ('a'、'|'、'b'、'\'、'c'、改行、および 'd' を含む) と null を含む 1 つのレコードです。分野。末尾の空白は文字列から削除されます。アンロード ファイル内に空だがヌルではない文字フィールドに 1 つのブランクが含まれています。
Oracle でこれをすぐに処理できない場合は、Perl + DBI + DBD::Informix + DBD::Oracle が使用できるツールセットであるかどうかを検討してください。これにより、Oracle データベースと Informix (SE) データベースの両方に接続できるようになり、それらの間でデータを転送します。
あるいは、SE 用の代替アンローダーを調査する必要があります。Windows を使用していない限り、調査する価値があるプログラムの 1 つは次のとおりです。 SQLCMD (公正警告:作者の偏見が忍び寄る)。非常に強力な出力書式設定オプションのセットがあり、おそらく Oracle が許容できるテキスト形式 (CSV など) を作成できます。
最後のフォールバックは、選択したデータの INSERT ステートメントをツールに生成させることです。これは SQLCMD への追加として役立つ可能性があると思いますが、まだありません。したがって、次のものを使用する必要があります。
SELECT 'INSERT INTO Target(Col1, Col2) VALUES (' ||
Col1 || ', ''' || Col2 || ''');'
FROM Source
これにより、単純な INSERT ステートメントが生成されます。この問題点は、Col2 (文字列) 自体に引用符が含まれていると堅牢ではないことです (改行は受信側でも問題を引き起こす可能性があります)。これが許容できるかどうかを評価する必要があります。