quarta-feira, 17 de abril de 2013

Oracle - PL-SQL - Comandos (Cursores)

Apresento como trabalhar com Cursores no Oracle


Exemplo cursor LOOP Simples


SET SERVEROUTPUT ON
DECLARE CURSOR cur IS  SELECT * FROM tb_tabela;
        linha cur%ROWTYPE;
BEGIN
    OPEN cur;
    LOOP
        FETCH cur INTO linha;
        EXIT WHEN cur%NOTFOUND;       
        /* 
           comandos
           DBMS_OUTPUT.PUT_LINE(linha.campo_tabela);
        */
    END LOOP;
    CLOSE cur;
END;


Exemplo cursor LOOP WHILE


SET SERVEROUTPUT ON
DECLARE CURSOR cur IS SELECT * FROM tb_tabela;       
        linha cur%ROWTYPE;
BEGIN
    OPEN cur;
    FETCH cur INTO linha;
    WHILE cur%FOUND LOOP      
        /* 
           comandos
           DBMS_OUTPUT.PUT_LINE(linha.campo_tabela);
        */
        FETCH cur INTO linha;    
    END LOOP;
    CLOSE cur;
END;


Exemplo cursor LOOP FOR


SET SERVEROUTPUT ON
DECLARE CURSOR cur IS  SELECT * FROM tb_tabela;       
BEGIN
    FOR linha IN cur LOOP
        /* 
           comandos
           DBMS_OUTPUT.PUT_LINE(linha.campo_tabela);
        */
    END LOOP;
END;


Exemplo cursor LOOP FOR IMPLICITO


SET SERVEROUTPUT ON
BEGIN
    FOR linha IN (SELECT * FROM tb_tabela) LOOP
        /* 
           comandos
           DBMS_OUTPUT.PUT_LINE(linha.campo_tabela);
        */
    END LOOP;
END;


Exemplo cursor LOOP FOR (FOR UPDATE)


DECLARE CURSOR cur SELECT * FROM tb_tabela FOR UPDATE;
             variavel NUMBER;
BEGIN
    variavel := 1.0;
    FOR linha IN cur LOOP
        IF linha.campo_media >7 THEN
            variavel := 1.5;
        END IF;

        UPDATE tb_tabela
           SET campo_tabela = variavel
         WHERE CURRENT OF cur;
    END LOOP;
END;


cur%ISOPEN --- VERIFICANDO CURSOR ABERTO


DECLARE CURSOR cur SELECT * FROM tb_tabela 
IF cur%ISOPEN THEN
 CLOSE cur;
END IF;
OPEN cur;


SQL%FOUND oposto SQL%NOTFOUND


SET SERVEROUTPUT ON
DELETE FROM tb_tabela WHERE condicao_verdadeira;
 
IF SQL%FOUND THEN  -- Sucesso na Cláusula DELETE
       DBMS_OUTPUT.PUT_LINE( 'Linhas afetadas na instrução DELETE: '|| TO_CHAR(SQL%ROWCOUNT));
END IF;


tb_tabela.campo_tabela%TYPE
Declarando variável do mesmo tipo de uma coluna de uma tabela



DECLARE variavelCampo tb_tabela.campo_tabela%TYPE; 


tb_tabela%ROWTYPE
Declarando uma variável com estrutura de uma tupla de uma tabela



DECLARE linha tb_tabela%ROWTYPE; 


Criando um Tipo de dados


DECLARE 
    TYPE novoTipo IS TABLE OF tb_tabela.campo_tabela%TYPE;
    variavelNovoTipo  novoTipo;
    CURSOR cur IS  
        SELECT campo_tabela
          FROM tb_tabela 
         WHERE condicao_verdadeira;

BEGIN
    OPEN cur;
    FETCH cur BULK COLLECT INTO variavelNovoTipo;
    CLOSE cur;

    FOR i IN variavelNovoTipo.FIRST .. variavelNovoTipo.LAST 
    LOOP
        DBMS_OUTPUT.PUT_LINE( variavelNovoTipo(i) );
    END LOOP;
END;  

Nenhum comentário:

Postar um comentário