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 中的表值函数的主要内容,如果未能解决你的问题,请参考以下文章