2009-07-23 20 views
25

Estoy trabajando en la conversión de un procedimiento almacenado del servidor SQL 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.Obtener conjunto de resultados del procedimiento almacenado de Oracle

Mediante la conversión a Oracle que camino contra el problema de que en Oracle no mostrará el conjunto de resultados

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

Pseudo Código:

procedimiento

llamada almacenado y obtener cursor hacer algo con ese cursor de modo que mi conjunto de resultados aparece

Alguien una idea?

+0

I wounder . Esta pregunta tiene> 90,000 visitas y solo tiene 20 votos positivos. Se merece un voto por vista. : D –

Respuesta

53

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 
+1

¡Excelente! Gracias por la respuesta, Tony.¿Puedo exportar estos resultados a CSV a través de un script de Unix/Linux? –

+5

print rc es bueno en sql plus, ¿cómo puedo visualizar rc en una grilla en SQL Developer? – Stack0verflow

+1

I wounder. Esta pregunta tiene> 90,000 visitas y solo tiene 20 votos positivos. Se merece un voto por vista. Y su respuesta merece 10 votos por ver. Muchas gracias. –

1

En SQL Plus:

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

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

4

Oracle no es servidor SQL. Pruebe lo siguiente en SQL Developer

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

Hola Sé que esto se le preguntó hace un tiempo, pero acabo de cuenta de esto 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 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 difícil para mí estaba declarando un tipo de fila que es exactamente equivalente a la de selección prop/SYS_REFCURSOR siendo devuelta por el proc:

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

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

  • select * from table(yourfunction(param1, param2));
  • Usted puede unirse a sus resultados a otras tablas o filtro o ordenarlas a su gusto ..
  • los resultados aparecen como resultado de la consulta regulares para que pueda manipularlos fácilmente.

Para definir la función que tendría que 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 los resultados es:

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