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;