Oracle
 sql >> Datenbank >  >> RDS >> Oracle

Verschachtelte PIPELINED-Funktion

Ihre Funktionen geben data_type_1 zurück , und die Tabellensammlung versucht, das auch zu verbrauchen. Aber beide benötigen einen Sammlungstyp, selbst wenn Sie erwarten, dass sie nur einen einzelnen Wert zurückgeben (in diesem Fall macht Pipelining nicht viel Sinn). Sie können einen Sammlungstyp nicht direkt leiten, sondern ein Mitglied der Sammlung leiten. Also data_type_1 sollte ein Skalar- oder Objekt-/Record-Typ sein, und Sie brauchen einen anderen Typ, der eine Sammlung davon ist.

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

Also habe ich einen Tabellentyp Ihres vorhandenen data_type_1 hinzugefügt , und die Funktionsdefinitionen geändert, um stattdessen diesen Tabellentyp zurückzugeben. Die pipe row verwendet immer noch data_type_1 - jeweils eine Zeile im Tabellentyp. Ihre Schleife benötigt eine Abfrage für ihren Cursor, keinen direkten Aufruf von table() , also habe ich das auch geändert. Und die pipe row(sub_func); muss auch eine ähnliche Schleife über eine Abfrage sein.

Sie haben dies nur als PL/SQL gekennzeichnet, weil Sie möglicherweise beabsichtigen, main_xyz aufzurufen aus einfachem SQL und weil Sie die Unterfunktionen in diesen Schleifen aus einem SQL-Kontext aufrufen, data_type_1 und table_type_1 müssen auf Schemaebene und nicht in PL/SQL erstellt werden. (Dies hat sich in 12c ein wenig geändert aber nicht genug, um hier zu helfen).

Wenn Sie sie als PL/SQL-Typen haben wollten, die in der Paketspezifikation deklariert sind, könnten Sie die Funktion nicht aus einem Nicht-PL/SQL-Kontext aufrufen, und Sie müssten die Schleifen durch einen Aufruf der Funktion ersetzen gefolgt von einer Iteration über die zurückgegebene Sammlung.