pl/sql 中的嵌套 PIPELINED 函数
Nested PIPELINED function in pl/sql
我必须在 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;
但是,我收到以下错误
[Error] PLS-00653 : PLS-00653: aggregate/table functions are not
allowed in PL/SQL scope
我哪里错了?是语法还是逻辑?
流水线函数逐行提供(按需),因此您不能一次从流水线函数中放置所有行。
在我看来你需要这样改变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 函数)都将是 public(即对运行查询的用户可见).
更新:我忘了警告:不要滥用流水线函数(如果您有其他选择)- 使用它们的查询可能性能不佳,因为数据库引擎无法为“不可预测的流水线行”构建良好的执行计划。
我必须在 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;
但是,我收到以下错误
[Error] PLS-00653 : PLS-00653: aggregate/table functions are not allowed in PL/SQL scope
我哪里错了?是语法还是逻辑?
流水线函数逐行提供(按需),因此您不能一次从流水线函数中放置所有行。
在我看来你需要这样改变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 函数)都将是 public(即对运行查询的用户可见).
更新:我忘了警告:不要滥用流水线函数(如果您有其他选择)- 使用它们的查询可能性能不佳,因为数据库引擎无法为“不可预测的流水线行”构建良好的执行计划。