ORACLE PL/SQL 中的表值函数

Posted

技术标签:

【中文标题】ORACLE PL/SQL 中的表值函数【英文标题】:Table-Valued Functions in ORACLE PL/SQL 【发布时间】:2019-12-20 19:27:39 【问题描述】:

我正在尝试找到一种简单的方法来使用 Oracle 的表值函数,因为我对它很陌生。

我在网上找到了一个有效的教程。但是,与其他非 Oracle 实现的表值函数相比,它相当复杂。

在教程中它做了这样的事情:

create or replace type t_record as object (
  i number,
  n varchar2(30)
);

然后,创建表

create or replace type t_table as table of t_record;

最后创建函数

create or replace function return_table return t_table as
  v_ret   t_table;
begin

 --
 -- Call constructor to create the returned
 -- variable:
 --
    v_ret  := t_table();

 --
 -- Add one record after another to the returned table.
 -- Note: the »table« must be extended before adding
 -- another record:
 --
    v_ret.extend; v_ret(v_ret.count) := t_record(1, 'one'  );
    v_ret.extend; v_ret(v_ret.count) := t_record(2, 'two'  );
    v_ret.extend; v_ret(v_ret.count) := t_record(3, 'three');

 --
 -- Return the record:
 --
    return v_ret;

end return_table;
/

然后我们可以简单地使用查询调用获取函数的结果。

select * from table(return_table);

有没有更简单、更简洁的方法来做到这一点,比如只将查询编写为函数的主体并返回它而不进行所有初始化、扩展和添加?。

非常感谢。

【问题讨论】:

如果您不想像表一样使用它(例如在 JOIN 或添加 WHERE 子句中),那么您可以使用过程并通过DBMS_SQL.RETURN_RESULT返回结果 不幸的是 PL/SQL 没有匿名类型 - 你不能有 function f return table of t%rowtype,你必须指定一个现有的类型。但是,一旦定义了它,您就可以在任何地方重复使用它。但是你确定你需要一个表函数吗? @WilliamRobertson,我认为在我的情况下,视图可以解决问题。感谢您的回答 【参考方案1】:

或者,您可以创建一个表:

SQL> create table tab(
  i number,
  n varchar2(30)
);

并填充:

SQL> insert all 
       into tab values(1, 'one')
       into tab values(2, 'two')
       into tab values(3, 'three')
select * from dual;

然后通过函数内的隐式游标填充类型对象值:

SQL> create or replace function return_table return t_table as
  v_ret   t_table:= t_table();
begin

 for c in ( select * from tab )
 loop
    v_ret.extend; v_ret(v_ret.count) := t_record( c.i, c.n );
 end loop;

    return v_ret;

end return_table;
/

然后打电话:

SQL> select * from table(return_table);

I   N
-   -----
1   One 
2   Two
3   Three

【讨论】:

感谢您的回答,但这仍然是一种复杂的方式。我正在考虑改用视图,即使它们不带参数。 不客气@Jalil.Jarjanazy。很难提出替代方法。也许dbms_output.put_line 可以通过显式写入值来使用。顺便说一句,有趣的是你像我一样住在安卡拉,像我住在安特卫普的兄弟一样在诺基亚工作。 是的,这是一个有趣的巧合:)

以上是关于ORACLE PL/SQL 中的表值函数的主要内容,如果未能解决你的问题,请参考以下文章

Oracle PL/SQL块之函数

Oracle PL/SQL 过程/函数来创建包含列的视图

oracle sql中的函数

如何做一个函数来从 pl/sql 中的表中返回行类型?

sqlserver中的表值函数和标量值函数

从 PL/SQL 函数访问查询的 from 子句中的表名