sexta-feira, 24 de janeiro de 2014

ORACLE-Trabalhando com cursores no Oracle

Trabalhando com cursores no Oracle

Trabalhar com cursores no Oracle é algo sensacional. Muito útil quando precisamos trabalhar com repetições, varrer view, tabelas. Podemos utilizar em praticamente em qualquer lugar.

O tipo de cursor que irei mostrar, é com o FOR. Existem outras formas de trabalhar com cursores mas vou postando aos poucos.

Cursor do tipo FOR

O tipo for faz um controle completo da memória. Ele substitui diversas camadas que em outro tipo FETCH CURSOR faz.
Ele cria todos os tipos, variáveis que irão receber os dados, gerencia a abertura e o fechamento do cursor, além de controlar o início e o fim da linha.
O cursor trabalha de forma unidirecional, ou seja, ele sempre inicia pelo primeiro registro e varre as informações até o final. É possível sair do cursor a qualquer momento mas não é possível voltar ao início do primeiro registro.

Vamos ver na prática como esta maravilha funciona.

Note que não me preocupei em criar primary key, estou preocupado em:

Criar uma tabela para testarmos

CREATE TABLE TABELA (
       SEQUENCIAL NUMBER,
       DESCRICAO VARCHAR2(10),
       VALOR NUMBER(12,1)
       )

Populando dados com FOR através de um bloco anônimo

DECLARE
  CONTADOR NUMBER := 0;
BEGIN
  FOR CONTADOR IN 1 .. 20 LOOP
    INSERT INTO TABELA
      (SEQUENCIAL, DESCRICAO, VALOR)
    VALUES
      (CONTADOR, 'DESC.: ' || TO_CHAR(CONTADOR), (2 * CONTADOR));
  END LOOP;
  COMMIT;
END;

Com a informação populada, veja um exemplo bem simples do FOR funcionando

DECLARE
  -- Declaração da variavel de memória
  CONTADOR NUMBER := 0;
BEGIN
  FOR NomeDoCursor IN (SELECT * FROM TABELA) LOOP
    -- Inicio
    DBMS_OUTPUT.put_line(NomedoCursor.DESCRICAO);
    CONTADOR := CONTADOR + 1;
    EXIT WHEN CONTADOR > 100; -- saída opcional
  END LOOP; -- Fim
END;

No exemplo acima, o trecho EXIT WHEN é uma forma de saída do laço, não é obrigatório adicionar esta linha. No bloco anônimo, é possível colocar cursor alinhado, exception, etc.
Aos poucos irei postar um exemplo mais elaborado com EXCEPTION e desvios.




Nenhum comentário:

Postar um comentário