Dine funktioner returnerer data_type_1
, og det forsøger bordsamlingen også at forbruge. Men begge har brug for en indsamlingstype, selvom du forventer, at de kun returnerer en enkelt værdi (i så fald er der ikke meget point-pipelining). Du kan ikke sende en indsamlingstype direkte, du sender et medlem af samlingen. Så data_type_1
skal være en skalar- eller objekt-/posttype, og du har brug for en anden type, som er en samling af dem.
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;
/
Så jeg har tilføjet en tabeltype af din eksisterende data_type_1
, og ændrede funktionsdefinitionerne for at returnere denne tabeltype i stedet. pipe row
bruger stadig data_type_1
- hver er en række i tabeltypen. Din løkke har brug for en forespørgsel til dens markør, ikke et direkte kald til table()
, så det har jeg også ændret. Og pipe row(sub_func);
skal også være en lignende løkke over en forespørgsel.
Du har kun tagget dette som PL/SQL, men fordi du måske har til hensigt at kalde main_xyz
fra almindelig SQL, og fordi du kalder underfunktionerne fra en SQL-kontekst i disse sløjfer, data_type_1
og table_type_1
skal oprettes på skemaniveau i stedet for i PL/SQL. (Dette har ændret sig en smule i 12c
men ikke nok til at hjælpe her).
Hvis du ville have dem som PL/SQL-typer, erklæret i pakkespecifikationen, så kunne du ikke kalde funktionen fra en ikke-PL/SQL-kontekst, og du skulle erstatte sløjferne med et kald til funktionen efterfulgt af en iteration over den returnerede samling.