Pesquisar no Programero

sexta-feira, 19 de julho de 2013

Loop com execute immediate (Oracle)

A pouco tempo atrás me peguei imaginando como percorrer um conjunto de dados gerado por uma consulta a ser construida. Bom para executar uma consulta nesse formato usamos o “EXECUTE IMMEDIATE”, até ai sem novidades, mas e o loop? Para resolver isso executamos a consulta, colocamos o resultado em uma coleção (BULK COLLECT) e realizamos loop nessa coleção, simples não? 

Agora vamos ao código:    

CREATE OR REPLACE PROCEDURE PRC_EXECIMMEDIATE
AS
  TYPE ItemRec IS RECORD ( 
    item_id NUMBER,
    dup_cnt NUMBER);
  TYPE ItemSet IS TABLE OF ItemRec;
  dup_items ItemSet;
BEGIN
  EXECUTE IMMEDIATE
    ' SELECT deptno, COUNT(DISTINCT ename) dup_cnt ' ||
    '   FROM emp ' ||
    '  GROUP BY deptno ' ||
    ' HAVING COUNT(DISTINCT ename) > 1'
    BULK COLLECT
    INTO dup_items;
  FOR i IN dup_items.FIRST..dup_items.LAST
  LOOP
    dbms_output.put_line( dup_items(i).item_id );
    -- processamento aqui
  END LOOP;
END PRC_EXECIMMEDIATE;



Nenhum comentário:

Postar um comentário

Obrigado por Participar do programero, fique a vontade para agradecer, retificar, perguntar ou sugerir.