2009-07-23 24 views
25

私はストアドプロシージャをSQLサーバーからOracleに変換しようとしています。 このストアドプロシージャは直接結果セットを提供します。つまり、Management Studioなどでストアドプロシージャを呼び出すと、結果セットを直接取得できます。私はOracleの中で、私は、インターネット上で検索し、ストアドプロシージャがREF CURSORを得なければならないことを見てきましたが、私はまだして歩いたResultSetoracleストアドプロシージャから結果セットを取得

が表示されないという問題に対して、歩いてOracleに変換することにより

問題は、結果セットを取得するためのコードの少しの部分を書くことです。

擬似コード:

コールストアドプロシージャとカーソル を得る私のResultSetが

誰かのアイデアを表示されるように、そのカーソルで何かをしますか? SQL Plusで

+0

私はwounderを。この質問は90万回を超えていますが、投票は20回しかありません。それは1ビューにつき最大の投票権があります。 :D –

答えて

53

を表示されます置き換えます

SQL> create procedure myproc (prc out sys_refcursor) 
    2 is 
    3 begin 
    4  open prc for select * from emp; 
    5 end; 
    6/

Procedure created. 

SQL> var rc refcursor 
SQL> execute myproc(:rc) 

PL/SQL procedure successfully completed. 

SQL> print rc 

    EMPNO ENAME  JOB    MGR HIREDATE   SAL  COMM  DEPTNO 
---------- ---------- --------- ---------- ----------- ---------- ---------- ---------- 
     7839 KING  PRESIDENT   17-NOV-1981  4999     10 
     7698 BLAKE  MANAGER   7839 01-MAY-1981  2849     30 
     7782 CLARKE  MANAGER   7839 09-JUN-1981  2449     10 
     7566 JONES  MANAGER   7839 02-APR-1981  2974     20 
     7788 SCOTT  ANALYST   7566 09-DEC-1982  2999     20 
     7902 FORD  ANALYST   7566 03-DEC-1981  2999     20 
     7369 SMITHY  CLERK   7902 17-DEC-1980  9988   11   20 
     7499 ALLEN  SALESMAN  7698 20-FEB-1981  1599  3009   30 
     7521 WARDS  SALESMAN  7698 22-FEB-1981  1249  551   30 
     7654 MARTIN  SALESMAN  7698 28-SEP-1981  1249  1400   30 
     7844 TURNER  SALESMAN  7698 08-SEP-1981  1499   0   30 
     7876 ADAMS  CLERK   7788 12-JAN-1983  1099     20 
     7900 JAMES  CLERK   7698 03-DEC-1981  949     30 
     7934 MILLER  CLERK   7782 23-JAN-1982  1299     10 
     6668 Umberto CLERK   7566 11-JUN-2009  19999   0   10 
     9567 ALLBRIGHT ANALYST   7788 02-JUN-2009  76999   24   10 
+1

優秀!答えをありがとう、トニー。これらの結果をUnix/Linuxスクリプトを通じてCSVにエクスポートできますか? –

+5

print rcがSQL Plusでうまくいけば、SQL Developerのグリッドにrcを表示するにはどうしたらいいですか? – Stack0verflow

+1

私はwounder。この質問は90万回を超えていますが、投票は20回しかありません。それは1ビューにつき最大の投票権があります。そして、あなたの答えは、1ビューにつき10票の投票権が必要です。どうもありがとうございました。 –

1

SQL> var r refcursor 
SQL> set autoprint on 
SQL> exec :r := function_returning_refcursor(); 

プロシージャ/ファンクションをコールし、参照カーソルの内容と最後の行は、SQL Plusでは

4

OracleはSQL Serverではありません。 SQL Developerで、次の試してみてください

variable rc refcursor; 
exec testproc(:rc2); 
print rc2 
1

こんにちは、私は、これはしばらく前に頼まれたが、私はちょうどこれを考え出した、それは他の誰かを助けるかもしれない知っています。これがまさにあなたが探しているものなのかどうかは分かりませんが、これはストアドプロシージャを呼び出してSQL Developerを使用して出力を表示する方法です。
SQL Developerでは、プロキシを表示するときに右クリックして[実行]を選択するか、Ctrl + F11を選択してPL/SQLの実行ウィンドウを表示します。これにより、変更する必要のある入力および出力パラメータを持つテンプレートが作成されます。私のprocはsys_refcursorを返します。私にとってはトリッキーな部分は、選択のstmtとまったく同じである行の型を宣言した/ procのSYS_REFCURSORによって返される:

DECLARE 
    P_CAE_SEC_ID_N NUMBER; 
    P_FM_SEC_CODE_C VARCHAR2(200); 
    P_PAGE_INDEX NUMBER; 
    P_PAGE_SIZE NUMBER; 
    v_Return sys_refcursor; 
    type t_row is record (CAE_SEC_ID NUMBER,FM_SEC_CODE VARCHAR2(7),rownum number, v_total_count number); 
    v_rec t_row; 

BEGIN 
    P_CAE_SEC_ID_N := NULL; 
    P_FM_SEC_CODE_C := NULL; 
    P_PAGE_INDEX := 0; 
    P_PAGE_SIZE := 25; 

    CAE_FOF_SECURITY_PKG.GET_LIST_FOF_SECURITY(
    P_CAE_SEC_ID_N => P_CAE_SEC_ID_N, 
    P_FM_SEC_CODE_C => P_FM_SEC_CODE_C, 
    P_PAGE_INDEX => P_PAGE_INDEX, 
    P_PAGE_SIZE => P_PAGE_SIZE, 
    P_FOF_SEC_REFCUR => v_Return 
); 
    -- Modify the code to output the variable 
    -- DBMS_OUTPUT.PUT_LINE('P_FOF_SEC_REFCUR = '); 
    loop 
    fetch v_Return into v_rec; 
    exit when v_Return%notfound; 
    DBMS_OUTPUT.PUT_LINE('sec_id = ' || v_rec.CAE_SEC_ID || 'sec code = ' ||v_rec.FM_SEC_CODE); 
    end loop; 

END; 
1

私のソリューション、パイプライン関数を作成することでした。

  • select * from table(yourfunction(param1, param2));
  • あなたは結果が、通常のクエリ結果として表示され
  • ..他のテーブルやフィルターにあなたの結果を結合したり、それらをしてください並べ替えることができます利点は、クエリは、単一の行できることですあなたは簡単にそれらを操作することができます。

あなたのような何かをする必要があります関数を定義するには、次

-- Declare the record columns 
    TYPE your_record IS RECORD(
    my_col1 VARCHAR2(50), 
    my_col2 varchar2(4000) 
); 
    TYPE your_results IS TABLE OF your_record; 

    -- Declare the function 
    function yourfunction(a_Param1 varchar2, a_Param2 varchar2) 
    return your_results pipelined is 
    rt   your_results; 
    begin 
    -- Your query to load the table type 
    select s.col1,s.col2 
    bulk collect into rt 
    from your_table s 
    where lower(s.col1) like lower('%'||a_Param1||'%'); 

    -- Stuff the results into the pipeline.. 
    if rt.count > 0 then 
     for i in rt.FIRST .. rt.LAST loop 
     pipe row (rt(i)); 
     end loop; 
    end if; 

    -- Add more results as you please.... 
    return; 
    end find; 

そして、前述したように、あなたの結果を表示するだろうすべては次のとおりです。

select * from table(yourfunction(param1, param2)) t order by t.my_col1; 
関連する問題