create package pa as
type ra1 is record (
one integer,
two integer
);
type ra2 is record (
r1 ra1,
three integer,
fore integer
);
type ta1 is table of ra1;
type ta2 is table of ra2;
function pa1 return ta1 pipelined;
function pa2 return ta2 pipelined; --pipelined functions must have a supported collection return type
end;
它似乎不可能太创建一个表的一个记录。
我解释了为什么我想这样做。也许你有另一个解决办法。
我有一个包含n个部分“with语句”的大型查询。
有些部分在其他查询中被重复使用。我可以把这些部分重写为视图。但是视图不接受参数,并且where块中的内容很长。
我想这样定义每个步骤:
function f_stepn(arg integer) return t_stepn
is
for c in (
select r_stepnMinus1(stepnMinus1.* ) , o.f1,o.f2
from
f_stepnMinus1(arg) stepnMinus1 join othertable o on .....
) loop
pipe row(c)
end loop
最后我这样做这选择:
select skip(t.r_stepMinus1.r_stepMinus1.*), skip(t.r_stepMinus1.*), skip(t.*))
其中,删除记录字段的多态函数中的skip。
P.S.示例中的函数是简化的。我不能这样做:选择r_步骤减1(步骤减1.*)
我知道我可以在r2中重写r1的整个定义,但我不想写两次相同的东西
1条答案
按热度按时间kpbwa7wx1#
记录是仅PL/SQL数据类型,不能用于SQL语句。
流水线函数设计用于SQL语句,并且必须返回可用于SQL的集合。
当您返回一个记录集合时,Oracle将隐式创建一个反映记录属性的
OBJECT
数据类型,并将返回此对象的集合而不是记录(并且对象的集合可以在SQL语句中使用)。但是,
OBJECT
不能包含具有RECORD
数据类型的属性。因此,当您尝试创建返回具有嵌套记录属性的记录集合的管道函数时,Oracle无法隐式创建反映该记录的对象,因为嵌套记录不兼容,因此创建PIPELINED
函数将失败。可以是:
OBJECT
数据类型(而不是记录);或