2012-12-02 16 views
6

Czy procedura Oracle SQL może zwrócić tabelę? Obecnie używam dbms_output, aby wydrukować wyjścia dwóch kursorów, które są w pętli, chociaż byłoby ładniej, gdyby zamiast tego zwracano dwie kolumny. Czy byłoby to możliwe w ramach procedury?Czy procedura SQL może zwrócić tabelę?

+0

Co baza danych używasz? – Lee

+0

Używam Oracle – Jaqualembo

+0

Jak używasz procedury? Możesz zwrócić zestaw wyników z kursora za pomocą parametru OUT typu danych SYS_REFCURSOR, ale twój klient musi obsługiwać odczyt zestawu wyników. –

Odpowiedz

8

Funkcja PL/SQL może zwrócić zagnieżdżoną tabelę. Pod warunkiem, że deklarujemy zagnieżdżoną tabelę jako typ SQL, możemy użyć jej jako źródła zapytania, używając the TABLE() function.

Oto typ, a tabela zagnieżdżona zbudowany z niego:

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> 

Oto funkcja, która zwraca że tabela zagnieżdżonej ...

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

... i to jak to działa:

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

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

SQL> 

SQL Types oferują nam ogromną funkcjonalność i pozwalają nam budować całkiem wyrafinowane API w PL/SQL. Find out more.

0

To może pomóc także:

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

myślę, że można użyć Oracle kursora do tego (jeśli wersja Oracle obsługuje):

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