Oracle
 sql >> Baza danych >  >> RDS >> Oracle

Zagnieżdżona funkcja PIPELINED

Twoje funkcje zwracają data_type_1 , a kolekcja tabel również próbuje to wykorzystać. Ale oba wymagają typu kolekcji, nawet jeśli oczekujesz, że zwrócą tylko jedną wartość (w takim przypadku nie ma zbyt dużego potokowania punktowego). Nie można bezpośrednio potoku typu kolekcji, należy potoku członka kolekcji. Więc data_type_1 powinien być typem skalarnym lub typu obiekt/rekord, a potrzebujesz innego typu, który jest ich kolekcją.

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

Dodałem więc typ tabeli istniejącego data_type_1 i zmieniono definicje funkcji, aby zamiast tego zwracały ten typ tabeli. pipe row nadal używa data_type_1 - każdy jest wierszem w typie tabeli. Twoja pętla potrzebuje zapytania dla swojego kursora, a nie bezpośredniego wywołania table() , więc to też zmieniłem. Oraz pipe row(sub_func); również musi być podobną pętlą nad zapytaniem.

Oznaczyłeś to tylko jako PL/SQL, ale dlatego, że możesz chcieć wywołać main_xyz ze zwykłego SQL, a ponieważ wywołujesz podfunkcje z kontekstu SQL w tych pętlach, data_type_1 i table_type_1 należy utworzyć na poziomie schematu, a nie w PL/SQL. (Zmieniło się to nieco w 12c ale nie wystarczy, aby pomóc tutaj).

Jeśli chciałbyś mieć je jako typy PL/SQL, zadeklarowane w specyfikacji pakietu, to nie mógłbyś wywołać funkcji z kontekstu innego niż PL/SQL i musiałbyś zastąpić pętle wywołaniem funkcji po którym następuje iteracja po zwróconej kolekcji.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Czy ktoś mógłby wyjaśnić, co tak naprawdę robi instrukcja MERGE w Oracle?

  2. Zbyt mały bufor ciągu znaków w procedurze składowanej Oracle

  3. Jak skonfigurować audyt Oracle EBS

  4. Ogranicz zapytanie o usunięcie z hibernacją

  5. jak zwrócić dynamiczny zestaw wyników w funkcji Oracle