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?
6
A
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;
cosa del database stai usando? – Lee
Sto usando Oracle – Jaqualembo
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. –