Can An Sql Procedure Return A Table?
Can an Oracle SQL procedure return a table? I'm currently using a dbms_output to print out the outputs of two cursors which are in a loop, although this would look nicer if it was
Solution 1:
A PL/SQL function can return a nested table. Provided we declare the nested table as a SQL type we can use it as the source of a query, using the the TABLE() function.
Here is a type, and a nested table built from it:
SQL> create or replace type emp_dets asobject (
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>
Here is a function which returns that nested table ...
createor replace function get_emp_dets (p_dno in emp.deptno%type)
return emp_dets_nt
is
return_value emp_dets_nt;
beginselect emp_dets(empno, ename, job)
bulk collectinto return_value
from emp
where deptno = p_dno;
return return_value;
end;
/... and this is how it works:
SQL>select*2fromtable(get_emp_dets(10))
3/
EMPNO ENAME JOB
---------- ------------------------------ --------------------7782 CLARK MANAGER
7839 KING PRESIDENT
7934 MILLER CLERK
SQL>SQL Types offer us a great deal of functionality, and allow us to build quite sophisticated APIs in PL/SQL. Find out more.
Solution 2:
I think that you can use Oracle Cursor for this (if your Oracle version supports it):
PROCEDURE myprocedure(
mycursor OUT SYS_REFCURSOR )
ASBEGINOPEN mycursor FORSELECT*FROM mytable;
END;
END;
Solution 3:
This may also help:
DECLARE
TYPE t_emptbl ISTABLEOF scott.emp%rowtype;
v_emptbl t_emptbl;
ret_val t_emptbl;
--Function getEmployeeList Return t_emptbl
ISBEGINSELECT* bulk collectINTO v_emptbl FROM scott.emp;
-- Print nested table of records:FOR i IN1 .. v_emptbl.COUNT LOOP
DBMS_OUTPUT.PUT_LINE (v_emptbl(i).empno);
END LOOP;
RETURN v_emptbl;
END;
--BEGIN
ret_val:= getEmployeeList;
END;
/
Post a Comment for "Can An Sql Procedure Return A Table?"