こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

SQL*Loaderで既存のレコードの更新

SQL*Loaderで既存のレコードがあったらUpdate処理を行いたいのですが
「Oracle7 Server ユーティリティ」に
SQL*Loaderは、既存レコードがNULL列であったとしてもレコードを更新しません。
既存の行を更新するには、次の手順を利用してください。

1.データを一時表にロードする
2.相関副問合わせを持つSQL言語のUPDATE文を使用する
3.一時表を削除する


とありますが、上記の1~3が具体的にどうすれば良いのか分りません・・・
1.データとは、テーブルのデータ?それともロードファイルのデータ??
  3.に削除とあるので、作成するのでしょうか??
2・これはctlファイルに記述するでいいのでしょうか??
記述の仕方は??
3.ドロップコマンドはctlに記述でよろしいのでしょうか??

などなど・・
すみません、ご教授お願いできませんか??

投稿日時 - 2007-12-06 18:37:46

QNo.3576325

困ってます

質問者が選んだベストアンサー

こんばんは。
>1.データを一時表にロードする
>2.相関副問合わせを持つSQL言語のUPDATE文を使用する
>3.一時表を削除する

以下に、私なりの解釈を記載いたします。

1.について
ここでいうデータとは、SQL*Loaderでロードをしようとしているデータの事だと思います。
ロード対象と同じテーブル定義を持つテーブルを、以下のコマンドなどを使用して、一時的に作成し、作成した一時表にSQL*Loaderでデータをロードします。
SQL>create table <任意の一時表名> as select * from <ロード対象の表> where 1=0;

以下、説明を簡略化するために、上記の
任意の一時表名をA、ロード対象の表をBとします。

2.について
ctlファイルに記述するのではなく、実際にSQLを記述して実行することだと思います。
表Aを、一致する表Bの列で、相関副問い合わせで更新します。

3.について
1で作成した、一時表を削除します。
drop table B;

総括して、SQL*Loaderには、
既存のレコードがあったら更新する機能はないので、
一時的な表を作って、その表にデータをロードし、
SQL文で更新作業を行うということだと思います。

ご参考いただければ幸いです。

投稿日時 - 2007-12-09 23:00:31

お礼

chiychiyさん

返信が遅れてすみません。。。

ctlファイルは一時表にロードのみで更新はsqlですね!!
イメージがわきました!!

ありがとうございます。丁寧な説明でとても理解しやすかったです。

投稿日時 - 2007-12-10 16:29:52

このQ&Aは役に立ちましたか?

2人が「このQ&Aが役に立った」と投票しています

回答(1)

あなたにオススメの質問