关于oracle:pl/sql中的嵌套PIPELINED函数

Nested PIPELINED function in pl/sql

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
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;

但是,我收到以下错误

[Error] PLS-00653 : PLS-00653: aggregate/table functions are not
allowed in PL/SQL scope

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


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

在我看来,您需要以这种方式更改 main_xyz

1
2
3
4
5
6
7
8
9
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 函数)都是公开的(即对运行查询的用户可见)。

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