- ベストアンサー
PL/SQL 条件アップデートについての質問
- PL/SQLを使用して、他のテーブルを参照しながら条件に合致するレコードのみをアップデートする方法が知りたいです。
- トランTとマスタTというテーブルがあり、トランTのフィールド「店舗区分1」を前年同月に休業日が発生している店舗の「店舗区分1」に変更する方法はありますか?
- PL/SQL初心者で、このようなケースのサンプルがなかなか見つからないため、詳しい方に教えていただきたいです。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
なぜPL/SQLでやろうとしたのでしょうか? UPDATE トランT SET 店舗区分1 = 2 WHERE EXISTS ( SELECT 1 FROM マスタT WHERE トランT.取引先=マスタT.取引先 AND トランT.年月 BETWEEN SUBSTR(マスタT.開始日,1,6) AND SUBSTR(マスタT.終了日,1,6) ) ではダメですか。
その他の回答 (2)
- Siegrune
- ベストアンサー率35% (316/895)
http://www.shift-the-oracle.com/plsql/update-where-current-of.html の「WHERE CURRENT OF による UPDATE 処理」をサンプルに組んでみられては? ここの cursor cur is select id, txt from insert_sample for update; を cursor cur is select t.年月,t.店舗区分1,t.売上取引先,m.開始日,m.終了日 from トランT t,マスタT m for update of t.店舗区分; とすればよいと思います(未確認)。 この形で、t.年月とm.開始日,m.終了日を判定してもいいし(遅いし負荷が高いけど)、 このfrom句の次にwhere句でt.年月とm.開始日,m.終了日に関する条件を設定してもいい (早いし負荷が軽いのでこちらをお勧め。) 注:for update of について OF句で指定した表のSELECTしたレコードがロックされますが、OF句で指定してない表はロックされません。
- yorozu_ya
- ベストアンサー率54% (76/140)
テーブルの説明に休業日も休業日数もありませんが、 どういうことでしょう。 説明不足です。 あと、日付項目のデータ型は何でしょう。
補足
説明不足すみません。 トランTの前年同月と マスタTの開始日と終了日の間の日付がその月に該当していれば その取引先の店舗区分を変更したいということです。 また、開始終了日フィールドのデータ型はVACHAR2でyyyymmdd形式です。 よろしくお願いします。
補足
ご回答ありがとうございます。 大変参考になります。 なぜPL/SQLで実現しようとしたかというと自分の勉強のためと 当質問の内容は要件の一部であり 全処理概要は 1.日次で売上明細Tより月店別に売上集計を行いトランTにインサート 2.インサートしたデータの店舗区分の判定と更新 これらの処理をストアドプロシージャとして同DBに格納。 それを日次でShell等からcallするという仕様にしたいと思っております。 これを考えた時にメンテナンスのことを考えるPL/SQLを使用して ストアドプロシージャを作成したほうが良いかと考えました。 もっと良い方法などがあれば是非教えていただきたいです。 よろしくお願いします。