Dina funktioner returnerar data_type_1
, och bordssamlingen försöker konsumera det också. Men båda behöver en insamlingstyp, även om du förväntar dig att de bara ska returnera ett enstaka värde (i vilket fall det inte finns så mycket poäng i pipelining). Du kan inte pipe en samlingstyp direkt, du piper en medlem i samlingen. Alltså data_type_1
bör vara en skalär eller objekt-/posttyp, och du behöver en annan typ som är en samling av dessa.
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å jag har lagt till en tabelltyp av din befintliga data_type_1
, och ändrade funktionsdefinitionerna för att returnera den tabelltypen istället. pipe row
använder fortfarande data_type_1
- var och en är en rad i tabelltypen. Din loop behöver en fråga för sin markör, inte ett direktanrop till table()
, så jag har ändrat det också. Och pipe row(sub_func);
måste också vara en liknande loop över en fråga.
Du har bara taggat detta som PL/SQL men för att du kanske tänker anropa main_xyz
från vanlig SQL, och eftersom du anropar underfunktionerna från en SQL-kontext i dessa slingor, data_type_1
och table_type_1
måste skapas på schemanivå snarare än i PL/SQL. (Detta har ändrats lite i 12c
men inte tillräckligt för att hjälpa här).
Om du ville ha dem som PL/SQL-typer, deklarerade i paketspecifikationen, så kunde du inte anropa funktionen från en icke-PL/SQL-kontext, och du måste ersätta looparna med ett anrop till funktionen följt av en iteration över den returnerade samlingen.