Sempre tratar possíveis erros de SELECTs, INSERTs, UPDATEs e DELETEs

De DTI Wiki

Ir para: navegação, pesquisa

Nbp.png OBRIGATÓRIO

É mais seguro, e boa prática, fazer o controle de possíveis erros dos comandos SELECT, INSERT, UPDATE e DELETE. Utilize o tratamento de exceções, como por exemplo NO_DATA_FOUND, TOO_MANY_ROWS, DUP_VAL_ON_INDEX entre outros, já o OTHERS deve ser utilizado com muito cuidado e deve ser declarado sempre por último na lista das exceções. Também podem ser utilizados SQL%NOTFOUND, SQL%FOUND e SQL%ROWCOUNT, mas lembre-se que estes comandos não funcionam com a instrução INSERT.

Exceções mais comumente usadas:

NO_DATA_FOUNDSELECT;
TOO_MANY_ROWSSELECT;
DUP_VAL_ON_INDEXINSERT, UPDATE;
VALUE_ERRORSELECT, INSERT, UPDATE;
ZERO_DIVIDESELECT, INSERT,UPDATE.



Comonfazer.png COMO NÃO FAZER

		DECLARE
		    v_email    fornecedor.email%TYPE;
		BEGIN
		    UPDATE fornecedor
		    SET cpfcgc = '60423365001041'
		    WHERE  codfornecedor = 156800;
 
		    SELECT f.email
		    INTO   v_email
		    FROM   fornecedor f
		    WHERE  f.codfornecedor = 156800;
 
		    /* Este código não funciona com SELECT */
		    IF SQL%NOTFOUND THEN
		        DBMS_OUTPUT.put_line('Nenhum fornecedor encontrado');
		    END IF;
		END;



Comofazer.png COMO FAZER

               DECLARE
		    v_email    fornecedor.email%TYPE;
		BEGIN
		    UPDATE fornecedor
		    SET cpfcgc = '60423365001041'
		    WHERE  codfornecedor = 156800;
 
		    /* Verifica se o UPDATE não alterou nenhum registro */
		    IF SQL%NOTFOUND THEN
		        DBMS_OUTPUT.put_line('Nenum fornecedor atualizado');
		    END IF;
 
		    /* Mostra quantos registros foram atualizados */
		    DBMS_OUTPUT.put_line('foram alterados ' || SQL%ROWCOUNT || ' registros');
 
		    SELECT f.email
		    INTO   v_email
		    FROM   fornecedor f
		    WHERE  f.codfornecedor = :varcodigo;
		EXCEPTION
 
		    /* Neste código, esta exceção pode ocorrer no UPDATE */
		    WHEN DUP_VAL_ON_INDEX THEN
		        DBMS_OUTPUT.put_line('Já existe fornecedor com este CNPJ');
		        DBMS_OUTPUT.put_line('Código do erro oracle ' || SQLCODE);
		        DBMS_OUTPUT.put_line('Mensagem do erro oracle ' || SQLERRM);
 
		    /* Neste código, esta exceção pode ocorrer no SELECT */
		    WHEN NO_DATA_FOUND THEN
		        DBMS_OUTPUT.put_line('Não foi encontrado fornecedor com este código');
		END;



Podem ser criados vários blocos BEGIN … EXCEPTION … END quanto necessários para o tratamento de exceções;

BEGIN
BEGINEXCEPTION
END;
 
BEGINEXCEPTION
END;
 
BEGINEXCEPTION
END;
END;
Ferramentas pessoais
Espaços nominais
Variantes
Ações
Navegação
Ferramentas