Array / Record num pl/sql no oracle

Para quem trabalha com PL/SQL as vezes precisa usar tabelas temporarias para pegar algumas informaçoes e depois ficar fazendo select´s em cima de tabelas temporarias, e o pior... esquecem muitas vezes de limpar estas tabelas do banco.
Uma boa dica seria usar um ARRAY, assim podemos criar um record.
Aqui vou mostrar a criação de um array do tipo table sem pegar os dados de uma tabela e alimenta-la desde o zero e depois consultar os seus dados.

Estou usando a tabelateste onde tem o codigo e descricao e estou inserindo as descricoes de um unico codigo no meu array. Bom uma simples aplicação mas muito util para transportar dados de um select sem usar cursor ou tabela temporaria.

  1.  
  2. SET serverout ON;
  3.  
  4. CREATE OR REPLACE procedure TesteRafa AS
  5. type my_lista_rec IS record(
  6. campo1 varchar2(100),
  7. campo2 number);
  8. type a_lista IS TABLE of my_lista_rec INDEX BY binary_integer;
  9.  
  10. lista a_lista;
  11.  
  12. CURSOR cCor IS
  13. SELECT DESCRICAO FROM TABELATESTE WHERE CODIGO = '011';
  14. rCor cCor%rowtype;
  15. contador number;
  16. BEGIN
  17. contador := 0;
  18. open cCor;
  19. loop
  20. fetch cCor
  21. INTO rCor;
  22. exit when cCor%notfound;
  23. begin
  24. lista(contador).campo1 := rCor.descricao;
  25. lista(contador).campo2 := contador;
  26. contador := contador + 1;
  27. end;
  28. end loop;
  29. close cCor;
  30. contador := 0;
  31. FOR i IN lista.first .. lista.last loop
  32. dbms_output.put_line(lista(i).campo1);
  33. end loop;
  34. -- retificando
  35. /* Limpando tabelas de memória */
  36. lista.DELETE;
  37. END;
  38. /
  39.  
  1.  
  2. execute TesteRafa;
  3.  

e aqui vai aparecer os dados do record, claro para fazer este teste é bom vc polular a tabela de teste para ele colocar alguma coisa no record do pl/sql e dps imprimir algo.

Deveshed
oreillynet
sqlmagazine


4 Comments

  1. Eduardo disse:

    Em seu exemplo de “Array / Record num PL/SQL no Oracle”, fiquei em dúvida sobre quem estará fechando o “lista”?
    No caso do cursor existe um comando “CLOSE” fechando “cCor”, mas quem fecha o “lista”?
    Se eu não fechar o que ocorre?
    Tenho uma situação onde uma package fica na seção do usuário por muito tempo. E esta contém uma varray global (definida no cabeçalho da package) que só some quando refaço a conexão.
    Como faço para fechar este varray?

  2. .rafa disse:

    interessante, estive vendo isso ai e uma coisa que estou adotando eh limpar o record q fiz.

    colocando o seguinte comando lista.delete;

    estarei retificando o meu post e vou dar uma olhada no que vc disse… se tiveres um exemplo eu agradeceria..  

  3. Gomes disse:

    Nota 10.. muito bom mesmo, simples eficiente e pratico.

  4. many thanks for this excellent share! , Enjoyed Going Though
    It !!


Deixe uma resposta

O seu endereço de email não será publicado Campos obrigatórios são marcados *

*


*

Você pode usar estas tags e atributos de HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>