
カーソルの宣言で、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」にきちんと望む値が格納されていること、ループが正常に回り、各行にアクセスしていることは、確認済です。
原因が分かる方がいらっしゃいましたらご教授下さい。
また、質問の内容に不備があるようでしたら、ご指摘下さい。
以上、どうかよろしくお願い致します。
No.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で扱うテーブルは、かなり大量のデータを保持します。
その為、速度性とキャッシュ領域不足エラー解消を求めて、このような形で組んでみました。
korochanさん、回答ありがとうございました。
原因は別にありましたが、例に挙げて頂いたSQLは、
考え付かなかったものですので、とても勉強になりました。
今後もよろしくお願いします。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- MySQL 参考書に従って入力したつもりでしたが、最後はエラーがでました。 1 2022/09/28 03:45
- Oracle SQL update方法 2 2022/06/22 14:07
- 英語 L-PRF can be obtained by manual or automated metho 1 2022/04/08 09:39
- その他(プログラミング・Web制作) pythonでDBのカラム名で取得したオブジェクトの値を表示したい 1 2022/05/13 03:41
- その他(プログラミング・Web制作) python fbprophetについて 1 2022/09/29 19:44
- Visual Basic(VBA) 【Excel VBA】自動メール送信の機能追加 5 2022/09/29 12:53
- 英語 英文の経済記事ですが、 4 2022/07/23 18:01
- その他(プログラミング・Web制作) pythonのグローバル変数 2 2022/11/25 18:02
- 公的扶助・生活保護 保証人? 1 2022/05/17 22:42
- 英語 この英語の問題が分かりません 3 2023/04/22 20:19
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
PL/SQLカーソルの2重FORループ...
-
カーソル定義での条件分岐
-
Accessのマクロでモジュールを...
-
Statement ignored というエラー
-
sqlplusでヘッダーが付かない
-
likeとsubstrの使いわけについて
-
OutlookVBAで作成したマクロに...
-
キャッシュを使わずにSELECTを...
-
ODBCリンクの際にACCESSでは読...
-
エクセルVBAでUserFormを起動し...
-
Excel VBAで「プログラム実行」...
-
時間項目を60進数から10進数へ...
-
oracle 文字列 01:45 を時間に...
-
【Excel VBA】 WorksheetやRa...
-
見たことのない形式で日付が表...
-
Access VBAで行ラベルが定義さ...
-
毎日決まった時間にSQLを実...
-
ACCESS2007インポート時の空白...
-
SQLserver算術オーバーフロ...
-
パッケージ内のファンクション...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
PL/SQLカーソルの2重FORループ...
-
PL/SQLでのSQL文法
-
Texの枠囲み調節
-
カーソル定義での条件分岐
-
カーソルで集合関数を使った場...
-
自動連番でカラムを更新したい
-
[Oracle9i]PL/SQLでFETCHしても...
-
ROW_NUMBER BY PL/SQL
-
動的なSQLからカーソルを返す。
-
カーソルフェッチにて、最終レ...
-
PL/SQLのOPEN cursor_name FOR...
-
ループカウンタの値
-
PL/SQL カーソルのFROM句にカー...
-
【PL/SQL】CURSOR ・・・ IS SE...
-
PL/SQLで
-
PL/SQLにて、マスタから取得し...
-
カーソルループ内部でログを出力
-
ACCESS VBAでループ中に制御を...
-
PL/SQL)Functionの引数(文字列...
-
指定した時間を除くためのテー...
おすすめ情報