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

pexxcrt2  于 2022-11-03  发布在  Oracle
关注(0)|答案(1)|浏览(178)
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的整个定义,但我不想写两次相同的东西

kpbwa7wx

kpbwa7wx1#

记录是仅PL/SQL数据类型,不能用于SQL语句。
流水线函数设计用于SQL语句,并且必须返回可用于SQL的集合。
当您返回一个记录集合时,Oracle将隐式创建一个反映记录属性的OBJECT数据类型,并将返回此对象的集合而不是记录(并且对象的集合可以在SQL语句中使用)。
但是,OBJECT不能包含具有RECORD数据类型的属性。因此,当您尝试创建返回具有嵌套记录属性的记录集合的管道函数时,Oracle无法隐式创建反映该记录的对象,因为嵌套记录不兼容,因此创建PIPELINED函数将失败。
可以是:

  • 使用在SQL作用域中创建的OBJECT数据类型(而不是记录);或
  • 不要在记录内嵌套记录。

相关问题