【问题标题】:Can an SQL procedure return a table?SQL 过程可以返回一个表吗?
【发布时间】:2012-11-20 08:14:28
【问题描述】:

Oracle SQL 过程可以返回一个表吗?我目前正在使用dbms_output 打印出循环中的两个游标的输出,尽管如果它返回两列会更好看。这可能在一个程序中实现吗?

【问题讨论】:

  • 你用的是什么数据库?
  • 您如何使用该程序?您可以通过 SYS_REFCURSOR 数据类型的 OUT 参数从游标返回结果集,但您的客户端需要支持读取结果集。

标签: sql oracle procedure


【解决方案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;
        /
      

      【讨论】:

        猜你喜欢
        • 2010-12-10
        • 2014-05-22
        • 2021-12-23
        • 2019-11-30
        • 1970-01-01
        • 2011-01-21
        • 1970-01-01
        • 2014-04-07
        • 1970-01-01
        相关资源
        最近更新 更多