2012-12-02 11 views
6

Una procedura Oracle Oracle può restituire una tabella? Attualmente sto usando un dbms_output per stampare le uscite di due cursori che sono in un ciclo, anche se questo sarebbe più bello se restituisse invece due colonne. Sarebbe possibile all'interno di una procedura?Una procedura SQL può restituire una tabella?

+0

cosa del database stai usando? – Lee

+0

Sto usando Oracle – Jaqualembo

+0

Come stai seguendo la procedura? È possibile restituire un set di risultati da un cursore tramite un parametro OUT del tipo di dati SYS_REFCURSOR, ma il client deve supportare la lettura del set di risultati. –

risposta

8

Una funzione PL/SQL può restituire una tabella nidificata. A condizione che dichiariamo la tabella nidificata come un tipo SQL, possiamo usarla come fonte di una query, usando lo the TABLE() function.

Qui è un tipo, e una tabella nidificata costruita da esso:

SQL> create or replace type emp_dets as object (
    2 empno number, 
    3 ename varchar2(30), 
    4 job varchar2(20)); 
    5/

Type created. 

SQL> create or replace type emp_dets_nt as table of emp_dets; 
    2/

Type created. 

SQL> 

Ecco una funzione che restituisce quel tavolo annidato ...

create or replace function get_emp_dets (p_dno in emp.deptno%type) 
    return emp_dets_nt 
is 
    return_value emp_dets_nt; 
begin 
    select emp_dets(empno, ename, job) 
    bulk collect into return_value 
    from emp 
    where deptno = p_dno; 
    return return_value; 
end; 
/

... e questo è il modo in funziona:

SQL> select * 
    2 from table(get_emp_dets(10)) 
    3/

    EMPNO ENAME       JOB 
---------- ------------------------------ -------------------- 
     7782 CLARK       MANAGER 
     7839 KING       PRESIDENT 
     7934 MILLER       CLERK 

SQL> 

I tipi SQL ci offrono una grande quantità di funzionalità e ci permettono di creare API piuttosto sofisticate in PL/SQL. Find out more.

0

Questo può anche aiutare:

DECLARE 
    TYPE t_emptbl IS TABLE OF scott.emp%rowtype; 
    v_emptbl t_emptbl; 
    ret_val t_emptbl; 
    -- 
    Function getEmployeeList Return t_emptbl 
    IS 
    BEGIN 
    SELECT * bulk collect INTO v_emptbl FROM scott.emp; 
    -- Print nested table of records: 
    FOR i IN 1 .. v_emptbl.COUNT LOOP 
     DBMS_OUTPUT.PUT_LINE (v_emptbl(i).empno); 
    END LOOP; 
    RETURN v_emptbl; 
    END; 
    -- 
    BEGIN 
    ret_val:= getEmployeeList; 
    END; 
/
1

penso che è possibile utilizzare Oracle cursore per questo (se la vostra versione di Oracle supporta):

PROCEDURE myprocedure(
    mycursor OUT SYS_REFCURSOR) 
AS 
BEGIN 
    OPEN mycursor FOR SELECT * FROM mytable; 
END; 
END;