sql >> Databáze >  >> RDS >> Oracle

Vnořená funkce PIPELINED

Vaše funkce vracejí data_type_1 a kolekce stolů se to také snaží spotřebovat. Oba však potřebují typ kolekce, i když očekáváte, že budou vracet pouze jednu hodnotu (v takovém případě nedochází k přílišnému zřetězení bodů). Typ kolekce nemůžete předávat přímo, přepojujete člena kolekce. Takže data_type_1 by měl být skalární nebo objektový/záznamový typ a potřebujete jiný typ, který je jejich sbírkou.

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;
/

Takže jsem přidal typ tabulky vašeho stávajícího data_type_1 a změnila definice funkcí tak, aby místo toho vrátila tento typ tabulky. pipe row stále používá data_type_1 - každý je řádek v typu tabulky. Vaše smyčka potřebuje dotaz pro svůj kurzor, nikoli přímé volání table() , tak jsem to taky změnil. A pipe row(sub_func); také musí být podobná smyčka přes dotaz.

Označili jste to pouze jako PL/SQL, ale protože možná máte v úmyslu volat main_xyz z prostého SQL, a protože v těchto smyčkách voláte dílčí funkce z kontextu SQL, data_type_1 a table_type_1 je třeba vytvořit spíše na úrovni schématu než v PL/SQL. (Toto se v 12c trochu změnilo ale ne dost na to, aby to pomohlo).

Pokud byste je chtěli mít jako typy PL/SQL, deklarované ve specifikaci balíčku, pak byste nemohli volat funkci z kontextu jiného než PL/SQL a museli byste nahradit smyčky voláním funkce. následuje iterace vrácené kolekce.




  1. Existuje způsob, jak přidat sloupec na zadanou pozici v tabulce Oracle?

  2. Potřebujete php pdo implode pole a vložit více řádků do mysql

  3. Potřebuji přiřadit všechny aktivity v SQL k jednomu ID, ale v současné době má každá aktivita tři ID

  4. Zahodit jedinečný klíč muli-column bez vypuštění cizího klíče?