2017-01-24 11 views
1

こんにちは私はすでにSelectを持つ共用体のみを持つOracleプロシージャを作成しました。プロシージャはこのパラメータで作成されます。oracleプロシージャからの戻り値の取得

PROCEDURE mp_prov_preview(pDateFrom  IN DATE, 
          pDateTo  IN DATE, 
          preturn_cursor OUT spdutil.tref_cursor) IS 

    v_cursor spdutil.tref_cursor; 

プロシージャから返された結果セットを取得する方法はわかりません。私はPL SQLを使用しています。私はこの方法で試してみましたが、結果は表示されません。

begin 
    -- Call the procedure 
    mp_prov_preview('01-oct-2016', 
        '31-oct-2016', 
        :preturn_cursor); 
end; 

PS。私はPLSQL

+0

これは、あなたが結果を何もしていないからです。プロシージャの場合、 "出力"結果は、あなたのケースのOUTパラメータは 'preturn_cursor OUT spdutil.tref_cursor'と定義されます。プロシージャをコールした後、この変数を使用してループする必要があります。これは、ユニオンのみのクエリの結果であるためです。 –

答えて

3

を使用していますが、このような手順があるとします。sqlplusで

create or replace procedure cursorOut (pIn IN  number, 
             pOut OUT sys_refcursor 
            ) is 
begin 
    open pOut for select pIn  from dual union 
        select pIn * 100 from dual; 
end; 

あなたがそれを呼び出すことができます。これは単にあなたのクエリの結果を出力します

SQL> variable vCurs REFCURSOR 
SQL> exec cursorOut (1, :vCurs); 

PL/SQL procedure successfully completed. 

SQL> print :vCurs 

     :B1 
---------- 
     1 
     100 

。あなたは、クエリによって返されたデータにより何かをする必要がある場合は、PL/SQLブロックを使用することができます。

declare 
    vCurs sys_refcursor; 
    vVar number; 
begin 
    cursorOut (1, vCurs); 
    loop 
     fetch vCurs 
     into vVar; 
     exit when vCurs%NOTFOUND; 
     dbms_output.put_line(vVar); 
    end loop; 
end; 

どちらの方法は、あなたの手順で構築されたカーソルを取得し、あなたのためにあなたのOUTパラメータを使用そのカーソルを使って何かをする。

最初の方法はクライアント固有のものです(私はSQLPlusを使用しました)、PRINTコマンド(やはりSQLPlus)で簡単に印刷できる変数を提供します。

2番目のアプローチでは、ループを構築し、結果のデータに基づいていくつかの操作を実行するために1行ごとにスキャンするために使用できるPL/SQL変数があります。これは、PL/SQLのみを使用すると、クライアントに依存しません。

+0

OUTパラメータについての説明を追加することができます。なぜなら、彼は理解していないと思われるからです。 –

+1

よろしくお願いします。ありがとう – Aleksej

関連する問題