SQL Oracle,从Function返回一个表

问题描述 投票:1回答:2

我正在尝试创建一个函数(也许程序会更好?),它返回一个表。现在我有这个:

CREATE OR REPLACE TYPE rowx AS OBJECT
(
  nam1  VARCHAR2 (100),
  nam2     VARCHAR2 (100)
);
/  

CREATE OR REPLACE TYPE tablex
IS TABLE OF rowx;
/

CREATE OR REPLACE FUNCTION example(FS varchar2)
RETURN tablex 
IS
tab tablex;

BEGIN
select y.ident as PARENT, x.ident as CHILD into tab
from relation2 rt
inner join plate x on rt.child = x.id 
inner join plate y on rt.parent =y.id
where x.ident like 'string1' or y.ident like 'string2';

RETURN tab;
END;

编译完上面的函数后,我会重新阅读ORA-00947。有小费吗?

sql oracle
2个回答
2
投票

您的查询正在选择两个标量值,并尝试将它们放入对象类型的表中。该类型有两个字段,但没有自动转换。因此,您需要显式构建对象,您可以将其作为查询的一部分。

您还应该使用批量查询来填充您的集合:

select rowx(y.ident, x.ident)
bulk collect into tab
from relation2 rt
...

1
投票

看看这个例子;它有帮助吗?

我的TEST表代表你的表。此函数返回一个集合,然后在SELECT语句中与TABLE运算符一起使用。

SQL> create table test (nam1 varchar2(10), nam2 varchar2(10));

Table created.

SQL> insert into test values ('Little', 'Foot');

1 row created.

SQL> insert into test values ('Stack', 'Overflow');

1 row created.

SQL> create or replace type t_tf_row as object (nam1 varchar2(10), nam2 varchar2(10));
  2  /

Type created.

SQL> create or replace type t_tf_tab is table of t_tf_row;
  2  /

Type created.

SQL>
SQL> create or replace function get_tab_tf return t_tf_tab as
  2    l_tab t_tf_tab := t_tf_tab();
  3  begin
  4    for cur_r in (select nam1, nam2 from test) loop
  5      l_tab.extend;
  6      l_tab(l_tab.last) := t_tf_row(cur_r.nam1, cur_r.nam2);
  7    end loop;
  8    return l_tab;
  9  end;
 10  /

Function created.

SQL>
SQL> select * From table(get_Tab_tf);

NAM1      NAM2
--------------------
Little    Foot
Stack     Overflow

SQL>
© www.soinside.com 2019 - 2024. All rights reserved.