- PR -

PL/SQL 更新処理について

1
投稿者投稿内容
ksally
会議室デビュー日: 2008/09/17
投稿数: 1
投稿日時: 2008-09-17 16:28
Oracle9i使用しています。

TMP_A (一時ファイル)
ITEM_CD PALE_NR
----------------------
A0001 0
A0002 0
A0005 0

一時ファイルのPALE_NR にマスタ値を設定するパッケージを作っています。
M_ITEM (商品マスタ)
ITEM_CD PALE_NR
--------------------
A0001 50
A0002 40
A0003 80
A0004 20
A0005 100

PROCEDURE AAA
IS
PROGRAM_ID CONSTANT CHAR(30) := 'ARRIVE.AAA';
CURSOR curTarget IS
SELECT
ITEM_CD
FROM
TMP_A
WHERE
PALE_NR <> 0
GROUP BY
ITEM_CD;
rowTarget curTarget%ROWTYPE;
CURSOR curMitem(
ItemCd M_ITEM.ITEM_CD%TYPE
)IS
SELECT
PALE_NR
FROM
M_ITEM
WHERE
ITEM_CD = ItemCd;
rowMitem curMitem%ROWTYPE;
BEGIN
PLOG.INFO(logCtx, PROGRAM_ID || ' START');
OPEN curTarget;
LOOP
FETCH curTarget INTO rowTarget;
OPEN curMitem(rowTarget.ITEM_CD);
EXIT WHEN curTarget%NOTFOUND;
UPDATE
TMP_A
SET
PALE_NR = rowMitem.PALE_NR
WHERE
ITEM_CD = rowTarget.ITEM_CD;
END LOOP;
CLOSE curTarget;
CLOSE curMitem;
PLOG.INFO(logCtx, PROGRAM_ID || ' END');
EXCEPTION
〜・・・・・

ITEM_CD をキーとして、PALE_NRをマスタ値で更新したいのですが
更新されず、値は 0 のままになっています。。。
LOOPの入れ子が必要?? 行き詰まっておりますので
ヒントを頂けるとありがたいです。宜しくお願い致します。

[ メッセージ編集済み 編集者: ksally 編集日時 2008-09-17 16:30 ]
ごー
ベテラン
会議室デビュー日: 2003/08/29
投稿数: 51
お住まい・勤務地: いるかホテル
投稿日時: 2008-09-17 17:06
こんにちは。


DBMS_OUTPUTやデバッガを利用してどこが原因箇所か(ループに入ってきているか or 値は正しいか etc...)を見つけることをお勧めします。
_________________
King
ぬし
会議室デビュー日: 2008/06/20
投稿数: 284
投稿日時: 2008-09-17 17:32
引用:
TMP_A (一時ファイル)
ITEM_CD PALE_NR
----------------------
A0001 0
A0002 0
A0005 0


に対して

引用:
FROM
TMP_A
WHERE
PALE_NR <> 0


という条件ではそもそも1件も該当レコードが無いのでは?

他にも

引用:
FETCH curTarget INTO rowTarget;
OPEN curMitem(rowTarget.ITEM_CD);
EXIT WHEN curTarget%NOTFOUND;


ではなく

FETCH curTarget INTO rowTarget;
EXIT WHEN curTarget%NOTFOUND;
OPEN curMitem(rowTarget.ITEM_CD);

という順番が正しいのでは?

そもそもカーソル2つもいらないような・・・。
よっしー
大ベテラン
会議室デビュー日: 2007/05/17
投稿数: 143
投稿日時: 2008-09-17 17:55
よくみてませんが、UPDATE文じゃだめなんですか?
コード:
UPDATE
    TMP_A
SET
    PALE_NR = m.M_ITEM 
FROM
    TMP_A a
INNER JOIN
    M_ITEM m
    ON
        a.ITEM_CD = m.ITEM_CD

1

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