2015年11月26日木曜日

PLSQL カーソル属性

前回までのカーソルの使い方についてはコチラ
PLSQL SELECTの結果を取得する~取得結果が複数行の場合~
PLSQL カーソルを使用してデータを取得する
PLSQL パラメータ付きカーソル

今回はカーソルの属性についてです。

カーソルには下記の表のような属性があります。
「カーソル名%属性名」とすることで、属性の値をを取得できます。
属性意味
FOUNDカーソルを実行した結果、該当するものがあったかどうか
NOTFOUNDFOUNDの逆値
ISOPENカーソルが開いているかどうか
ROWCOUNTカーソルを処理した結果、処理された行数
SELECTの場合フェッチした件数

カーソル属性を確認するために、複数件の結果を返すSELECT文で各属性を出力するコードを実行してみました。

DECLARE
   CURSOR cur IS 
       SELECT * FROM Member;
       
   rec cur%Rowtype;
BEGIN
    --カーソル状態出力
    If (cur%ISOPEN) THEN
        SYS.DBMS_OUTPUT.PUT_LINE('カーソルオープン前:ISOPEN=true');
    ELSE
         SYS.DBMS_OUTPUT.PUT_LINE('カーソルオープン前:ISOPEN=false');   
    END IF;
    
    --カーソルオープン
    OPEN cur;
    
    --カーソル状態出力
    If (cur%ISOPEN) THEN
        SYS.DBMS_OUTPUT.PUT_LINE('カーソルオープン後:ISOPEN=true');
    ELSE
         SYS.DBMS_OUTPUT.PUT_LINE('カーソルオープン後:ISOPEN=false');   
    END IF;
    
    
    LOOP
        FETCH cur INTO rec;  
        If (cur%NOTFOUND) THEN
            SYS.DBMS_OUTPUT.PUT_LINE('NOTFOUND = true');  
            EXIT;
        END IF;
        
        SYS.DBMS_OUTPUT.PUT_LINE('フェッチした件数:ROWCOUNT=' || cur%ROWCOUNT);   
        SYS.DBMS_OUTPUT.PUT_LINE(rec.MemberId || ' ' || rec.MemberName);      
    END LOOP;
    

    --カーソルクローズ
    CLOSE cur;

    --カーソル状態出力
    If (cur%ISOPEN) THEN
        SYS.DBMS_OUTPUT.PUT_LINE('カーソルクローズ後:ISOPEN=true');
    ELSE
         SYS.DBMS_OUTPUT.PUT_LINE('カーソルクローズ後:ISOPEN=false');   
    END IF;
END;
出力結果です。
カーソルオープン前:ISOPEN=false
カーソルオープン後:ISOPEN=true
フェッチした件数:ROWCOUNT=1
1 Yamada
フェッチした件数:ROWCOUNT=2
2 Tanaka
フェッチした件数:ROWCOUNT=3
3 Suzuki
NOTFOUND = true
カーソルクローズ後:ISOPEN=false

同じく、カーソルFORループで各属性を出力するコードを実行してみました。
DECLARE
    CURSOR cur IS
        SELECT * FROM Member;
    
BEGIN 
    
    FOR rec IN  cur LOOP
        --カーソルISOPEN=出力  
        If (cur%ISOPEN) THEN  
            SYS.DBMS_OUTPUT.PUT_LINE('ISOPEN=true');  
        ELSE  
            SYS.DBMS_OUTPUT.PUT_LINE('ISOPEN=false');     
        END IF;
        --カーソルROWCOUNT出力
        SYS.DBMS_OUTPUT.PUT_LINE('フェッチした件数:ROWCOUNT=' || cur%ROWCOUNT);
        
        
        SYS.DBMS_OUTPUT.PUT_LINE(rec.MemberId);
    END LOOP;
    
    --カーソルISOPEN=出力  
    If (cur%ISOPEN) THEN  
        SYS.DBMS_OUTPUT.PUT_LINE('ISOPEN=true');  
    ELSE  
        SYS.DBMS_OUTPUT.PUT_LINE('ISOPEN=false');     
    END IF;
END;
出力結果です。
ISOPEN=true
フェッチした件数:ROWCOUNT=1
1
ISOPEN=true
フェッチした件数:ROWCOUNT=2
2
ISOPEN=true
フェッチした件数:ROWCOUNT=3
3
ISOPEN=false

0 件のコメント: