Oracle 应用管道函数时出现PLS-00653:在PL/SQL 定义域内不允许有聚集/表函数
下面是有关pipelined在生活中的用遇到的一些问题:
1.创建一个表类型的B
create or replace type T as table of varchar(300)
2.比如我们创建一个带pipelied 管道函数返回一张表或一个数据源数据的函数A create or replace function A(paras varchar2)
return T pipelined
is
begin
....
return;--注意这边直接返回就可以了
end A;
和创建一个不带该管道函数同样也返回一张表的类型的函数B。
create or replace function B(paras varchar2)
return T
is
var_out T;
begin
....
return var_out;--这边必须有个输出参数作为返回值
end B;
3.接下来我们创建一个存储过程C 去调用A 和B
create or replace procedure C(paras varchar2)
is
var_out T;
begin
-- 方法(1)
T:=A('parasValues');--这边调用带pipelined 函数的函数A ---直接报错PLS-00653: 在PL/SQL 定义域内不允许有聚集/表函数
这是因为管道函数需要用TABLE 操作符从SQL 查询中调用它所以这边不能直接赋值
这边要赋值可以这样修改
select A('parasValues') into T from dual; 就可以
-- 方法(2)
T:=B('parasValues');--这边调用函数B
....
end C;