プロが教える店舗&オフィスのセキュリティ対策術

カーソルの宣言で、FOR UPDATE を指定しているのに、
WHERE CURRENT OF での更新が効きません。
エラーは発生せず、全件分ループも回っているのですが、値がまったく書き換わっていません。

Oracle Ver. = Oracle8i Release 8.1.6.0.0

CREATE OR REPLACE FUNCTION TEST_FNC
RETURN BOOLEAN
IS
todofu_cd NUMBER(2) := 0;
strSQL VARCHAR2(2000) := '';
CURSOR cur IS SELECT * FROM TEST_TBL FOR UPDATE;
BEGIN

For cur_rec In cur Loop

DECLARE
BEGIN
SELECT TODOFU_CD INTO todofu_cd
FROM M_POST
WHERE POST_NO = cur_rec.POST_NO;
EXCEPTION
When NO_DATA_FOUND Then
todofu_cd := 0;
END;

UPDATE TEST_TBL
SET TODOFU_CD = todofu_cd
WHERE CURRENT OF cur;
COMMIT;

End Loop;

EXCEPTION
 (省略)
END;
/

「CURSOR cur IS SELECT * FROM TEST_TBL FOR UPDATE;」の部分は、
「CURSOR cur IS SELECT POST_NO, TODOFU_CD FROM TEST_TBL FOR UPDATE OF TODOFU_CD;
」と記述しても結果は同じでした。

上書きしようとしている値である「todofu_cd」にきちんと望む値が格納されていること、ループが正常に回り、各行にアクセスしていることは、確認済です。

原因が分かる方がいらっしゃいましたらご教授下さい。
また、質問の内容に不備があるようでしたら、ご指摘下さい。
以上、どうかよろしくお願い致します。

A 回答 (1件)

明らかにダメなところとしては・・


コミットが書いてあることですかね。


update TEST_TBL x
set TODOFU_CD=(select y.TODOFU_CD from M_POST y where y.POST_NO=x.POST_NO);
update TEST_TBL set TODOFU_CD=0 where TODOFU_CD is null;

の2文で書いてはダメなんでしょうかね?
(件数が多すぎる?)

この回答への補足

原因が分かりました。

変数todofu_cdと、テーブルの列名TODOFU_CDが同じであったことです。
これを訂正したら、正常に更新されました。

投稿してすぐに気づいたのですが、1件も回答のない状態での、質問者からの追記方法が分からず、そのままになってしまいました。すいませんでしたm(_ _)m

あと、korochanさんのご指摘に関してですが、
このPGMで扱うテーブルは、かなり大量のデータを保持します。
その為、速度性とキャッシュ領域不足エラー解消を求めて、このような形で組んでみました。

補足日時:2006/02/02 08:42
    • good
    • 0
この回答へのお礼

korochanさん、回答ありがとうございました。
原因は別にありましたが、例に挙げて頂いたSQLは、
考え付かなかったものですので、とても勉強になりました。
今後もよろしくお願いします。

お礼日時:2006/02/02 08:51

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

関連するカテゴリからQ&Aを探す