【问题标题】:Function that would return the data retrieved from a select query - Oracle将返回从选择查询中检索到的数据的函数 - Oracle
【发布时间】:2011-06-12 14:07:03
【问题描述】:

我正在尝试编写一个返回选择查询结果的函数。我使用过非常基本的函数,这些函数会返回一个数字和一个 varchar2(string)。但是现在我想返回一个选择的结果,比如 10 行和它们对应的列。

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

我写的一个示例函数是:

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

我仍然处于基本水平,所以任何人都可以帮助我返回选择查询的结果吗?我相信要使用游标,因为会有不止一行。

【问题讨论】:

    标签: oracle function stored-procedures plsql return


    【解决方案1】:

    好吧,如果您只是在学习,您应该了解流水线函数。流水线函数允许您在 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】:

      通常,函数返回单个“事物”。通常,这是一个标量(数字、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 中也不是特别常见。根据您要完成的工作,通常更常见的是简单地创建一个选择您感兴趣的数据的视图并查询该视图,而不是调用函数或过程。

      【讨论】:

      • +1 例如。此外,第二个示例在应用程序数据访问是通过存储过程的系统中相当常见,并且通常与应用程序端的 iBatis 之类的东西结合使用
      • 假设函数没有输入参数,为什么不使用视图?
      【解决方案3】:

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

      您确定使用子选择、连接或视图不会更好吗?

      【讨论】:

      • 坦率地说,我只是想了解如何完成该功能。不管它的使用或执行等。我目前正在学习plsql,所以我想学习返回行。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多