暗黙カーソルと明示カーソル
カーソル
カーソルには二種類あって、暗黙カーソルと明示カーソルに分かれる。
明示カーソル
明示的にOPEN~CLOSEするカーソル(そのまんま)。
OPEN c_1;
FETCH c_1
INTO paramCd;
CLOSE c_1;
暗黙カーソル
明示カーソル以外のすべてのSQL処理で内部的に使用されるカーソルのこと。
"SQL"で表す。
DELETE FROM hoge; IF SQL%ROWCOUNT = 0 then ~~~ END IF
使いかた
明示カーソルは開いたままでつかうこと
- 誤
OPEN c_1; FETCH c_1 INTO param_CD; CLOSE c_1; IF c_M1%ROWCOUNT = 0 THEN --Oracle エラー /* 強制終了 */ ~~~ END IF;
CLOSEの位置を直せばOK。
- 正
OPEN c_1; FETCH c_1 INTO param_CD; --CLOSE c_1; IF c_M1%ROWCOUNT = 0 THEN /* 強制終了 */ ~~~ END IF; CLOSE c_1;
明示カーソルを使ったら暗黙はからっぽ
実際に暗黙カーソルで条件に入らなかったので、
明示カーソルと暗黙カーソルは重複しないようだ。
- 誤
OPEN c_1; -- 条件に当てはまらないので結果は0件 FETCH c_1 INTO param_CD; --条件に当てはまらないのでNULL CLOSE c_1; IF SQL%ROWCOUNT = 0 THEN --IFの中に入らない /* 強制終了 */ END IF;
上記IF文では直前の明示カーソルの結果は反映?されない。
- 正 1
明示カーソルとして使う
OPEN c_1; -- 条件に当てはまらないので結果は0件 FETCH c_1 INTO param_CD; --条件に当てはまらないのでNULL --CLOSE c_1; IF c_1%ROWCOUNT = 0 THEN /* 強制終了 */ END IF; CLOSE c_1;
- 正 2
結果を比較する
OPEN c_1; -- 条件に当てはまらないので結果は0件 FETCH c_1 INTO param_CD; --条件に当てはまらないのでNULL --CLOSE c_1; IF param_CD is NULL THEN /* 強制終了 */ END IF; CLOSE c_1;