Pular para o conteúdo

Utilizando PIPELINED: Retornando uma TABELA sem utilizar TYPEs no banco de dados

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


Utilizando PIPELINED

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 CLICAR AQUI !

Referências

Sergio Willians

Sergio Willians

Sergio Willians é o fundador do GPO (Grupo de Profissionais Oracle) e possui quase 30 anos de experiência em tecnologias Oracle, sendo especialista em desenvolvimento Forms/Reports, PL/SQL e EBS (E-Business Suite) nos módulos Receivables, Payables e General Ledger. Atualmente trabalha na Scania Latin America, onde se dedica à área de integração de dados com Confluent Kafka. Sua paixão é compartilhar conhecimento com a comunidade Oracle, contribuindo para o crescimento e a excelência da plataforma.

Comentário(s) da Comunidade

Deixe um comentário

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *

plugins premium WordPress