Oracle PL/SQLのWhere Current Ofのサンプル

Oracle PL/SQLのWhere Current Ofのサンプルです。

目次

サンプル Where Current Of
  updateする
  deleteする

Where Current Of

Where Current of カーソル名

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文で更新されます。

関連の記事

Oracle PL/SQLのcommitとrollbackと例外処理

△上に戻る