Oracle PL/SQLのWhere Current Ofのサンプルです。
目次
サンプル | Where Current Of |
updateする | |
deleteする |
Where Current Of
Where Current of カーソル名 |
- selectのfor updateで取得したカーソルの現在の行をupdateやdeleteする際に使用します。
- for updateがない場合はエラーになります。
- currentは現在という意味です。「where カーソルの現在行」になります。
- 以下は、OracleのCURRENT OF句のリンクです。
https://docs.oracle.com/cd/E57425_01/121/LNPCC/GUID-CB61E704-AA77-4F5F-BF67-A3E4F58C63C6.htm
updateする
Where Current Ofでupdateするサンプルです。
create or replace procedure TEST1
IS
CURSOR cur1 IS
SELECT name,romaji FROM SYAIN
WHERE romaji like '%a%'
FOR UPDATE;
syain_rec cur1%ROWTYPE;
BEGIN
OPEN cur1;
LOOP
FETCH cur1 INTO syain_rec;
EXIT WHEN cur1%NOTFOUND;
UPDATE SYAIN
SET name_copy = syain_rec.name,
romaji_copy = syain_rec.romaji
WHERE CURRENT OF cur1;
END LOOP;
CLOSE cur1;
COMMIT;
EXCEPTION
WHEN OTHERS THEN
dbms_output.put_line('SQLCODE = ' || SQLCODE);
dbms_output.put_line('SQLERRM = ' || SQLERRM);
ROLLBACK;
END;
3行目からはselect文のカーソルです。
6行目は、FOR UPDATEをつけています。WHERE CURRENT OFを使用するときは必須です。
11行目は、Fetchでカーソルからレコードを取得しています。
12行目は、カーソルのデータがない場合はループを終了します。
17行目は、whereの条件にcurrent of カーソルを指定しています。
select文で取得した1行ごとにupdate文で更新されます。
deleteする
Where Current Ofでdeleteするサンプルです。
create or replace procedure TEST1
IS
CURSOR cur1 IS
SELECT name,romaji FROM SYAIN
WHERE romaji like '%a%'
FOR UPDATE;
syain_rec cur1%ROWTYPE;
BEGIN
OPEN cur1;
LOOP
FETCH cur1 INTO syain_rec;
EXIT WHEN cur1%NOTFOUND;
Delete SYAIN
WHERE CURRENT OF cur1;
END LOOP;
CLOSE cur1;
COMMIT;
EXCEPTION
WHEN OTHERS THEN
dbms_output.put_line('SQLCODE = ' || SQLCODE);
dbms_output.put_line('SQLERRM = ' || SQLERRM);
ROLLBACK;
END;
3行目からはselect文のカーソルです。
6行目は、FOR UPDATEをつけています。WHERE CURRENT OFを使用するときは必須です。
17行目は、whereの条件にcurrent of カーソルを指定しています。
select文で取得した1行ごとにdelete文で更新されます。
関連の記事