Oracle PL/SQLのWhere Current Ofのサンプルです。
目次
サンプル | Where Current Of |
Where Current Ofでupdateする | |
Where Current Ofで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
Where Current Ofでupdateする
Whereの条件にCurrent Ofを指定してupdateするサンプルです。
create or replace procedure TEST1
IS
CURSOR cur1 IS
SELECT name,romaji FROM employee
WHERE romaji like '%a%'
FOR UPDATE;
employee_rec cur1%ROWTYPE;
BEGIN
OPEN cur1;
LOOP
FETCH cur1 INTO employee_rec;
EXIT WHEN cur1%NOTFOUND;
UPDATE employee
SET name2 = employee_rec.name,
romaji2 = employee_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文で更新されます。
Where Current Ofでdeleteする
Whereの条件にCurrent Ofを指定してdeleteするサンプルです。
create or replace procedure TEST1
IS
CURSOR cur1 IS
SELECT name,romaji FROM employee
WHERE romaji like '%a%'
FOR UPDATE;
employee_rec cur1%ROWTYPE;
BEGIN
OPEN cur1;
LOOP
FETCH cur1 INTO employee_rec;
EXIT WHEN cur1%NOTFOUND;
Delete employee
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を使用するときは必須です。
15行目は、whereの条件にcurrent of カーソルを指定しています。
select文で取得した1行ごとにdelete文で更新されます。
関連の記事