Oracle
 sql >> база данни >  >> RDS >> Oracle

Вложена функция PIPELINED

Вашите функции връщат data_type_1 , а колекцията от таблици се опитва да консумира и това. Но и двете се нуждаят от тип колекция, дори ако очаквате да върнат само една стойност (в който случай няма много смисъл от конвейерна обработка). Не можете да превеждате тип колекция директно, превеждате член на колекцията. Така че data_type_1 трябва да бъде скаларен тип или тип обект/запис и имате нужда от друг тип, който е колекция от тях.

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

Така че добавих тип таблица към вашия съществуващ data_type_1 и промени дефинициите на функцията, за да върне вместо това този тип таблица. pipe row все още използва data_type_1 - всеки е ред в типа таблица. Вашият цикъл се нуждае от заявка за своя курсор, а не от директно извикване на table() , така че промених и това. И pipe row(sub_func); също трябва да има подобен цикъл върху заявка.

Маркирахте това само като PL/SQL, но защото може да възнамерявате да извикате main_xyz от обикновен SQL и тъй като извиквате подфункциите от SQL контекст в тези цикли, data_type_1 и table_type_1 трябва да бъдат създадени на ниво схема, а не в PL/SQL. (Това се промени малко в 12c но не достатъчно, за да помогне тук).

Ако искате да ги имате като PL/SQL типове, декларирани в спецификацията на пакета, тогава не можете да извикате функцията от различен от PL/SQL контекст и ще трябва да замените циклите с извикване на функция последвано от итерация върху върнатата колекция.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. увеличаване на ширината на страницата в инструмента за създаване на отчети на oracle

  2. Липсва STOPKEY на дял в плана на Oracle за страниране по локален индекс

  3. Автоматично увеличение за Oracle

  4. Как да накарате to_number да игнорира нечислови стойности

  5. Липсва дясна скоба при SQL команда за създаване на таблица