質問: SQL*Loaderを使ってデータをインポートするのですが、既存データが存在するテーブルにインポートするため、実行前に、条件に一致する一部のデータを削除します。 ですが、SQL*Loaderでインポートが失敗した際には、元に戻したいと思っています。 そういう場合に、SQL*PlusからDELETEのSQL文を実行してから、SQL*Loaderを起動してインポートするとなると、SQL*Plusから抜けた時点でCOMMITされてしまいますよね?そのためSQL*LoaderでインポートがエラーになってROLLBACKされても、削除されたデータは元に戻らないですよね・・・。 全件削除なら、CTLファイル内でREPLACEを指定してインポートするのですが・・・ データの一部削除とSQL*Loaderでのインポートを一連の処理として、エラーの際にはROLLBACKさせられる方法はありますでしょうか? よろしくお願いします。
回答: もしかして 如何なる時でも、テーブルは新・旧いずれかの参照が出来る。 新を参照するのは、全件正常の場合のみ。 というのを考えているのですか? そうであるなら、REPLACEを指定する方法では無理です。 #1で書かれた方法では無理です。 考えやすいのは、2つのテーブルとビュー(またはシノニム)を使う方法でしょうか。 ・テーブルを2つ用意する(例えば、AとB) ・SQL*LOADERで、Bへロードする。 ・ロード正常なら、ビューの参照先をAからBへ変更。 次回のロードでは ・SQL*LOADERで、Aへロードする。 ・ロード正常なら、ビューの参照先をBからAへ変更。 参照する人は、ビューを参照する。 ビューの定義を切り替える瞬間だけが微妙ですが、 基本的にDMLでなく、DDL側が弾かれるハズですので 大丈夫でしょう。 注意がいるとすれば、ビューに依存するようなストアドやビューは、 切り替えの瞬間に、invalid状態になり、リコンパイルが必要に なります。 ストアドなら、どちらを参照すべきか考えて、テーブルを見るようにすれば良いと思います。 依存ビューもやめることは可能だと思いますし、そのビュー定義を同時に変更しても 良いと思います。