Obtener resultados del procedimiento almacenado de Oracle

Estoy trabajando en la conversión de un procedimiento almacenado de SQL Server a Oracle. Este procedimiento almacenado proporciona un resultado directo. Quiero decir que si llamas al procedimiento almacenado en, por ejemplo, Management Studio, obtienes directamente el resultado.

Al convertirme en Oracle, camino contra el problema de que en Oracle no mostraré el conjunto de resultados.

Busqué en Internet y he visto que el procedimiento almacenado debería producir un CURSOR DE REF, pero sigo caminando con el problema para escribir un pequeño fragmento de código para obtener el conjunto de resultados en proceso.

Pseudo Código:

Llamar al procedimiento almacenado y obtener el cursor Hacer algo con ese cursor para que aparezca mi conjunto de resultados

Alguien una idea?

En 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 no es un servidor SQL. Pruebe lo siguiente en SQL Developer

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

En SQL Plus:

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

Reemplace la última línea con una llamada a su procedimiento / función y se mostrará el contenido del refcursor

Hola, sé que esto fue preguntado hace un tiempo, pero acabo de descubrirlo y podría ayudar a alguien más. No estoy seguro de si esto es exactamente lo que está buscando, pero así es como llamo a un proceso almacenado y veo el resultado usando SQL Developer.
En SQL Developer al ver el proceso, haga clic con el botón derecho y seleccione ‘Ejecutar’ o seleccione Ctrl + F11 para abrir la ventana Ejecutar PL / SQL. Esto crea una plantilla con los parámetros de entrada y salida que necesita modificar. Mi proceso devuelve un sys_refcursor. La parte más complicada para mí fue declarar un tipo de fila que es exactamente equivalente al select stmt / sys_refcursor que devuelve el proceso:

 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; 

Mi solución fue crear una función canalizada. Las ventajas son que la consulta puede ser una sola línea:

  • select * from table(yourfunction(param1, param2));
  • Puede unir sus resultados a otras tablas o filtrarlas o clasificarlas como desee.
  • los resultados aparecen como resultados de consultas regulares para que pueda manipularlos fácilmente.

Para definir la función, necesitarás hacer algo como lo siguiente:

  -- 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; 

Y como se mencionó anteriormente, todo lo que haría para ver sus resultados es:

 select * from table(yourfunction(param1, param2)) t order by t.my_col1;