sql >> Databasteknik >  >> RDS >> Oracle

Kapslad PIPELINED-funktion

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.




  1. Mysql:Uppdateringsfält för senaste posten

  2. MySQLi klassmönster för anslutning, stäng, lämna öppen?

  3. Hur man använder lagrad proc i log4net-konfiguration för SQL Server för loggning

  4. Ta bort dubbletter av rader i SQL Server