dポイントプレゼントキャンペーン実施中!

Oracleのプロシージャについて教えてください。
現在、Aテーブル(カラム1、カラム2、カラム3、カラム4):件数40万件
    Bテーブル(カラムA、カラムB、カラムC):件数50件

と言うテーブルがあります。
この中でデータ置換を行う必要があり、

Aテーブルのカラム2とBテーブルのカラムBが一致したらAテーブルの
カラム3にBテーブルのカラムCで更新するプロシージャを作成しています。
通常のUpdate文で3000件単位でCommitを切るようにしていますが時間がかかります。
皆さんはこういう場合どういう手法でやられていますか?
ご教授ください。

ちなみに、
サーバOS:Windows2008SERVER
クライアントOS:Windows7
Oracle11

です。

A 回答 (2件)

こんな感じではだめですか?


begin
loop
update テーブルA set カラム3 = ( select カラムc from B where テーブルA.カラム2=テーブルB.カラムB )
where exists ( select 1 from テーブルB where テーブルA.カラム2=テーブルB.カラムB )
and rownum <= 5000;
commit;
exit when (sql%rowcount < 5000);
end loop;
end;
/
    • good
    • 0
この回答へのお礼

ご丁寧に記載して頂きありがとうございます。
5000件ずつで上記のやり方もあるんですね。

勉強になります。

試してみたいと思います、ありがとうございます。

お礼日時:2011/08/29 10:21

update A


set Col3=(select ColC from B where Col2=ColB)
where exist ( select 1 from B where Col2=ColB )
;
のような1文で処理したらダメなんですかね?

索引の有無や更新の対象量など、不明な点が多いので、
何が合理的な方法なのか答えにくいんですが。

この回答への補足

更新対象は40万件全てになります。

補足日時:2011/08/29 10:18
    • good
    • 0
この回答へのお礼

ありがとうございます。
Loopdで取得した情報を基にして、一度Selectを切って取得した値で
UpDateの処理を行っていました。
教えて頂いた方法で試してみます。

お礼日時:2011/08/29 10:19

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!