2009-07-23 2 views
25

Sto lavorando alla conversione di una stored procedure dal server SQL a Oracle. Questa stored procedure fornisce un set di risultati diretto. Intendo dire che se chiami la stored procedure in es. In Management Studio ottieni direttamente il set di risultati.Ottenere il set di risultati dalla stored procedure di Oracle

Con la conversione a Oracle I piedi contro il problema che ho in Oracle non visualizzerà il gruppo di risultati

ho cercato su internet e ho visto che la stored procedure dovrebbe produrre un REF CURSOR, ma ho ancora camminare con il problema di scrivere un pezzetto di codice per ottenere il risultato in elaborazione.

pseudo codice:

chiamata stored procedure e ottenere cursore Fai qualcosa con quel cursore in modo che il mio gruppo di risultati appare

Qualcuno un'idea?

+0

I feritore . Questa domanda ha> 90.000 visualizzazioni e ha ottenuto solo 20 voti positivi. Merita la votazione per alzata. : D –

risposta

53

In SQL più:

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

Eccellente! Grazie per la risposta, Tony.Posso esportare questi risultati in CSV tramite script Unix/Linux? –

+5

print rc è bello in sql plus, come posso visualizzare rc in una griglia in SQL Developer? – Stack0verflow

+1

I ferito. Questa domanda ha> 90.000 visualizzazioni e ha ottenuto solo 20 voti positivi. Merita la votazione per alzata. E la tua risposta merita 10 voti positivi per visualizzazione. Grazie mille. –

1

In SQL più:

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

Sostituire l'ultima riga con una chiamata al tuo procedura/funzione e il contenuto del refcursor verranno visualizzati

4

Oracle non è un server sql. Provare quanto segue in SQL Developer

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

Ciao So che questo è stato chiesto qualche tempo fa, ma ho appena capito questo e potrebbe aiutare qualcun altro. Non sono sicuro se questo è esattamente quello che stai cercando, ma è così che chiamo un proc memorizzato e visualizzare l'output utilizzando SQL Developer.
In SQL Developer durante la visualizzazione del proc, fare clic con il tasto destro e scegliere 'Esegui' o selezionare Ctrl + F11 per visualizzare la finestra Esegui PL/SQL. Questo crea un modello con i parametri di input e output che è necessario modificare. Il mio proc restituisce un sys_refcursor. La parte difficile per me è stato dichiarare un tipo di riga che è esattamente equivalente al select stmt/sys_refcursor essere restituito dal 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

La mia soluzione era quella di creare una funzione di pipeline. I vantaggi sono che la query può essere una sola riga:

  • select * from table(yourfunction(param1, param2));
  • È possibile aderire i risultati ad altri tavoli o filtro o ordinarli come ti pare ..
  • i risultati vengono visualizzati come risultati della query regolari così puoi facilmente manipolarli.

Per definire la funzione che si avrebbe bisogno di fare qualcosa di simile al seguente:

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

E come già detto, tutto si farebbe per visualizzare i risultati è:

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