sql >> Database >  >> RDS >> Oracle

Geneste PIPELINED-functie

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.




  1. voeg autoincrement in tweede kolom in

  2. Selecteer het laatste record uit de rechtertabel bij gebruik van join in mysql

  3. DB-codes voor formulieren instellen

  4. MySql invoegen in selectiequery is te traag om 100 miljoen rijen te kopiëren