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.