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个部分。
某些零件在其他查询中重复使用。我可以把这些部分改写为视图。但视图不接受参数,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是一个多转函数,用于删除作为记录的字段。
第页。S对实例中的函数进行了简化。我不能这样做:选择r_stepnMinus1(stepnMinus1.*(
我知道我可以在r2中重写r1的整个定义,但我不想写两次相同的
记录是仅限PL/SQL的数据类型,并且不能在SQL语句中使用。
流水线函数设计用于SQL语句,并且MUST返回可在SQL中使用的集合。
当您返回一个记录集合时,Oracle将隐式创建一个反映记录属性的OBJECT
数据类型,并将返回此对象的集合而不是记录(对象集合可以在SQL语句中使用(。
但是,OBJECT
不能包含具有RECORD
数据类型的属性。因此,当您尝试创建返回具有嵌套记录属性的记录集合的流水线函数时,Oracle无法隐式创建反映该记录的Object,因为嵌套记录不兼容,因此创建PIPELINED
函数将失败。
任一:
- 使用在SQL作用域中创建的
OBJECT
数据类型(而不是记录(;或 - 不要在记录中嵌套记录