2

Informix SEデータベースからいくつかのテーブルをプルし、Oracle 10gでテーブルを切り捨ててから、それらにInformixデータを入力する必要があります。

一括インポートは機能しますか?データ型は衝突しますか?

毎日スケジュールできる単純なJava実行可能ファイルを使用したいと思います。Javaプログラムは一括インポートを呼び出すことができますか?あなたが提供できる例はありますか?ありがとう。

4

1 に答える 1

2

面白いシナリオ!

心配すべきいくつかの問題があります:

  • Oracleの一括インポートでは、データがどのような形式であると想定していますか?
  • DATE値とDATETIME値の正しい形式は何ですか?

実用的に(そしてOracleではなくInformixの経験に基づいて)、バルクロードの前にテーブルを切り捨てるのではなく、新しく作成されたテーブルにデータをバルクロードし(比較的時間のかかるプロセス)、古いテーブルを新着。最も速く動作するものに応じて、一連の操作を実行します。

  • 古いテーブルの名前をジャンクテーブルに変更します
  • 新しいテーブルの名前を古いテーブルに変更します

一連の「ジャンクテーブルの削除」操作が続きます。または、次のようにします。

  • 古いテーブルを削除します
  • 新しいテーブルの名前を古いテーブルに変更します

この方法で操作を行うと、「テーブルの切り捨て」の後に「テーブルのロード」が続く場合と比較して、テーブルの「ダウンタイム」が最小限に抑えられます。

OracleはSEに似ています-そのDDLステートメントは非トランザクションです(テーブルを削除し、新しいテーブルを作成してから、一連の操作全体をロールバックするトランザクションを持つことができるIDSとは異なります)。

データをエクスポートする方法は?

これは、Oracleローダーの柔軟性によって異なります。それらがInformixの標準出力フォーマット(たとえば、UNLO​​ADフォーマット)に適応できる場合、アンロード操作は簡単です。日付値がOracleによって認識されるようにするには、DBDATE環境変数を設定する必要がある場合があります。DBDATE="Y4MD-"私は' 'が受け入れられる可能性が高いと信じることができました。これは、2009年12月2日のSQL標準2009-12-02表記です。

デフォルトの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(文字列)自体に引用符が含まれている場合は堅牢ではないことです(改行によって受信側でも問題が発生する可能性があります)。これが許容できるかどうかを評価する必要があります。

于 2009-12-03T01:30:13.097 に答える