Oracle: Retornando dados através de uma função

Mais uma beleza de recurso do Oracle a ser testado! Chama-se Table Function, segue a definição dada pela documentação [1]:

Oracle9i's table functions provide the support for pipelined and parallel execution of transformations implemented in PL/SQL, C, or Java. Scenarios as mentioned earlier can be done without requiring the use of intermediate staging tables, which interrupt the data flow through various transformations steps.

Em outras palavras, resumidamente falando e especificamente do que irei tratar neste post: é a possibilidade de uma função retornar resultados como se fosse uma query, sem esperar terminar sua execução para retornar as informações.

Antes de mais nada, precisamos criar um tipo que represente uma linha desse resultado que será criado dentro da função.

Exemplo:

SQL> create or replace type teste_t as object (
  2  	nome varchar2(10),
  3  	idade number
  4  );
  5  /
 
Tipo criado.

Feito isso, o próximo passo é criar um outro tipo, agora um para representar um conjunto dessas linhas.

SQL> create type teste_t2 as table of teste_t;
  2  /
 
Tipo criado.

Agora vamos criar uma função para testar o que foi criado acima, mas sem usar qualquer tabela para prover os dados, ou seja, vamos gerá-los na mão!

  1  create or replace function teste_f return teste_t2 pipelined is
  2  begin
  3	 pipe row (teste_t('tiger', 99));
  4* end;
  5  /
 
Função criada.

E então...

SQL> select * from table(teste_f());
 
NOME				    IDADE
------------------------------ ----------
tiger				       99

Show de bola, não? :D

O importante a notar sobre este recurso, é que os resultados são retornados em subsets. Conseguentemente sendo mais rápido que aguardar todo o processamento para retornar o conjunto inteiro dos dados. Um exemplo disto pode ser visto no artigo http://www.oracle-base.com/articles/9i/PipelinedTableFunctions9i.php

Testar retornando dados de uma tabela/view também não tem mistério.

SQL> create or replace type query_t as object (name varchar2(128), sql_text varchar2(100));
  2  /
 
Tipo criado.
 
SQL> create or replace type query_t2 as table of query_t;
  2  /
 
Tipo criado.

  1  create or replace function teste_f return query_t2 pipelined is
  2  begin
  3    for c in (select name, text
  4		   from user_source
  5		   where line = 1)
  6    loop
  7    	pipe row (query_t(c.name, c.text));
  8    end loop;
  9* end;
SQL> /
 
Função criada.

Vários outros detalhes e formas de uso deste recurso podem ser encontrados na documentação.

[1] - http://download-west.oracle.com/docs/cd/B10501_01/server.920/a96520/tran...

Post new comment

The content of this field is kept private and will not be shown publicly.
  • Web page addresses and e-mail addresses turn into links automatically.
  • Allowed HTML tags: <a> <em> <strong> <cite> <code> <ul> <ol> <li> <dl> <dt> <dd>
  • Lines and paragraphs break automatically.

More information about formatting options