Je functies retourneren data_type_1
, en de tafelcollectie probeert dat ook te consumeren. Maar beide hebben een verzamelingstype nodig, zelfs als u verwacht dat ze slechts één waarde retourneren (in dat geval is er niet veel puntpipelining). Je kunt een collectietype niet rechtstreeks pipen, je pipet een lid van de collectie. Dus data_type_1
moet een scalair of object/recordtype zijn, en je hebt een ander type nodig dat een verzameling hiervan is.
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;
/
Dus ik heb een tabeltype toegevoegd van je bestaande data_type_1
, en de functiedefinities gewijzigd om in plaats daarvan dat tabeltype te retourneren. De pipe row
gebruikt nog steeds data_type_1
- elk is een rij in het tabeltype. Je lus heeft een query nodig voor zijn cursor, geen directe aanroep naar table()
, dus dat heb ik ook veranderd. En de pipe row(sub_func);
moet ook een soortgelijke lus zijn over een zoekopdracht.
Je hebt dit alleen getagd als PL/SQL, maar omdat je misschien van plan bent om main_xyz
te bellen van gewone SQL, en omdat je de subfuncties aanroept vanuit een SQL-context in die lussen, data_type_1
en table_type_1
moeten op schemaniveau worden gemaakt in plaats van in PL/SQL. (Dit is een beetje veranderd in 12c
maar niet genoeg om hier te helpen).
Als je ze als PL/SQL-types wilt hebben, gedeclareerd in de pakketspecificatie, dan zou je de functie niet kunnen aanroepen vanuit een niet-PL/SQL-context en zou je de lussen moeten vervangen door een aanroep van de functie gevolgd door een herhaling van de geretourneerde verzameling.