- PR -

For カーソル文

1
投稿者投稿内容
やましP
会議室デビュー日: 2007/11/18
投稿数: 2
投稿日時: 2007-11-18 20:26
よろしくお願い致します。

・PL/SQL文以下のような仕様の機能を追加しました。
カーソルからFETCHして取り出した値をマスタテーブル2つとチェックを
行い、マッチするデータがあれば、値を更新する。

・FORカーソル文で以下のように組んでみました。

FOR l_b002_rec IN cl_cursor_b001 LOOP
 IF (l_001_rec.L_KBN || l_001_rec.D_KBN)
  = ( l_b001_rec.OLD_L_KBN || l_b001_rec.OLD_D_KBN)THEN
l_match_flg := 1; -- マッチデータ有
l_b001_rec.L_KBN := l_b001_rec.L_KBN;
l_b001_rec.D_KBN := l_b001_rec.D_KBN;
 END IF;
END LOOP;

-- マッチするデータがなかった場合に行う
IF l_match_flg = 0 THEN
 FOR l_b003_rec IN cl_cursor_l_b002 LOOP
  IF (l_001_rec.L_KBN) = (l_b002_rec.OLD_L_KBN) THEN
   l_match_flg := 1;   -- マッチデータ有
   l_b001_rec.L_KBN := l_b002_rec.L_KBN;
   l_b001_rec.D_KBN := l_b002_rec.D_KBN;
  END IF;
 END LOOP;
END IF;

結果がマスタのl_b001_recのデータとマッチする場合は
うまく値の更新ができましたが、その他の値に関しては、
次のl_b002_recの値を見に行って、いないのか?
値が更新されません。

どこが間違っているのか
ご教示下さい。

またこんなのじゃ分らないとか、ご指摘も何なりと
言ってくだされば有り難いです。

よろしくお願い致します。
99ri
大ベテラン
会議室デビュー日: 2006/09/09
投稿数: 129
投稿日時: 2007-11-18 21:54
ループ変数l_b002_recはFORループ内でのみ有効です
FOR l_b002_rec IN cl_cursor_b001 LOOP
やましP
会議室デビュー日: 2007/11/18
投稿数: 2
投稿日時: 2007-11-18 22:54
99riさん!早速のご指摘ありがとうございます。

少し投稿したソースに間違っていましたので、修正しました。

FOR l_m001_rec IN cl_cursor_b001v LOOP
 IF (l_001_rec.LARGE_KBN || l_001_rec.DETAILS_KBN)
  = ( l_m001_rec.OLD_LARGE_KBN || l_m001_rec.OLD_DETAILS_KBN)THEN
   l_match_flg := 1; -- マッチするデータ有
   l_001_rec.LARGE_KBN := l_m001_rec.LARGE_KBN;
   l_001_rec.DETAILS_KBN := l_m001_rec.DETAILS_KBN;
 END IF;
END LOOP;

-- マスタl_m002_recとマッチするデータがなかった場合
IF l_match_flg = 0 THEN
 FOR l_m002_rec IN cl_cursor_b002v LOOP
  IF (l_001_rec.LARGE_KBN) = (l_m002_rec.OLD_LARGE_KBN) THEN
   l_match_flg := 1; -- マッチするデータ有
   l_001_rec.LARGE_KBN := l_m002_rec.LARGE_KBN;
   l_001_rec.DETAILS_KBN := l_m002_rec.DETAILS_KBN;
  END IF;
 END LOOP;
END IF;

・l_001_recの'L_KBN','D_KBN'がマスタl_m001_recの'OLD_L_KBN'
'OLD_D_KBN'のデータとマッチしたら、l_m001の'L_KBN','D_KBN'
 のデータをl_001_recの'L_KBN','D_KBN'に更新します。
・l_m001_recのデータとマッチしなかったら、マスタl_m002_recの
'OLD_L_KBN'とデータがマッチしたら、l_001_recの'L_KBN','D_KBN'
 にl_m002の'L_KBN','D_KBN'のデータを更新します。

以上のようにしたいのです。

よろしくお願いします。

99ri
大ベテラン
会議室デビュー日: 2006/09/09
投稿数: 129
投稿日時: 2007-11-19 22:09
投稿者はもう見ていないと思いますが

PL/SQLの変数は数値型でも初期値はNULLです
l_match_flgに0を代入して初期化してください

nullと0の比較結果はnullです

提示内容ではl_001_recの'L_KBN','D_KBN'に更新します
と書いていますが
l_001_recに代入しているのでl_001_recの'L_KBN','D_KBN'を更新する
ということですよね
1

スキルアップ/キャリアアップ(JOB@IT)