こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

【PL/SQL】CURSOR ・・・ IS SELECT・・・FOR UPDATE が機能しない

カーソルの宣言で、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」にきちんと望む値が格納されていること、ループが正常に回り、各行にアクセスしていることは、確認済です。

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

投稿日時 - 2006-02-01 10:04:05

QNo.1935720

すぐに回答ほしいです

質問者が選んだベストアンサー

明らかにダメなところとしては・・
コミットが書いてあることですかね。


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文で書いてはダメなんでしょうかね?
(件数が多すぎる?)

投稿日時 - 2006-02-02 01:38:06

補足

原因が分かりました。

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

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

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

投稿日時 - 2006-02-02 08:42:02

お礼

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

投稿日時 - 2006-02-02 08:51:57

このQ&Aは役に立ちましたか?

4人が「このQ&Aが役に立った」と投票しています

回答(1)

あなたにオススメの質問