← Voltar ao Blog

Tratamento Avançado de Exceções em PL/SQL: Criando Erros Customizados com PRAGMA EXCEPTION_INIT

Publicado em: 14/06/2026 16:00 PL/SQL

A Importância de uma Estratégia Robusta de Tratamento de Erros

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.

Exceções Pré-definidas vs. Exceções Definidas pelo Usuário

O PL/SQL divide exceções em três categorias principais:

Mapeando Erros do Oracle com PRAGMA EXCEPTION_INIT

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.

Exemplo prático de mapeamento de restrição de chave estrangeira:

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;

Lançando Erros Customizados com RAISE_APPLICATION_ERROR

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:

  1. Um código numérico reservado para exceções do usuário, que deve estar obrigatoriamente compreendido na faixa entre -20000 e -20999.
  2. Uma mensagem descritiva de texto (limitada a 2048 caracteres) que será propagada para a aplicação chamadora.

Boas Práticas no Tratamento de Exceções

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' );