2015年11月26日木曜日

PLSQL 暗黙カーソル

前回までのカーソルの使い方についてはコチラ
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カーソルを実行した結果、該当するものがあったかどうか
NOTFOUNDFOUNDの逆値
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 件のコメント: