2015年11月24日火曜日

PLSQL パラメータ付きカーソル

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

今回はパラメータ付きカーソルについてです。

カーソルにはパラメータを渡すことができます。
カーソルを定義する際に、カーソル名称とISの間に引数を宣言します。

カーソルFORループを使用せず、明示的にカーソルのオープン、クローズを行うパターンでの使用例


カーソルオープンする際に、カーソルのパラメータを指定する必要があります。
DECLARE
    --カーソル定義
    CURSOR member_csr(prmMemberId Member.MemberId%Type) IS 
        SELECT * FROM Member WHERE MemberId >= prmMemberId;
    --レコード変数
    member_rec member_csr%Rowtype;
BEGIN

    --カーソルオープンする際に引数を指定する
    OPEN member_csr('2');
    
    BEGIN
        
        LOOP
            FETCH member_csr INTO member_rec;
            EXIT WHEN member_csr%NOTFOUND;
            SYS.DBMS_OUTPUT.PUT_LINE(member_rec.memberid || ' ' || member_rec.membername);
        END LOOP;    
        
        --カーソルクローズ
        CLOSE member_csr;
        
    EXCEPTION
        WHEN others THEN  
           --例外が発生してもカーソルをクローズする  
           CLOSE member_csr;  
           --例外を親ブロックへ伝播する。(必要な場合のみ)  
           RAISE;  

    END;
    
END;

カーソルFORループでの使用例


こちらはループごとにパラメータを指定することができます。
DECLARE
    --カーソル定義
    CURSOR member_csr(prmMemberId Member.MemberId%Type) IS 
        SELECT * FROM Member WHERE MemberId = prmMemberId;
   
BEGIN

    FOR idx IN 1..3 LOOP
        --ループ毎にカーソル引数を指定できる
        FOR member_rec IN member_csr(idx) LOOP

            SYS.DBMS_OUTPUT.PUT_LINE(member_rec.memberid || ' ' || member_rec.membername);    

        END LOOP;

    END LOOP;

END;
カーソルのパラメータは型を指定することはできますが、精度は指定できません。
DECLARE
    CURSOR cur(id VARCHAR2) IS
        SELECT * FROM Member WHERE MemberId = id; 
    
BEGIN 
    
    FOR rec IN  cur('1') LOOP
          SYS.DBMS_OUTPUT.PUT_LINE(rec.MemberName);
    END LOOP;
END;

0 件のコメント: