SQL 过程可以返回一个表吗?
Posted
技术标签:
【中文标题】SQL 过程可以返回一个表吗?【英文标题】:Can an SQL procedure return a table? 【发布时间】:2012-11-20 08:14:28 【问题描述】:Oracle 我目前正在使用dbms_output
打印出循环中的两个游标的输出,尽管如果它返回两列会更好看。这可能在一个程序中实现吗?
【问题讨论】:
你用的是什么数据库? 您如何使用该程序?您可以通过 SYS_REFCURSOR 数据类型的 OUT 参数从游标返回结果集,但您的客户端需要支持读取结果集。 asktom.oracle.com/pls/asktom/… 【参考方案1】:PL/SQL 函数可以返回嵌套表。如果我们将嵌套表声明为 SQL 类型,我们可以将其用作查询源,使用 the TABLE() function。
这是一个类型,以及一个由它构建的嵌套表:
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>
这是一个返回嵌套表的函数...
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;
/
...这就是它的工作原理:
SQL> select *
2 from table(get_emp_dets(10))
3 /
EMPNO ENAME JOB
---------- ------------------------------ --------------------
7782 CLARK MANAGER
7839 KING PRESIDENT
7934 MILLER CLERK
SQL>
SQL 类型为我们提供了大量功能,并允许我们在 PL/SQL 中构建相当复杂的 API。 Find out more.
【讨论】:
【参考方案2】:我认为您可以为此使用 Oracle Cursor(如果您的 Oracle 版本支持):
PROCEDURE myprocedure(
mycursor OUT SYS_REFCURSOR )
AS
BEGIN
OPEN mycursor FOR SELECT * FROM mytable;
END;
END;
【讨论】:
【参考方案3】:这也可能有帮助:
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;
/
【讨论】:
以上是关于SQL 过程可以返回一个表吗?的主要内容,如果未能解决你的问题,请参考以下文章