前回までのカーソルの使い方についてはコチラ
PLSQL SELECTの結果を取得する~取得結果が複数行の場合~
PLSQL カーソルを使用してデータを取得する
PLSQL パラメータ付きカーソル
PLSQL カーソル属性
カーソルには「明示カーソル」と「暗黙カーソル」の2種類があります。
明示カーソル
カーソルに名前をつけているものを明示カーソルと呼びます。
前回までのカーソルを使用したサンプルでは、以下のサンプルのようにDECLARE部でカーソルに対して名前を付けています。
DECLARE
--カーソル定義
CURSOR member_csr IS
SELECT * FROM Member;
…以下略…
暗黙カーソル
明示カーソル以外で埋め込まれたSQLが実行されるとき、Oracleによって暗黙的にカーソルが作成され実行されます。
次のコードは暗黙カーソルを使用したSELECT文、UPDATE文です。
DECLARE
membername Member.MemberName%Type;
BEGIN
--暗黙カーソルを使用したSELET文
SELECT MemberName Rank INTO membername
FROM Member
WHERE MemberId = '1';
--暗黙カーソルを使用したSELET文のLOOP
FOR rec IN (SELECT * FROM Member) LOOP
SYS.DBMS_OUTPUT.PUT_LINE(rec.MemberId || ' ' || rec.MemberName);
END LOOP;
--暗黙カーソルを使用したUPDATE文
UPDATE Member
SET MemberName = 'ishida', Rank = 'C'
WHERE MemberId = '1';
END;
この暗黙カーソルにも明示カーソルと同じく属性があります。
暗黙カーソルのカーソル名は「SQL」になり、属性値を調べるには「SQL%属性名」とします。
但しカーソル名は「SQL」しかないため、直前に実行したSQLの属性しか調べることができません。
属性 | 意味 |
FOUND | カーソルを実行した結果、該当するものがあったかどうか |
NOTFOUND | FOUNDの逆値 |
ISOPEN | カーソルが開いているかどうか暗黙カーソルでは常にfalse |
ROWCOUNT | カーソルを処理した結果、処理された行数SELECTの場合フェッチした件数 |
下記のコードでは暗黙カーソルの属性を調べています。
DECLARE
membername Member.MemberName%Type;
BEGIN
-- ■ 暗黙カーソルを使用したSELET文のカーソルFORループ ■ --
--出力結果
--ISOPEN=false
--FOUND=false
--ROWCOUNT=
FOR rec IN (SELECT * FROM Member WHERE MemberId = '1') LOOP
--ISOPEN属性の確認
IF (SQL%ISOPEN) THEN
SYS.DBMS_OUTPUT.PUT_LINE('ISOPEN=true');
ELSE
SYS.DBMS_OUTPUT.PUT_LINE('ISOPEN=false');
END IF;
--FOUND属性の確認
IF (SQL%FOUND) THEN
SYS.DBMS_OUTPUT.PUT_LINE('FOUND=true');
ELSE
SYS.DBMS_OUTPUT.PUT_LINE('FOUND=false');
END IF;
--ROWCOUNT属性の確認
SYS.DBMS_OUTPUT.PUT_LINE('ROWCOUNT=' || SQL%ROWCOUNT);
END LOOP;
-- ■ 暗黙カーソルを使用したSELET文 ■ --
--出力結果
--ISOPEN=false
--FOUND=true
--ROWCOUNT=1
SELECT MemberName INTO membername
FROM Member
WHERE MemberId = '1';
--ISOPEN属性の確認
IF (SQL%ISOPEN) THEN
SYS.DBMS_OUTPUT.PUT_LINE('ISOPEN=true');
ELSE
SYS.DBMS_OUTPUT.PUT_LINE('ISOPEN=false');
END IF;
--FOUND属性の確認
IF (SQL%FOUND) THEN
SYS.DBMS_OUTPUT.PUT_LINE('FOUND=true');
ELSE
SYS.DBMS_OUTPUT.PUT_LINE('FOUND=false');
END IF;
--ROWCOUNT属性の確認
SYS.DBMS_OUTPUT.PUT_LINE('ROWCOUNT=' || SQL%ROWCOUNT);
-- ■ 暗黙カーソルを使用したUPDATE文 ■ --
--出力結果
--ISOPEN=false
--FOUND=true
--ROWCOUNT=2
UPDATE Member
SET MemberName = 'ishida', Rank = 'C'
WHERE MemberId > '1';
--ISOPEN属性の確認
IF (SQL%ISOPEN) THEN
SYS.DBMS_OUTPUT.PUT_LINE('ISOPEN=true');
ELSE
SYS.DBMS_OUTPUT.PUT_LINE('ISOPEN=false');
END IF;
--FOUND属性の確認
IF (SQL%FOUND) THEN
SYS.DBMS_OUTPUT.PUT_LINE('FOUND=true');
ELSE
SYS.DBMS_OUTPUT.PUT_LINE('FOUND=false');
END IF;
--ROWCOUNT属性の確認
SYS.DBMS_OUTPUT.PUT_LINE('ROWCOUNT=' || SQL%ROWCOUNT);
END;
暗黙カーソルを使用したカーソルFORループでは属性が何も取れないのですね。
明示カーソルを使用したカーソルFORループでの各属性は、コチラ「
PLSQL カーソル属性 」に書いてます。
0 件のコメント:
コメントを投稿