将返回从选择查询中检索到的数据的函数 - Oracle

Posted

技术标签:

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

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

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

我写的一个示例函数是:

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

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

【问题讨论】:

【参考方案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,所以我想学习返回行。

以上是关于将返回从选择查询中检索到的数据的函数 - Oracle的主要内容,如果未能解决你的问题,请参考以下文章

如何从flutter中从异步任务中检索到的数据中将图像加载到卡片中?

如何将从表单提交中检索到的参数作为参数传递给 django 中的函数

从数据库中检索到的实体与查询中的情况相同

Oracle OCP提纲

如何使用单个查询联合从另一个表中检索到的表列表?

当我从未检索到的联系人列表地址数据中选择联系人姓名和地址时