Вложенная функция PIPELINED в pl / sql

Мне нужно написать вложенную конвейерную функцию в pl / sql, которую я пытался реализовать следующим образом.

create package body XYZ AS
    function main_xyz return data_type_1 pipelined is
        begin 
        --code
        pipe row(sub_func);
        end;
    function sub_func return data_type_1 pipelined is
        begin 
        --code
        pipe row(sub_func_1);
        end;
     function sub_func_1 return data_type_1 pipelined is
        begin 
        --code
        pipe row(main_abc);
        end;
 end;

create package body abc AS
        function main_abc return data_type_2 pipelined is
            var data_type_2;
            begin 
            --code
             return var;
            end;
  end;

Однако я получаю следующую ошибку

[Ошибка] PLS-00653: PLS-00653: агрегатные / табличные функции не разрешены в области PL / SQL.

Где я ошибаюсь? Это синтаксис или логика?


person user256378    schedule 20.10.2015    source источник
comment
Что делать, если у меня есть несколько вложенных конвейерных функций? что делать в таком случае?   -  person user256378    schedule 20.10.2015


Ответы (1)


Конвейерные функции предоставляют строки одну за другой (по запросу), поэтому вы не можете поместить все строки одновременно из конвейерной функции.

Мне кажется, вам нужно изменить main_xyz вот так:

function main_xyz return data_type_1 pipelined is
 begin 

   --code

   FOR rec IN (select * from table(XYZ.sub_func)) LOOP
       pipe row(rec);
   END LOOP;
 end;

Учтите, что sub_func должен быть в спецификации пакета XYZ, поскольку все, что вы используете в запросах SQL, включая функции PIPELINED, должно быть общедоступным (т.е. видимым для пользователя, выполняющего запрос).

ОБНОВЛЕНИЕ: я забываю предупредить: не злоупотребляйте конвейерными функциями (если у вас есть другой выбор) - запросы, использующие их, могут иметь низкую производительность, потому что механизм БД не может построить хороший план выполнения для непредсказуемых конвейерных строк.

person diziaq    schedule 20.10.2015
comment
Спасибо. Вернусь к вам в ближайшее время. - person user256378; 20.10.2015
comment
Что делать, если у меня есть несколько вложенных конвейерных функций? что делать в таком случае? @diziaq - person user256378; 20.10.2015