首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SQL过程可以返回表吗?

SQL过程可以返回表吗?
EN

Stack Overflow用户
提问于 2012-12-03 04:26:54
回答 3查看 39K关注 0票数 10

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

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-12-03 05:05:49

PL/SQL函数可以返回嵌套表。如果我们将嵌套表声明为SQL类型,则可以使用the TABLE() function将其用作查询的源。

下面是一个类型,以及基于它构建的嵌套表:

代码语言:javascript
复制
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> 

下面是一个函数,它返回嵌套表...

代码语言:javascript
复制
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;
/

..。它是这样工作的:

代码语言:javascript
复制
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

票数 14
EN

Stack Overflow用户

发布于 2016-04-12 16:09:19

我认为您可以使用Oracle游标(如果您的Oracle版本支持它的话):

代码语言:javascript
复制
PROCEDURE myprocedure(
    mycursor OUT SYS_REFCURSOR )
AS
BEGIN
  OPEN mycursor FOR SELECT * FROM mytable;
END;
END;
票数 3
EN

Stack Overflow用户

发布于 2012-12-06 23:14:09

这也可能会有所帮助:

代码语言:javascript
复制
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;
  /
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13673502

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档