GPO ( Grupo de Profissionais Oracle )
A maior comunidade Oracle do Brasil !

Utilizando PIPELINED

Utilizando PIPELINED

Bom dia !

O seu artigo Retornando uma TABELA através de uma função me ajudou muito, mas aí me restou uma dúvida. É possível retornar uma tabela sem utilizar um TYPE criado no banco de dados ?

Naiara


Bom, se eu entendi bem a sua pergunta, você gostaria de ter o mesmo resultado (retornar um TABLE) mas sem criar TYPEs no banco de dados. A resposta é simples, é possível mas temos que usar alguns subterfúgios.

Para isso utilizaremos o PIPELINED. Então vamos começar a codificar.

CREATE OR REPLACE PACKAGE pkg_test_pipe IS
TYPE linha IS
RECORD
(
codigo NUMBER
,nome VARCHAR2(200)
);

TYPE tabela IS TABLE OF linha;

FUNCTION tab_pipe
RETURN tabela PIPELINED;

END pkg_test_pipe;

Package PKG_TEST_PIPE compilado

CREATE OR REPLACE PACKAGE BODY pkg_test_pipe
IS
  FUNCTION tab_pipe
  RETURN tabela PIPELINED 
  IS
    v_tabela tabela := tabela();
 
   BEGIN
      FOR x IN 1..10
      LOOP
         v_tabela.EXTEND;
         v_tabela(x).codigo := x;
         v_tabela(x).nome   := 'EMPRESA ' || x;
         
         PIPE ROW(v_tabela(x));
      END LOOP;
      
   RETURN;
   
   END tab_pipe;
BEGIN
   NULL;
END pkg_test_pipe;

Package Body PKG_TEST_PIPE compilado

Criei uma FUNCTION que retorna PIPELINED. O truque para não utilizar TYPEs criados no banco de dados, é encapsulá-los dentro de uma PACKAGE. Observe que tanto a FUNCTION quanto os TYPEs, estão dentro da PACKAGE PKG_TEST_PIPE. Agora vamos testar o código.

SELECT * FROM TABLE(PKG_TEST_PIPE.tab_pipe)
/

CODIGO NOME
------ ---------------
1 EMPRESA 1
2 EMPRESA 2
3 EMPRESA 3
4 EMPRESA 4
5 EMPRESA 5
6 EMPRESA 6
7 EMPRESA 7
8 EMPRESA 8
9 EMPRESA 9
10 EMPRESA 10

Agora vamos testá-lo dentro de um bloco anônimo:

DECLARE
CURSOR c_tabela IS
SELECT * FROM TABLE(PKG_TEST_PIPE.tab_pipe);

BEGIN
FOR x IN c_tabela
LOOP
DBMS_OUTPUT.put_line(x.codigo || '-' || x.nome);

END LOOP;

END;

1-EMPRESA 1
2-EMPRESA 2
3-EMPRESA 3
4-EMPRESA 4
5-EMPRESA 5
6-EMPRESA 6
7-EMPRESA 7
8-EMPRESA 8
9-EMPRESA 9
10-EMPRESA 10

É isso aí, espero ter ajudado ! 🙂

Para quem quiser ler o artigo anterior utilizando TYPEs, basta acessar o link abaixo:

Referências

Share

You may also like...

1 Response

  1. Yan disse:

    Cara, ajudou muito !

Deixe um comentário

O seu endereço de e-mail não será publicado.