pl/sql 中的嵌套 PIPELINED 函数

Posted

技术标签:

【中文标题】pl/sql 中的嵌套 PIPELINED 函数【英文标题】:Nested PIPELINED function in pl/sql 【发布时间】:2015-10-20 10:19:33 【问题描述】:

我必须在 pl/sql 中编写一个嵌套的流水线函数,我尝试通过以下方式实现它。

create package body XYZ AS
    function main_xyz return data_type_1 pipelined is
        begin 
        --code
        pipe row(sub_func);
        end;
    function sub_func return data_type_1 pipelined is
        begin 
        --code
        pipe row(sub_func_1);
        end;
     function sub_func_1 return data_type_1 pipelined is
        begin 
        --code
        pipe row(main_abc);
        end;
 end;

create package body abc AS
        function main_abc return data_type_2 pipelined is
            var data_type_2;
            begin 
            --code
             return var;
            end;
  end;

但是,我收到以下错误

[错误] PLS-00653:PLS-00653:聚合/表函数不是 在 PL/SQL 范围内允许

我哪里错了?是语法还是逻辑?

【问题讨论】:

如果我有多个嵌套的流水线函数怎么办?这种情况应该怎么办? 类似问题:@***.com/questions/34896856/nested-pipelined-function 【参考方案1】:

流水线函数一一提供行(按需),因此您不能一次从流水线函数中放置所有行。

在我看来,您需要这样更改main_xyz

function main_xyz return data_type_1 pipelined is
 begin 

   --code

   FOR rec IN (select * from table(XYZ.sub_func)) LOOP
       pipe row(rec);
   END LOOP;
 end;

考虑到sub_func 必须在 XYZ 包的规范中,因为您在 SQL 查询中使用的所有内容(包括 PIPELINED 函数)都是公开的(即对运行查询的用户可见)。

更新:我忘记提醒:不要滥用管道函数(如果您有其他选择)- 使用它们的查询可能性能不佳,因为数据库引擎无法为“不可预测的管道行”构建良好的执行计划。

【讨论】:

谢谢。很快就会回复您。 如果我有多个嵌套的流水线函数怎么办?在这种情况下应该怎么做? @diziaq

以上是关于pl/sql 中的嵌套 PIPELINED 函数的主要内容,如果未能解决你的问题,请参考以下文章

PL SQL 替代嵌套异常

如何从pl sql表中的嵌套表中获取值

Oracle PL/SQL 使用 XMLTABLE 解析 xml 中的嵌套对象

具有布尔返回值的 pl/sql 函数的 OracleType?

PL/SQL查询中的空值问题

使用嵌套表在 Oracle PL/SQL 中构建动态 SQL