Вашите функции връщат data_type_1
, а колекцията от таблици се опитва да консумира и това. Но и двете се нуждаят от тип колекция, дори ако очаквате да върнат само една стойност (в който случай няма много смисъл от конвейерна обработка). Не можете да превеждате тип колекция директно, превеждате член на колекцията. Така че data_type_1
трябва да бъде скаларен тип или тип обект/запис и имате нужда от друг тип, който е колекция от тях.
create type data_type_1 as object (x number, y number)
/
create type table_type_1 as table of data_type_1
/
create or replace package xyz AS
function main_xyz return table_type_1 pipelined;
function sub_func return table_type_1 pipelined;
function sub_func1 return table_type_1 pipelined;
end xyz;
/
create or replace package body xyz as
function main_xyz return table_type_1 pipelined is
begin
--code
for rec in (select * from table(sub_func)) loop
pipe row(data_type_1(rec.x, rec.y));
end loop;
for rec in (select * from table(sub_func1)) loop
pipe row(data_type_1(rec.x, rec.y));
end loop;
end;
function sub_func return table_type_1 pipelined is
def data_type_1;
begin
--code
pipe row(def); --def is data_type_1
end sub_func;
function sub_func1 return table_type_1 pipelined is
abc data_type_1;
begin
--code
loop
pipe row (abc); --abc is data_type_1
end loop;
end sub_func1;
end xyz;
/
Така че добавих тип таблица към вашия съществуващ data_type_1
и промени дефинициите на функцията, за да върне вместо това този тип таблица. pipe row
все още използва data_type_1
- всеки е ред в типа таблица. Вашият цикъл се нуждае от заявка за своя курсор, а не от директно извикване на table()
, така че промених и това. И pipe row(sub_func);
също трябва да има подобен цикъл върху заявка.
Маркирахте това само като PL/SQL, но защото може да възнамерявате да извикате main_xyz
от обикновен SQL и тъй като извиквате подфункциите от SQL контекст в тези цикли, data_type_1
и table_type_1
трябва да бъдат създадени на ниво схема, а не в PL/SQL. (Това се промени малко в 12c
но не достатъчно, за да помогне тук).
Ако искате да ги имате като PL/SQL типове, декларирани в спецификацията на пакета, тогава не можете да извикате функцията от различен от PL/SQL контекст и ще трябва да замените циклите с извикване на функция последвано от итерация върху върнатата колекция.