2012-12-02 9 views
6

Kann eine Oracle SQL-Prozedur eine Tabelle zurückgeben? Ich benutze derzeit eine dbms_output, um die Ausgaben von zwei Cursors, die in einer Schleife sind, auszudrucken, obwohl dies schöner aussehen würde, wenn es stattdessen zwei Spalten zurückgeben würde. Wäre das in einem Verfahren möglich?Kann eine SQL-Prozedur eine Tabelle zurückgeben?

+0

Welche Datenbank verwenden Sie? – Lee

+0

Ich benutze Oracle – Jaqualembo

+0

Wie verbrauchen Sie das Verfahren? Sie können eine Ergebnismenge von einem Cursor über einen OUT-Parameter des Datentyps SYS_REFCURSOR zurückgeben, aber Ihr Client muss das Lesen der Ergebnismenge unterstützen. –

Antwort

8

Eine PL/SQL-Funktion kann eine verschachtelte Tabelle zurückgeben. Vorausgesetzt, dass wir die geschachtelte Tabelle als SQL-Typ deklarieren, können wir sie als Quelle einer Abfrage verwenden, indem wir the TABLE() function verwenden. Hier

ist ein Typ und eine verschachtelte Tabelle aus gebaut:

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> 

Hier ist eine Funktion, die die verschachtelte Tabelle zurückgibt ...

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

... und das ist, wie es funktioniert:

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

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

SQL> 

SQL-Typen bieten uns eine große Funktionalität und erlauben uns, ziemlich ausgefeilte APIs in PL/SQL zu erstellen. Find out more.

0

helfen Dies kann auch:

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

Ich denke, dass Sie Oracle-Cursor für diese verwenden können (wenn die Oracle-Version unterstützt):

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