Oracle
 sql >> Base de Dados >  >> RDS >> Oracle

Função PIPELINED aninhada


Suas funções estão retornando data_type_1 , e a coleção de tabelas está tentando consumir isso também. Mas ambos precisam de um tipo de coleção, mesmo que você espere que eles retornem apenas um único valor (nesse caso, não há muito pipelining de ponto). Você não pode canalizar um tipo de coleção diretamente, você canaliza um membro da coleção. Então data_type_1 deve ser um tipo escalar ou objeto/registro, e você precisa de outro tipo que seja uma coleção deles.
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;
/

Então, adicionei um tipo de tabela de seu data_type_1 existente , e alterou as definições de função para retornar esse tipo de tabela. A pipe row ainda usa data_type_1 - cada uma é uma linha no tipo de tabela. Seu loop precisa de uma consulta para seu cursor, não de uma chamada direta para table() , então eu mudei isso também. E a linha pipe row(sub_func); também precisa ser um loop semelhante em uma consulta.

Você apenas marcou isso como PL/SQL, mas porque você pode pretender chamar main_xyz do SQL simples e porque você está chamando as subfunções de um contexto SQL nesses loops, data_type_1 e table_type_1 precisam ser criados no nível do esquema em vez de em PL/SQL. (Isso mudou um pouco em 12c mas não o suficiente para ajudar aqui).

Se você quisesse tê-los como tipos PL/SQL, declarados na especificação do pacote, não poderia chamar a função de um contexto não PL/SQL e teria que substituir os loops por uma chamada para a função seguido por uma iteração sobre a coleção retornada.