是否可以创建一个管道表函数,返回一个记录的表


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数据类型(而不是记录(;或
  • 不要在记录中嵌套记录

最新更新