我正在尝试创建一个函数(也许程序会更好?),它返回一个表。现在我有这个:
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。有小费吗?
答案 0 :(得分:2)
您的查询正在选择两个标量值,并尝试将它们放入对象类型的表中。该类型有两个字段,但没有自动转换。因此,您需要显式构建对象,您可以将其作为查询的一部分。
您还应该使用批量查询来填充您的收藏集:
select rowx(y.ident, x.ident)
bulk collect into tab
from relation2 rt
...
答案 1 :(得分: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>