DECLARE
CURSOR EMP_CUR IS
SELECT SALARY FROM EMP
WHERE DEPT_NO = 10 FOR UPDATE;
BEGIN
FOR EMP_REC IN EMP_CUR LOOP
DBMS_OUTPUT.PUT_LINE( '変更前:' || EMP_REC.SALARY );
--SALARYが2500以下なら100を加える
IF EMP_REC.SALARY < 2500 THEN
UPDATE EMP SET SALARY = SALARY + 100
WHERE CURRENT OF EMP_CUR;
DBMS_OUTPUT.PUT_LINE( '処理件数:' || SQL%ROWCOUNT );
END IF;
DBMS_OUTPUT.PUT_LINE( '変更後:' || EMP_REC.SALARY );
END LOOP;
END;
/
上記のようなSQLで、
変更前のSALARYと変更後のSALARYを出力したいのですが、
変更前と変更後のEMP_REC.SALARYで、同じ値が出力されました。
処理の前後でSELECTする事は可能であると思いますが、
カーソル内でまとめて行いたいです。
カーソル内でIF文の前後の値を出力する事は可能でしょうか?
また、もう1点質問があります。
それは、SALARYの値が、どちらも更新された値が出力される事についてです。
例:DEPT_IDが10で、SALARYが1000の従業員が居た場合。
変更前:1100
変更後:1100
EMP_REC.SALARYの値が、DECLAREで定義されたカーソルのデータならば、
1000が出力されると考えたのですが、
どちらも更新後の値が出力されるのは何故でしょうか?
お手数をお掛け致しますが、よろしくお願い致します。
No.2
- 回答日時:
常に使える句ではないですが
UPDATE にRETURNING句を使用してみては?
お返事が遅れまして申し訳ありません。
RETURNING句というものがあったのですね。
初めて知りました。
そちらを利用したところ、
思ったとおりの結果が得られました。
ご回答ありがとうございました。
No.1ベストアンサー
- 回答日時:
>処理の前後でSELECTする事は可能であると思いますが、
>カーソル内でまとめて行いたいです。
>カーソル内でIF文の前後の値を出力する事は可能でしょうか?
カーソルでselectした結果に対しUpdate~where current of カーソル;
を実行しても、既にフェッチ済みの内容が変わることは無いので、
再度selectしない事には変更後の内容は抽出できません。
二度読みが嫌であるならカーソルで取得したものを変数に入れて変数で操作したほうがいいのかもしれません。
>どちらも更新後の値が出力されるのは何故でしょうか?
私の環境で確認してみましたが、両方とも古い値でしたよ?
2回実行してませんか?
お返事が遅れまして申し訳ありません。
やはり無理なのですね。
実行結果については、見間違いなのか、
勘違いなのか・・・原因はハッキリしませんが、
フェッチ済の~というお話を元に考えると、
なんらかの勘違いをしていたものと思われます。
お騒がせして申し訳ありません。
ご回答ありがとうございました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- その他(プログラミング・Web制作) pythonリストの特定の値を表示htmlで表示できない 2 2022/05/14 05:48
- Access(アクセス) Access の SetFocus について教えてください 5 2022/08/04 07:32
- Visual Basic(VBA) 【Excel VBA】自動メール送信の機能追加 5 2022/09/29 12:53
- PHP 重複を防ぐ記述について教えて下さい。 3 2023/04/03 14:35
- Visual Basic(VBA) 3つのプロシージャをまとめたら実行時エラー発生で対応不能 6 2022/05/17 01:47
- Visual Basic(VBA) VBAのユーザーフォームのテキストボックスに入力制限をしたい 6 2022/11/15 08:28
- Visual Basic(VBA) 【追加】ファイルを閉じてダイアログで保存した時だけ処理の実行をする 3 2022/03/23 15:43
- Oracle SQL update方法 2 2022/06/22 14:07
- Visual Basic(VBA) VBAの繰り返し処理について教えてください。 3 2022/08/02 13:21
- その他(プログラミング・Web制作) pythonのグローバル変数 2 2022/11/25 18:02
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
PL/SQLカーソルの2重FORループ...
-
PL/SQLでのSQL文法
-
Texの枠囲み調節
-
カーソル定義での条件分岐
-
自動連番でカラムを更新したい
-
文字列の置換
-
PL/SQL カーソルのFROM句にカー...
-
Accessのマクロでモジュールを...
-
Access VBAで行ラベルが定義さ...
-
likeとsubstrの使いわけについて
-
SQLサーバで和暦から西暦に変換...
-
Statement ignored というエラー
-
sqlplusでヘッダーが付かない
-
Accessの数値から時間に変換す...
-
或るプロシージャの呼び出し元判定
-
エクセルVBAでUserFormを起動し...
-
全角空白のTRIMができない...
-
SQLで部分的にGROUP BYしたいとき
-
OutlookVBAで作成したマクロに...
-
WHERE句の実行順序
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
PL/SQLカーソルの2重FORループ...
-
PL/SQLでのSQL文法
-
Texの枠囲み調節
-
カーソル定義での条件分岐
-
ORA-00904:無効な識別子の回避...
-
PL/SQLのOPEN cursor_name FOR...
-
mysqlのcase文で複数の条件を指...
-
自動連番でカラムを更新したい
-
カーソルフェッチにて、最終レ...
-
PL/SQL カーソルのFROM句にカー...
-
PL/SQLにて、マスタから取得し...
-
カーソルループ内部でログを出力
-
【PL/SQL】LOOPした動的SQLにて...
-
カーソルで集合関数を使った場...
-
ROW_NUMBER BY PL/SQL
-
T-SQLのカーソルで
-
PL/SQLでの参照
-
PL/SQLのカーソルについて
-
PL/SQLでカーソルを指定する方法
-
Accessのマクロでモジュールを...
おすすめ情報