Vaše funkce vracejí data_type_1
a kolekce stolů se to také snaží spotřebovat. Oba však potřebují typ kolekce, i když očekáváte, že budou vracet pouze jednu hodnotu (v takovém případě nedochází k přílišnému zřetězení bodů). Typ kolekce nemůžete předávat přímo, přepojujete člena kolekce. Takže data_type_1
by měl být skalární nebo objektový/záznamový typ a potřebujete jiný typ, který je jejich sbírkou.
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;
/
Takže jsem přidal typ tabulky vašeho stávajícího data_type_1
a změnila definice funkcí tak, aby místo toho vrátila tento typ tabulky. pipe row
stále používá data_type_1
- každý je řádek v typu tabulky. Vaše smyčka potřebuje dotaz pro svůj kurzor, nikoli přímé volání table()
, tak jsem to taky změnil. A pipe row(sub_func);
také musí být podobná smyčka přes dotaz.
Označili jste to pouze jako PL/SQL, ale protože možná máte v úmyslu volat main_xyz
z prostého SQL, a protože v těchto smyčkách voláte dílčí funkce z kontextu SQL, data_type_1
a table_type_1
je třeba vytvořit spíše na úrovni schématu než v PL/SQL. (Toto se v 12c trochu změnilo
ale ne dost na to, aby to pomohlo).
Pokud byste je chtěli mít jako typy PL/SQL, deklarované ve specifikaci balíčku, pak byste nemohli volat funkci z kontextu jiného než PL/SQL a museli byste nahradit smyčky voláním funkce. následuje iterace vrácené kolekce.