カーソル

・カーソルとはSELECTの結果を行単位で処理する道具であり、常に位置の情報を保持している。
・カーソルの使用は、変数宣言・OPENという手順となる。
・カーソルからデータを取得するには、FETCH文を使用する。FETCHにより、カーソルの位置は1つ進む。
・FETCH直後、FOUNDという特殊な変数にFETCHの結果(成功はTRUE、失敗はFALSE)が格納される。
・FETCHの失敗とは、全ての行を処理した後、すでにカーソルの位置が有効でない場合である。
・カーソルは非束縛カーソルと束縛カーソルの2種類がある。

非束縛カーソル

変数宣言時ではなく、OPEN時にSELECT文と対応付ける。
ひとつの変数を使いまわし、複数のSELECT文と対応付けることができる。

DECLARE
    カーソル変数名 REFCURSOR;
    ...
BEGIN
    OPEN カーソル変数名 FOR SELECT文;
    ...
    CLOSE カーソル変数名;
END;

今回、以前作成した生徒テーブル(student)で、同姓同名の生徒がいるかどうか判断する関数を作成する。

  1. 次のSQLをファイルとして作成。(cursor091.sql)

    
    
  2. 上記のSQLを実行し、関数自体を定義する。

    oddtbs=> \i cursor091.sql
    CREATE FUNCTION
    
  3. 関数を使用する。

    oddtbs=> select cursor091();
     cursor091
    -----------
     f
    (1 row)
    
    同姓同名の生徒がいないので、実行結果がFALSEになった。
    
  4. ある生徒と同姓同名の生徒を追加する。

    oddtbs=> insert into student values(2, 3, 7, '北川陽子', 2, 'A', 70);
    INSERT 0 1
    
  5. 再度関数実行

    oddtbs=> select cursor091();
     cursor091
    -----------
     t
    (1 row)
    
    今度は同姓同名の生徒がいるので、実行結果がTRUEになった。
    

束縛カーソル

OPEN時ではなく、変数宣言時にSELECT文と対応付ける。
ひとつの変数を使いまわし、複数のSELECT文と対応付けることはできない。

DECLARE
    カーソル変数名 CURSOR FOR SELECT文;
    ...
BEGIN
    OPEN カーソル変数名;
    ...
    CLOSE カーソル変数名;
END;

上記と同じことを束縛カーソルで行う。

  1. 次のSQLをファイルとして作成。(cursor092.sql)

    
    
  2. 上記のSQLを実行し、関数自体を定義する。

    oddtbs=> \i cursor092.sql
    CREATE FUNCTION
    
  3. 関数を使用する。

    oddtbs=> select cursor092();
     cursor092
    -----------
     t
    (1 row)
    
    同姓同名の生徒がいるので、実行結果がTRUEになった。
    
  4. 先ほど追加した生徒を削除する。

    oddtbs=> delete from student where (gnum, cnum, num) = (2, 3, 7);
    DELETE 1
    
  5. 再度関数実行

    oddtbs=> select cursor092();
     cursor092
    -----------
     f
    (1 row)
    
    今度は同姓同名の生徒がいないので、実行結果がFALSEになった。