Selecionar dados de uma function que retorna sys_refcursor

Dúvidas, dicas e truques de PL/SQL. Aqui também vão assuntos relacionados a pacotes, triggers, funções, Java-Stored Procedures, etc
Responder
Avatar do usuário
Spectreman
Rank: Programador Sênior
Rank: Programador Sênior
Mensagens: 48
Registrado em: Ter, 29 Mar 2005 4:56 pm
Localização: Tóquio
DOMINANTES, ÀS ORDENS!

Boa tarde, senhores!
Tenho a seguinte function:

Selecionar tudo

create or replace function fteste(xx in varchar2) return sys_refcursor is
rc sys_refcursor;
begin
open rc for select id_paciente,nome from pacientes where nome like '%'|| xx ||'%';
return rc;
end;
Quando executar a query:

Selecionar tudo

select * from table(fteste('TESTE'))
o erro ORA-22905: cannot access rows from a non-nested table item é apresentado.

Se executo a query da forma:

Selecionar tudo

select fteste('TESTE') from dual
uma única linha com um array é retornada.

O que estou fazendo de errado?
Eu quero simplesmente retornar essa function com linhas e colunas, como uma tabela.

Desde já agradeço,

Romilson Alves
Tinho
Rank: DBA Sênior
Rank: DBA Sênior
Mensagens: 317
Registrado em: Seg, 16 Nov 2009 4:50 pm
Localização: São Paulo - SP

Caro Romilson,

Creio que o seu problema possa ser resolvido com a utilização do "PIPELINED Table Function".

Tenho um material interessante sobre o assunto, retirado de artigos da internet:

... função de pipelined é aquela que retorna uma coleção de dados

Uma PIPELINED Table Function é uma função capaz de devolver várias linhas de resultados e são chamadas na cláusula FROM de uma instrução SELECT como se fosse uma tabela

... uma função de pipelined retorna sempre uma coleção de dados, precisamos criar a estrutura de retorno, que pode ser um Record Type ou um Array.

A cláusula “TABLE()” é um typecasting para tratar o resultado da função como se realmente fosse uma tabela.
Este recurso já oferece toda uma estrutura para que você possa retornar o resultado de um function como se fosse um tabela virtual.

Att.,
Tinho
Rank: DBA Sênior
Rank: DBA Sênior
Mensagens: 317
Registrado em: Seg, 16 Nov 2009 4:50 pm
Localização: São Paulo - SP

Apenas para citar um exemplo, segue abaixo:

Para executar um função com retorno PIPELENED, a sintaxe é a seguinte:

Selecionar tudo

select *
   from (table(package.function(  param1
                                 ,paramN...
                                )
))
Abç.,
Responder
  • Informação
  • Quem está online

    Usuários navegando neste fórum: Nenhum usuário registrado e 22 visitantes