将返回从select查询中检索的数据的函数 - Oracle

时间:2011-01-20 16:20:59

标签: oracle function stored-procedures plsql return

我正在尝试编写一个返回select查询结果的函数。我使用过非常基本的函数来返回一个数字和一个varchar2(字符串)。但现在我想返回一个select的结果,就像10行及其相应的列。

我将如何编写函数以及返回类型是什么?

我写的一个示例函数是:

  

创建或替换函数func1   将varchar2作为begin返回       return('你好,来自func1');结束func1;

我仍处于基本级别,所以有人可以帮我退出选择查询的结果吗?我相信会使用游标,因为会有不止一行。

3 个答案:

答案 0 :(得分:17)

通常,函数返回单个“thing”。通常,这是一个标量(数字,varchar2,记录等),但您可以返回一个集合。因此,例如,您可以返回一个集合(在本例中为嵌套表),其中包含EMP表中的所有EMPNO值

CREATE TYPE empno_tbl 
    IS TABLE OF NUMBER;

CREATE OR REPLACE FUNCTION get_empnos
  RETURN empno_tbl
IS
  l_empnos empno_tbl;
BEGIN
  SELECT empno
    BULK COLLECT INTO l_empnos
    FROM emp;
  RETURN l_empnos;
END;

但这在函数中并不常见。让函数返回游标而不是返回值并让调用者处理获取数据会更常见,即

CREATE OR REPLACE FUNCTION get_empnos2
  RETURN SYS_REFCURSOR
IS
  l_rc SYS_REFCURSOR;
BEGIN
  OPEN l_rc
   FOR SELECT empno
         FROM emp;
  RETURN l_rc;
END;

但即使这在甲骨文中并不常见。根据您要完成的任务,通常更常见的是创建一个视图来选择您感兴趣的数据并查询该视图而不是调用函数或过程。

答案 1 :(得分:2)

好吧,如果你刚刚学习,你应该了解流水线功能。通过流水线功能,您可以在PLSQL中返回动态生成的表。

例如......

  create function
      gen_numbers(n in number default null)
      return array
      PIPELINED
  as
  begin
     for i in 1 .. nvl(n,999999999)
         loop
         pipe row(i);
     end loop;
    return;
  end;

我从http://www.akadia.com/services/ora_pipe_functions.html借来的: - )

答案 2 :(得分:1)

如果没有关于如何调用此函数的上下文,我对如何帮助您有点迷失。

您确定使用子选择,加入或查看会不会更好吗?