Picture of Roberto Sobrinho
Roberto Sobrinho

03/06/2024

Erro de DML no Oracle? Aprenda a Usar DBMS_ERRLOG para Capturá-los

Oi pessoal, tudo bem? Hoje vamos falar sobre um recurso super útil no Oracle Database que pode salvar seu dia quando você está lidando com operações DML: o pacote DBMS_ERRLOG.

O que é o DBMS_ERRLOG?

Sabe quando você tenta inserir dados em uma tabela e, por causa de um errinho, a operação inteira falha? Pois é, isso pode ser bem frustrante, né? O DBMS_ERRLOG está aqui para te ajudar. Esse pacote permite que você registre os erros de DML (Data Manipulation Language) em uma tabela de log, para que as operações válidas sejam concluídas, enquanto os erros são capturados para revisão posterior.

Como funciona?

Primeiro, precisamos criar uma tabela de log de erros para a tabela que vai receber os dados. O DBMS_ERRLOG facilita isso com o procedimento CREATE_ERROR_LOG. Veja um exemplo básico:

SQL>
-- Criando a tabela principal
CREATE TABLE FUNCIONARIO (
   ID_FUNCIONARIO NUMBER(10) PRIMARY KEY,
   NOME VARCHAR2(100) NOT NULL,
   DEPARTAMENTO VARCHAR2(100) NOT NULL,
   SALARIO NUMBER(10) CHECK (SALARIO >= 1000 AND SALARIO <= 5000)
);

-- Criando a tabela de log de erros
BEGIN 
  DBMS_ERRLOG.CREATE_ERROR_LOG(
   dml_table_name     => 'FUNCIONARIO',
   err_log_table_name => 'LOG_ERROS_FUNCIONARIO');
END;
/

A tabela de log de erros criada com CREATE_ERROR_LOG não inclui automaticamente uma coluna de data e hora. A tabela gerada contém colunas padrão para armazenar informações sobre o erro, mas não inclui uma coluna de timestamp por padrão.

Se você precisar registrar a data e a hora dos erros, você deve adicionar essa coluna manualmente após a criação da tabela de log. Aqui está um exemplo de como fazer isso:

ALTER TABLE LOG_ERROS_FUNCIONARIO ADD (DATA_HORA TIMESTAMP DEFAULT CURRENT_TIMESTAMP);

Beleza, e agora?

Agora, quando você for inserir dados, pode usar a cláusula LOG ERRORS. Ela vai capturar os erros e inseri-los na tabela de log, sem interromper a operação principal.

Para ilustrar, vamos gerar alguns dados de teste que simulem diferentes tipos de erros:

SQL >
-- Gerando dados de exemplo diretamente
INSERT INTO FUNCIONARIO
SELECT LEVEL, 
       CASE 
           WHEN MOD(LEVEL, 14) = 0 THEN 'Anna'
           WHEN MOD(LEVEL, 14) = 1 THEN 'Carlos'
           WHEN MOD(LEVEL, 14) = 2 THEN 'João'
           WHEN MOD(LEVEL, 14) = 3 THEN 'Janaina'
           WHEN MOD(LEVEL, 14) = 4 THEN 'Pedro'
           WHEN MOD(LEVEL, 14) = 5 THEN 'Lucas'
           WHEN MOD(LEVEL, 14) = 6 THEN 'Amanda'
           WHEN MOD(LEVEL, 14) = 7 THEN 'Gabriel'
           WHEN MOD(LEVEL, 14) = 8 THEN 'Clara'
           WHEN MOD(LEVEL, 14) = 9 THEN 'Miguel'
           WHEN MOD(LEVEL, 14) = 10 THEN 'Sofia'
           WHEN MOD(LEVEL, 14) = 11 THEN 'Bruno'
           WHEN MOD(LEVEL, 14) = 12 THEN 'Julia'
           WHEN MOD(LEVEL, 14) = 13 THEN 'Rafael'
           ELSE 'Alice'
       END,
       CASE 
           WHEN MOD(LEVEL, 6) = 0 THEN 'TI'
           WHEN MOD(LEVEL, 6) = 1 THEN 'RH'
           WHEN MOD(LEVEL, 6) = 2 THEN 'Financeiro'
           WHEN MOD(LEVEL, 6) = 3 THEN 'Marketing'
           WHEN MOD(LEVEL, 6) = 4 THEN 'Vendas'
           ELSE 'Operações'
       END,
       CASE 
           WHEN MOD(LEVEL, 4) = 0 THEN 4500 
           WHEN MOD(LEVEL, 4) = 1 THEN 6000 -- Erro de valor acima do limite
           WHEN MOD(LEVEL, 4) = 2 THEN 3000
           WHEN MOD(LEVEL, 4) = 3 THEN 700  -- Erro de valor abaixo do limite
       END
FROM DUAL
CONNECT BY LEVEL <= 25
UNION ALL
-- Inserindo duplicatas para gerar erro de constraint única
SELECT 2, 'Carlos', 'RH', 3000 FROM DUAL
UNION ALL
-- Inserindo nulos para gerar erro de coluna NOT NULL
SELECT 26, NULL, 'RH', 3000 FROM DUAL
UNION ALL
SELECT 27, 'Carlos', NULL, 3000 FROM DUAL
UNION ALL
SELECT 28, 'João', 'Marketing', NULL FROM DUAL
UNION ALL
-- Erros de valor acima do limite
SELECT 29, 'Lucas', 'TI', 6000 FROM DUAL
UNION ALL
SELECT 30, 'Rafael', 'Financeiro', 6000 FROM DUAL
LOG ERRORS INTO LOG_ERROS_FUNCIONARIO REJECT LIMIT UNLIMITED;

13 rows created.

COMMIT;

Commit complete.

SQL >

E os erros, como ficam?

Depois de rodar a inserção, você pode checar a tabela de log para ver quais linhas deram problema e por quê. Isso ajuda a corrigir os dados sem perder todo o progresso da operação.

SQL >

col DATA_HORA     format a30
col ORA_ERR_MESG$ format a80
col NOME          format a10
col DEPARTAMENTO  format a15
col SALARIO       format a15

SELECT DATA_HORA, ORA_ERR_MESG$, NOME, DEPARTAMENTO, SALARIO FROM LOG_ERROS_FUNCIONARIO;

DATA_HORA                     |ORA_ERR_MESG$                                                                   |NOME      |DEPARTAMENTO   |SALARIO
------------------------------|--------------------------------------------------------------------------------|----------|---------------|---------------
03-JUN-24 10.23.56.797189 AM  |ORA-02290: check constraint (SYS.SYS_C007466) violated                          |Carlos    |RH             |6000
03-JUN-24 10.23.56.797606 AM  |ORA-02290: check constraint (SYS.SYS_C007466) violated                          |Janaina   |Marketing      |700
03-JUN-24 10.23.56.797766 AM  |ORA-02290: check constraint (SYS.SYS_C007466) violated                          |Lucas     |Operações      |6000
03-JUN-24 10.23.56.797899 AM  |ORA-02290: check constraint (SYS.SYS_C007466) violated                          |Gabriel   |RH             |700
03-JUN-24 10.23.56.798013 AM  |ORA-02290: check constraint (SYS.SYS_C007466) violated                          |Miguel    |Marketing      |6000
03-JUN-24 10.23.56.798128 AM  |ORA-02290: check constraint (SYS.SYS_C007466) violated                          |Bruno     |Operações      |700
03-JUN-24 10.23.56.798235 AM  |ORA-02290: check constraint (SYS.SYS_C007466) violated                          |Rafael    |RH             |6000
03-JUN-24 10.23.56.798330 AM  |ORA-02290: check constraint (SYS.SYS_C007466) violated                          |Carlos    |Marketing      |700
03-JUN-24 10.23.56.798419 AM  |ORA-02290: check constraint (SYS.SYS_C007466) violated                          |Janaina   |Operações      |6000
03-JUN-24 10.23.56.798511 AM  |ORA-02290: check constraint (SYS.SYS_C007466) violated                          |Lucas     |RH             |700
03-JUN-24 10.23.56.798598 AM  |ORA-02290: check constraint (SYS.SYS_C007466) violated                          |Gabriel   |Marketing      |6000
03-JUN-24 10.23.56.798690 AM  |ORA-02290: check constraint (SYS.SYS_C007466) violated                          |Miguel    |Operações      |700
03-JUN-24 10.23.56.798778 AM  |ORA-02290: check constraint (SYS.SYS_C007466) violated                          |Bruno     |RH             |6000
03-JUN-24 10.23.56.801961 AM  |ORA-00001: unique constraint (SYS.SYS_C007467) violated                         |Carlos    |RH             |3000
03-JUN-24 10.23.56.802156 AM  |ORA-01400: cannot insert NULL into ("SYS"."FUNCIONARIO"."NOME")                 |          |RH             |3000
03-JUN-24 10.23.56.802206 AM  |ORA-01400: cannot insert NULL into ("SYS"."FUNCIONARIO"."DEPARTAMENTO")         |Carlos    |               |3000
03-JUN-24 10.23.56.802337 AM  |ORA-02290: check constraint (SYS.SYS_C007466) violated                          |Lucas     |TI             |6000
03-JUN-24 10.23.56.802425 AM  |ORA-02290: check constraint (SYS.SYS_C007466) violated                          |Rafael    |Financeiro     |6000

18 rows selected.

Aqui, a tabela LOG_ERROS_FUNCIONARIO vai mostrar os erros ocorridos, como violação de constraints únicas, valores grandes demais, valores nulos em colunas não nulas, entre outros.

Dicas Rápidas ao DBA

  • Sempre crie tabelas de log de erros: Isso ajuda a manter a integridade dos dados e facilita a resolução de problemas.
  • Use a cláusula LOG ERRORS: Permite que você capture erros sem interromper a operação principal.
  • Revisão regular dos logs de erro: Verifique frequentemente as tabelas de log para identificar e corrigir problemas rapidamente.

Conclusão

O DBMS_ERRLOG é uma mão na roda quando se trata de manipular grandes volumes de dados no Oracle. Ele permite que você continue suas operações sem ser interrompido por erros pequenos, que podem ser corrigidos depois. Teste essa funcionalidade e veja como ela pode otimizar seu trabalho com bancos de dados.

Para mais informações, confira as referências abaixo:

🚀🚀🚀 #GuinaNãoTinhaDó #BóBó #OracleDatabase #DBA #OracleTips #DicasDeDBA #LogsDeErro #OtimizaçãoDeBancoDeDados #CaceteDeAgulha #EngenheiroDeObraPronta 🚀🚀🚀

Compartilhe

Facebook
Twitter
LinkedIn
WhatsApp
Email
Print

Pesquisar

Roberto Sobrinho

Sou Roberto Fernandes Sobrinho, também conhecido como Sobrinho DBA , pós graduado em “Architecture and Database Administration”, entusiasta, dedicado e com 20 anos de experiência com Oracle Database e suas diversas distribuições e variações.

Oracle ACE Associate

2025

Specialist

Exadata Database Machine X9M

Professional

Oracle Database Administration

Professional

Oracle Database 19c: RAC, ASM, & Grid Infra Administrator

Professional

Oracle Autonomous Database Cloud

Professional

Oracle Cloud Database Migration and Integration

Professional

Oracle Database PL/SQL Developer

Associate

Oracle Cloud Infrastructure Architect

Associate

Oracle Cloud Infrastructure Foundations

Categorias

Categorias

Tags

Erro de DML no Oracle? Aprenda a Usar DBMS_ERRLOG para Capturá-los