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 CLICAR AQUI !
Referências
Cara, ajudou muito !