Twoje funkcje zwracają data_type_1
, a kolekcja tabel również próbuje to wykorzystać. Ale oba wymagają typu kolekcji, nawet jeśli oczekujesz, że zwrócą tylko jedną wartość (w takim przypadku nie ma zbyt dużego potokowania punktowego). Nie można bezpośrednio potoku typu kolekcji, należy potoku członka kolekcji. Więc data_type_1
powinien być typem skalarnym lub typu obiekt/rekord, a potrzebujesz innego typu, który jest ich kolekcją.
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;
/
Dodałem więc typ tabeli istniejącego data_type_1
i zmieniono definicje funkcji, aby zamiast tego zwracały ten typ tabeli. pipe row
nadal używa data_type_1
- każdy jest wierszem w typie tabeli. Twoja pętla potrzebuje zapytania dla swojego kursora, a nie bezpośredniego wywołania table()
, więc to też zmieniłem. Oraz pipe row(sub_func);
również musi być podobną pętlą nad zapytaniem.
Oznaczyłeś to tylko jako PL/SQL, ale dlatego, że możesz chcieć wywołać main_xyz
ze zwykłego SQL, a ponieważ wywołujesz podfunkcje z kontekstu SQL w tych pętlach, data_type_1
i table_type_1
należy utworzyć na poziomie schematu, a nie w PL/SQL. (Zmieniło się to nieco w 12c
ale nie wystarczy, aby pomóc tutaj).
Jeśli chciałbyś mieć je jako typy PL/SQL, zadeklarowane w specyfikacji pakietu, to nie mógłbyś wywołać funkcji z kontekstu innego niż PL/SQL i musiałbyś zastąpić pętle wywołaniem funkcji po którym następuje iteracja po zwróconej kolekcji.