Em sistemas corporativos de missão crítica, falhas em procedimentos de banco de dados são inevitáveis. Seja por uma tentativa de inserção de duplicidade em chaves exclusivas, violação de restrições de integridade ou regras de negócio violadas, o modo como o seu código PL/SQL lida com essas exceções determina a estabilidade da aplicação cliente.
Por padrão, o Oracle possui centenas de códigos de erro numéricos conhecidos (como os famosos ORA-00001 para violação de unique constraint ou ORA-02291 para violação de integrity constraint). No entanto, lidar diretamente com números de erro genéricos no código dificulta a manutenção e a legibilidade. É aqui que entra o uso de exceções nomeadas e o comando PRAGMA EXCEPTION_INIT.
O PL/SQL divide exceções em três categorias principais:
O PRAGMA é uma instrução de compilação que fornece informações ao compilador PL/SQL antes da execução do bloco. Ao utilizarmos o EXCEPTION_INIT, associamos um código de erro numérico do Oracle a um identificador legível criado por nós.
Imagine que precisamos capturar especificamente o erro de chave estrangeira violada (ORA-02291) para retornar uma mensagem amigável ao usuário final, em vez de deixar a exceção subir sem tratamento:
CREATE OR REPLACE PROCEDURE registrar_pedido ( p_cliente_id IN orders.client_id%TYPE, p_valor IN orders.total_amount%TYPE ) IS -- 1. Declarar a exceção personalizada ex_cliente_inexistente EXCEPTION; -- 2. Associar o código ORA-02291 ao nome da exceção via PRAGMA PRAGMA EXCEPTION_INIT(ex_cliente_inexistente, -02291); BEGIN INSERT INTO orders (client_id, total_amount, order_date) VALUES (p_cliente_id, p_valor, SYSDATE); COMMIT; EXCEPTION WHEN ex_cliente_inexistente THEN -- Tratamento específico e limpo para a violação de FK RAISE_APPLICATION_ERROR(-20001, 'Falha ao registrar pedido: O ID do cliente informado não existe na base.'); WHEN OTHERS THEN -- Captura genérica de segurança para erros inesperados RAISE_APPLICATION_ERROR(-20999, 'Erro inesperado: ' || SQLERRM); END registrar_pedido;
Quando precisamos validar regras de negócio estritamente procedurais que não passam por restrições nativas do banco (como validar se o saldo de estoque é suficiente ou se um valor de crédito é negativo), utilizamos o procedimento nativo RAISE_APPLICATION_ERROR.
Essa função aceita dois parâmetros obrigatórios:
Dominar o tratamento avançado de exceções garante que suas rotinas em banco de dados sejam resilientes, seguras e fáceis de manter a longo prazo.
', '2026-06-08 11:10:00' );