Log.log(work)

いろんな作業メモ

暗黙カーソルと明示カーソル

カーソル

カーソルには二種類あって、暗黙カーソルと明示カーソルに分かれる。

明示カーソル

明示的に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;