从oracle存储过程获取结果集
我正在将存储过程从SQL Server转换为Oracle。 这个存储过程提供了一个直接的结果集。 我的意思是,如果您在例如Management Studio中调用存储过程,则直接获取结果集。
通过转换为Oracle,我将解决Oracle中不会显示结果集的问题
我在互联网上search,已经看到存储过程应该产生一个REF CURSOR,但我仍然与问题一起写一小段代码来获得结果集的过程。
伪代码:
调用存储过程并获取游标使用该游标执行某些操作,以便显示结果集
有人想法?
在SQL Plus中:
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
Oracle不是sql服务器。 在SQL Developer中尝试以下内容
variable rc refcursor; exec testproc(:rc2); print rc2
在SQL Plus中:
SQL> var r refcursor SQL> set autoprint on SQL> exec :r := function_returning_refcursor();
将最后一行replace为您的过程/函数的调用,并显示refcursor的内容
看看这个页面,它有关于如何处理几种不同编程语言的REF CURSOR的例子:
http://asktom.oracle.com/tkyte/ResultSets/index.html
更新:上面的链接是死的,内容被移到这里:
http://tkyte.blogspot.com/2009/10/httpasktomoraclecomtkyte.html
关于ref游标和结果集的一点在这里:
http://asktom.oracle.com/pls/asktom/ASKTOM.download_file?p_file=6551171813078805685
嗨,我知道这是前一阵子问,但我已经明白了这一点,它可能会帮助别人。 不知道这是否正是你正在寻找,但这是我如何调用一个存储过程,并使用SQL Developer查看输出。
在SQL Developer中查看proc时,右击并select'Run'或者selectCtrl + F11来打开Run PL / SQL窗口。 这将创build一个模板,其中包含需要修改的input和输出参数。 我的proc返回一个sys_refcursor。 对我来说,棘手的部分是声明一个行types,它完全等同于proc返回的select stmt / 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;
我的解决scheme是创build一个stream水线function。 优点是查询可以是单行的:
-
select * from table(yourfunction(param1, param2));
- 您可以将您的结果join到其他表格中,或者按照您的要求进行过滤或sorting。
- 结果显示为常规查询结果,因此您可以轻松操作它们。
要定义这个函数,你需要做如下的事情:
-- 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;