É 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
| Comando | Ação realizada | Sai do SQL*Plus? | Termina sucesso? | Descrição prática | 
|---|---|---|---|---|
| WHENEVER SQLERROR CONTINUE | Continua a execução | Não | Sim | Ignora o erro SQL e segue para o próximo comando | 
| WHENEVER SQLERROR CONTINUE NONE | Volta ao padrão | Não | Sim | Retorna o comportamento padrão e para no primeiro erro | 
| WHENEVER SQLERROR EXIT | Sai do SQL*Plus | Sim | Não | Encerra o script no primeiro erro | 
| WHENEVER SQLERROR EXIT SUCCESS | Sai com status 0 | Sim | Sim | Indica sucesso mesmo após erro | 
| WHENEVER SQLERROR EXIT FAILURE | Sai com status 1 | Sim | Não | Retorna falha ao sistema operacional | 
| WHENEVER SQLERROR EXIT n | Sai com código customizado | Sim | Depende | Retorna o número definido (exemplo: 2, 99, etc.) | 
| WHENEVER SQLERROR EXIT SQL.SQLCODE | Sai com o código do erro SQL | Sim | Não | Retorna o SQLCODE (exemplo: ORA-00942 → -942) | 
| WHENEVER SQLERROR EXIT COMMIT | Sai com commit automático | Sim | Sim | Confirma tudo o que foi feito antes do erro | 
| WHENEVER SQLERROR EXIT ROLLBACK | Sai com rollback automático | Sim | Não | Desfaz todas as transações e sai | 
| WHENEVER SQLERROR EXIT SQL.SQLCODE COMMIT | Commit + código | Sim | Sim | Faz commit e retorna o SQLCODE | 
| WHENEVER SQLERROR EXIT SQL.SQLCODE ROLLBACK | Rollback + código | Sim | Não | Desfaz e retorna o SQLCODE | 
| WHENEVER OSERROR CONTINUE | Continua mesmo com erro de SO | Não | Sim | Ignora erros de sistema operacional | 
| WHENEVER OSERROR CONTINUE NONE | Volta ao padrão | Não | Sim | Para execução ao erro de SO | 
| WHENEVER OSERROR EXIT | Sai do SQL*Plus | Sim | Não | Encerra ao primeiro erro de sistema | 
| WHENEVER OSERROR EXIT SUCCESS | Sai com status 0 | Sim | Sim | Indica sucesso mesmo após erro de SO | 
| WHENEVER OSERROR EXIT FAILURE | Sai com status 1 | Sim | Não | Retorna falha ao sistema operacional | 
| WHENEVER OSERROR EXIT n | Sai com código customizado | Sim | Depende | Retorna o número definido | 
| WHENEVER OSERROR EXIT SQL.SQLCODE | Sai com código SQL | Sim | Não | Retorna 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
 
				



 
								 
								 
								 
								 
								 
								 
								 
								 
								 
								 
								 
								 
								 
								 
								 
								 
								