・カーソルとはSELECTの結果を行単位で処理する道具であり、常に位置の情報を保持している。
・カーソルの使用は、変数宣言・OPENという手順となる。
・カーソルからデータを取得するには、FETCH文を使用する。FETCHにより、カーソルの位置は1つ進む。
・FETCH直後、FOUNDという特殊な変数にFETCHの結果(成功はTRUE、失敗はFALSE)が格納される。
・FETCHの失敗とは、全ての行を処理した後、すでにカーソルの位置が有効でない場合である。
・カーソルは非束縛カーソルと束縛カーソルの2種類がある。
変数宣言時ではなく、OPEN時にSELECT文と対応付ける。
ひとつの変数を使いまわし、複数のSELECT文と対応付けることができる。
DECLARE カーソル変数名 REFCURSOR; ... BEGIN OPEN カーソル変数名 FOR SELECT文; ... CLOSE カーソル変数名; END;
今回、以前作成した生徒テーブル(student)で、同姓同名の生徒がいるかどうか判断する関数を作成する。
次のSQLをファイルとして作成。(cursor091.sql)
上記のSQLを実行し、関数自体を定義する。
oddtbs=> \i cursor091.sql
CREATE FUNCTION
関数を使用する。
oddtbs=> select cursor091();
cursor091
-----------
f
(1 row)
同姓同名の生徒がいないので、実行結果がFALSEになった。
ある生徒と同姓同名の生徒を追加する。
oddtbs=> insert into student values(2, 3, 7, '北川陽子', 2, 'A', 70);
INSERT 0 1
再度関数実行
oddtbs=> select cursor091();
cursor091
-----------
t
(1 row)
今度は同姓同名の生徒がいるので、実行結果がTRUEになった。
OPEN時ではなく、変数宣言時にSELECT文と対応付ける。
ひとつの変数を使いまわし、複数のSELECT文と対応付けることはできない。
DECLARE カーソル変数名 CURSOR FOR SELECT文; ... BEGIN OPEN カーソル変数名; ... CLOSE カーソル変数名; END;
上記と同じことを束縛カーソルで行う。
次のSQLをファイルとして作成。(cursor092.sql)
上記のSQLを実行し、関数自体を定義する。
oddtbs=> \i cursor092.sql
CREATE FUNCTION
関数を使用する。
oddtbs=> select cursor092();
cursor092
-----------
t
(1 row)
同姓同名の生徒がいるので、実行結果がTRUEになった。
先ほど追加した生徒を削除する。
oddtbs=> delete from student where (gnum, cnum, num) = (2, 3, 7);
DELETE 1
再度関数実行
oddtbs=> select cursor092();
cursor092
-----------
f
(1 row)
今度は同姓同名の生徒がいないので、実行結果がFALSEになった。