アプリ版:「スタンプのみでお礼する」機能のリリースについて

PL/SQLを使用して、条件に合致するレコードのみをアップデートしようとした場合
この条件が他のテーブルを参照しなければいけない時どのようなロジックで実現できるでしょうか?
例えば下記のようなアップデート対象テーブルがあります。

トランT
取引先| 年月 |店舗区分1 |売上
 AAA   201105     1     10000

マスタT
取引先| 開始日 | 終了日
 AAA   20100501  20110608

トランTは月別店舗別の売上を管理しているテーブルで
マスタTは店舗の休業日数を管理いているマスタテーブルになります。
更新を行いたいのはトランTのフィールド「店舗区分1」でその条件は
前年同月に休業日が発生している店舗の「店舗区分1」を'2'に変更したい場合どのようにすれば
これを実現できるでしょうか?
やり方は複数あると思うのですがPL/SQLで実現できればと思っています。
しかし、PL/SQL初心者の為これに必要なコマンドや関数などがわかりません。
調べてみてもこのようなケースのサンプルなどが無く困っています。

どなたか詳しい方がいればご教示頂きたく存じます。
よろしくお願いします。

A 回答 (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) )

ではダメですか。

この回答への補足

ご回答ありがとうございます。
大変参考になります。
なぜPL/SQLで実現しようとしたかというと自分の勉強のためと
当質問の内容は要件の一部であり
全処理概要は
1.日次で売上明細Tより月店別に売上集計を行いトランTにインサート
2.インサートしたデータの店舗区分の判定と更新
これらの処理をストアドプロシージャとして同DBに格納。
それを日次でShell等からcallするという仕様にしたいと思っております。
これを考えた時にメンテナンスのことを考えるPL/SQLを使用して
ストアドプロシージャを作成したほうが良いかと考えました。
もっと良い方法などがあれば是非教えていただきたいです。
よろしくお願いします。

補足日時:2011/06/10 12:16
    • good
    • 0

http://www.shift-the-oracle.com/plsql/update-whe …
の「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句で指定してない表はロックされません。
    • good
    • 0

テーブルの説明に休業日も休業日数もありませんが、


どういうことでしょう。
説明不足です。
あと、日付項目のデータ型は何でしょう。

この回答への補足

説明不足すみません。
トランTの前年同月と
マスタTの開始日と終了日の間の日付がその月に該当していれば
その取引先の店舗区分を変更したいということです。
また、開始終了日フィールドのデータ型はVACHAR2でyyyymmdd形式です。
よろしくお願いします。

補足日時:2011/06/10 10:22
    • good
    • 0

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