Foto de Roberto Sobrinho
Roberto Sobrinho

30/10/2025

Controle de erros no SQL*Plus: usando WHENEVER SQLERROR e OSERROR no Oracle

É muito comum, no dia a dia, receber scripts de desenvolvedores para executar em ambientes de produção. E algo que ainda acontece com frequência é encontrar scripts sem controle de erro, principalmente sem o uso do comando WHENEVER.

Quando um script roda sem esse controle, qualquer erro simples, como uma tabela inexistente, um grant incorreto ou uma sequence duplicada, pode parar toda a execução e impedir que o restante seja aplicado.
O resultado é um deploy quebrado, comportamento inesperado e muito retrabalho para entender o que o desenvolvedor realmente queria fazer.

E é aí que entra o WHENEVER, um comando simples do SQL*Plus que faz toda a diferença entre um script amador e um script preparado para produção.

O que é o WHENEVER

O comando WHENEVER serve para definir o que o SQL*Plus deve fazer quando ocorre um erro.
Ele pode ser usado tanto para erros SQL (como ORA-00942) quanto para erros do sistema operacional (como falta de permissão ou diretório inexistente).

A sintaxe é simples:

WHENEVER SQLERROR <ação>


--##  OU  ##--


WHENEVER OSERROR <ação>

Com isso, você define se o script deve continuar, parar, sair com erro ou até realizar commit ou rollback automático.

Referência completa de ações suportadas pelo WHENEVER

ComandoAção realizadaSai do SQL*Plus?Termina sucesso?Descrição prática
WHENEVER SQLERROR CONTINUEContinua a execuçãoNãoSimIgnora o erro SQL e segue para o próximo comando
WHENEVER SQLERROR CONTINUE NONEVolta ao padrãoNãoSimRetorna o comportamento padrão e para no primeiro erro
WHENEVER SQLERROR EXITSai do SQL*PlusSimNãoEncerra o script no primeiro erro
WHENEVER SQLERROR EXIT SUCCESSSai com status 0SimSimIndica sucesso mesmo após erro
WHENEVER SQLERROR EXIT FAILURESai com status 1SimNãoRetorna falha ao sistema operacional
WHENEVER SQLERROR EXIT nSai com código customizadoSimDependeRetorna o número definido (exemplo: 2, 99, etc.)
WHENEVER SQLERROR EXIT SQL.SQLCODESai com o código do erro SQLSimNãoRetorna o SQLCODE (exemplo: ORA-00942 → -942)
WHENEVER SQLERROR EXIT COMMITSai com commit automáticoSimSimConfirma tudo o que foi feito antes do erro
WHENEVER SQLERROR EXIT ROLLBACKSai com rollback automáticoSimNãoDesfaz todas as transações e sai
WHENEVER SQLERROR EXIT SQL.SQLCODE COMMITCommit + códigoSimSimFaz commit e retorna o SQLCODE
WHENEVER SQLERROR EXIT SQL.SQLCODE ROLLBACKRollback + códigoSimNãoDesfaz e retorna o SQLCODE
WHENEVER OSERROR CONTINUEContinua mesmo com erro de SONãoSimIgnora erros de sistema operacional
WHENEVER OSERROR CONTINUE NONEVolta ao padrãoNãoSimPara execução ao erro de SO
WHENEVER OSERROR EXITSai do SQL*PlusSimNãoEncerra ao primeiro erro de sistema
WHENEVER OSERROR EXIT SUCCESSSai com status 0SimSimIndica sucesso mesmo após erro de SO
WHENEVER OSERROR EXIT FAILURESai com status 1SimNãoRetorna falha ao sistema operacional
WHENEVER OSERROR EXIT nSai com código customizadoSimDependeRetorna o número definido
WHENEVER OSERROR EXIT SQL.SQLCODESai com código SQLSimNãoRetorna o código SQL mesmo em erro de SO

Exemplo 1 > Ignorar erros e continuar

Ideal quando você precisa recriar objetos e não quer que o script pare porque algo não existe.
Neste exemplo, vamos trabalhar com o schema HR, tentando excluir e recriar uma tabela.

SET ECHO ON
SET FEEDBACK ON
WHENEVER SQLERROR CONTINUE

PROMPT Iniciando script no schema HR...

PROMPT Tentando remover tabela antiga...
DROP TABLE hr.emp_temp;

PROMPT Criando nova tabela...
CREATE TABLE hr.emp_temp AS
SELECT employee_id, first_name, last_name, department_id, salary
FROM hr.employees
WHERE department_id = 90;

PROMPT Atualizando salários de teste...
UPDATE hr.emp_temp
SET salary = salary * 1.10;

PROMPT Finalizando e confirmando alterações...
COMMIT;

PROMPT Script executado até o fim, mesmo que o DROP falhe.

Mesmo que a tabela HR.EMP_TEMP não exista, o script não será interrompido.

Exemplo 2 > Parar o script e devolver o código de erro

Agora, um exemplo simples com um erro intencional.

WHENEVER SQLERROR EXIT SQL.SQLCODE

PROMPT Executando consulta em tabela inexistente...
SELECT * FROM hr.tabela_inexistente;

PROMPT Esta mensagem nunca será exibida, pois o script vai parar no erro.

Ao executar esse script, o SQL*Plus encerra assim que encontra o erro e devolve o código -942 ao sistema operacional.

Exemplo 3 > Parar e desfazer tudo com rollback

WHENEVER SQLERROR EXIT ROLLBACK

PROMPT Atualizando salários dos funcionários de TI...
UPDATE hr.employees
SET salary = salary + 1000
WHERE department_id = 60;

PROMPT Inserindo um erro proposital...
INSERT INTO hr.departments (department_id, department_name)
VALUES (NULL, 'Teste');

PROMPT Essa mensagem nunca aparecerá se o segundo comando falhar.

Se o INSERT gerar erro de restrição, o Oracle desfaz automaticamente o UPDATE anterior.

Exemplo 4 > Confirmar o que já rodou, mesmo com erro

SET ECHO ON
SET FEEDBACK ON
WHENEVER SQLERROR EXIT COMMIT

PROMPT Iniciando atualizações de teste...

INSERT INTO hr.job_history (employee_id, start_date, end_date, job_id, department_id)
VALUES (101, SYSDATE - 15, SYSDATE, 'SA_REP', 80);

UPDATE hr.employees
SET salary = salary * 1.05
WHERE department_id = 60;

PROMPT Simulando erro proposital...
INSERT INTO hr.tabela_inexistente VALUES (1, 'Teste');

PROMPT Fim do script.

As duas primeiras operações (INSERT e UPDATE) são confirmadas. O erro no terceiro comando faz o Oracle encerrar a sessão, mas o EXIT COMMIT garante que tudo que veio antes seja confirmado.

Exemplo 5 > Teste de comportamento em sequência

SET ECHO ON
SET FEEDBACK ON
WHENEVER SQLERROR CONTINUE

PROMPT Executando primeiro comando válido...
SELECT COUNT(*) FROM hr.employees;

PROMPT Executando comando com erro...
SELECT * FROM hr.tabela_inexistente;

PROMPT Executando outro comando válido...
SELECT department_name FROM hr.departments WHERE department_id = 10;

PROMPT Finalizando script normalmente.

Ao rodar esse script, o SQL*Plus exibe o erro da tabela inexistente, mas continua executando até o final. Se você remover o WHENEVER SQLERROR CONTINUE, o script vai parar imediatamente após o erro.


O WHENEVER é um daqueles comandos que parecem simples, mas fazem uma diferença enorme na estabilidade e previsibilidade de um ambiente Oracle. Com ele, seus scripts ganham inteligência, controle e segurança, evitando que pequenos erros impeçam uma entrega completa.

É essencial usar esses controles em esteiras de deploy automáticas, scripts de automação e até mesmo em execuções manuais.
Isso traz consistência, reduz retrabalho e garante que os processos tenham o mesmo comportamento, independentemente de quem executa ou de onde o script roda.

e zas

Referência Documentação Oracle:
Oracle Database 21c – SQL*Plus Command Reference: WHENEVER SQLERROR


Esse é exatamente o tipo de conteúdo que você vivencia no PowerLab SQL Oracle 1, o laboratório prático da DBASobrinho voltado para quem quer aprender Oracle na prática.

São ambientes reais, falhas simuladas e exercícios guiados que te ensinam a resolver problemas de verdade.

Confira as próximas edições em:
👉 https://dbasobrinho.com.br/cursos-treinamentos/


#20251030 #DBASobrinho #GuinaNãoTinhaDó #BóBó #CaceteDeAgulha #OracleACE

Compartilhe

Facebook
Twitter
LinkedIn
WhatsApp
Email
Print

Controle de erros no SQL*Plus: usando WHENEVER SQLERROR e OSERROR no Oracle