首页 文章

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

提问于
浏览
10

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

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

我写的一个示例函数是:

创建或替换函数func1将varchar2作为begin return返回('hello from func1');结束func1;

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

3 回答

  • 17

    好吧,如果你刚刚学习,你应该知道流水线功能 . 流水线函数允许您在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

    通常,函数返回单个“事物” . 通常,这是一个标量(数字,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;
    

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

相关问题