Pular para o conteúdo

DBMS_ERRLOG: Criação e uso de logs de erro para operações DML

DBMS_ERRLOG: Criação e uso de logs de erro para operações DML

O DBMS_ERRLOG é um pacote fornecido pelo Oracle que permite criar e usar logs de erro para operações DML (Data Manipulation Language), como INSERT, UPDATE, DELETE e MERGE. Os logs de erro são tabelas que armazenam as informações sobre as linhas que falharam durante uma operação DML, incluindo os valores das colunas, o código e a mensagem do erro, e outros dados opcionais. Os logs de erro permitem que você identifique e corrija os erros que ocorrem durante uma operação DML, sem interromper a execução da operação ou afetar as linhas que foram processadas com sucesso.

Para criar e usar logs de erro para operações DML, é necessário seguir os seguintes passos:

  • Criar uma tabela de log de erro usando a função DBMS_ERRLOG.CREATE_ERROR_LOG, que recebe como parâmetros o nome da tabela alvo da operação DML, o nome da tabela de log de erro, e outros parâmetros opcionais, como o esquema, a tag, o limite de tamanho e as colunas adicionais. A função cria uma tabela de log de erro com uma estrutura padrão, que contém as seguintes colunas: ORA_ERR_NUMBER$, ORA_ERR_MESG$, ORA_ERR_ROWID$, ORA_ERR_OPTYP$, ORA_ERR_TAG$ e as colunas da tabela alvo. A função também cria um índice na coluna ORA_ERR_NUMBER$ da tabela de log de erro, para facilitar a consulta dos erros.
  • Executar uma operação DML usando a cláusula LOG ERRORS, que recebe como parâmetros o nome da tabela de log de erro, a tag da operação e o limite de rejeição. A cláusula LOG ERRORS faz com que a operação DML continue a executar mesmo que ocorram erros, e que as linhas que falharam sejam registradas na tabela de log de erro, com as informações do erro e da operação. O limite de rejeição é o número máximo de erros que a operação pode tolerar antes de ser abortada. Se o limite de rejeição for omitido ou for igual a zero, a operação não terá limite de erros. Se o limite de rejeição for atingido, a operação será desfeita e nenhum registro será inserido na tabela de log de erro.
  • Consultar a tabela de log de erro usando comandos SQL, para verificar as linhas que falharam, os códigos e as mensagens dos erros, e as tags das operações. A consulta pode ser feita usando filtros, ordenações, agrupamentos ou junções, de acordo com a necessidade. A consulta também pode ser usada para corrigir os erros e reprocessar as linhas que falharam, usando comandos DML ou chamadas a outras unidades de programa.

A seguir, apresentamos um exemplo prático de como criar e usar logs de erro para operações DML, usando o Oracle 19c.

Primeiro, criamos uma tabela de clientes com os seguintes campos: id, nome, email e telefone.

CREATE TABLE clientes (
  id NUMBER PRIMARY KEY,
  nome VARCHAR2(50) NOT NULL,
  email VARCHAR2(50) NOT NULL,
  telefone VARCHAR2(20) NOT NULL
);

Em seguida, criamos uma tabela de log de erro para a tabela de clientes, usando a função DBMS_ERRLOG.CREATE_ERROR_LOG, e especificando o nome da tabela de log de erro como err_clientes.

BEGIN
  DBMS_ERRLOG.CREATE_ERROR_LOG (
    dml_table_name => 'clientes',
    err_log_table_name => 'err_clientes'
  );
END;
/

Agora, executamos uma operação DML na tabela de clientes, usando a cláusula LOG ERRORS, e inserindo alguns registros na tabela. Vamos inserir alguns registros válidos e alguns registros inválidos, para gerar alguns erros.

INSERT INTO clientes VALUES (1, 'Ana', 'ana@gmail.com', '11-1111-1111')
LOG ERRORS INTO err_clientes ('op1') REJECT LIMIT 10;

INSERT INTO clientes VALUES (2, 'Bruno', 'bruno@gmail.com', '22-2222-2222')
LOG ERRORS INTO err_clientes ('op1') REJECT LIMIT 10;

INSERT INTO clientes VALUES (3, 'Carla', 'carla@gmail.com', '33-3333-3333')
LOG ERRORS INTO err_clientes ('op1') REJECT LIMIT 10;

-- Registro inválido: viola a restrição de chave primária
INSERT INTO clientes VALUES (1, 'Daniel', 'daniel@gmail.com', '44-4444-4444')
LOG ERRORS INTO err_clientes ('op1') REJECT LIMIT 10;

-- Registro inválido: viola a restrição de not null
INSERT INTO clientes VALUES (4, NULL, 'elisa@gmail.com', '55-5555-5555')
LOG ERRORS INTO err_clientes ('op1') REJECT LIMIT 10;

-- Registro inválido: viola a restrição de tamanho da coluna
INSERT INTO clientes VALUES (5, 'Fabio', 'fabio@gmail.com', '66-6666-666666')
LOG ERRORS INTO err_clientes ('op1') REJECT LIMIT 10;

Por fim, consultamos a tabela de log de erro, usando comandos SQL, para verificar as linhas que falharam, os códigos e as mensagens dos erros, e as tags das operações.

SELECT * FROM err_clientes;

-- Resultado: exibe os registros da tabela de log de erro
ORA_ERR_NUMBER$ ORA_ERR_MESG$                          ORA_ERR_ROWID$ ORA_ERR_OPTYP$ ORA_ERR_TAG$ ID NOME   EMAIL            TELEFONE
--------------- -------------------------------------- -------------- -------------- ------------ -- ------ ---------------- ------------
1               ORA-00001: unique constraint (SYS_C00  AAABWMAAAACgCw0 I              op1          1  Daniel daniel@gmail.com 44-4444-4444
1400            ORA-01400: cannot insert NULL into ("  AAABWMAAAACgCw1 I              op1          4        elisa@gmail.com  55-5555-5555
12899           ORA-12899: value too large for column  AAABWMAAAACgCw2 I              op1          5  Fabio  fabio@gmail.com  66-6666-666666

Como podemos ver, a tabela de log de erro registrou as informações sobre as linhas que falharam durante a operação DML, incluindo os valores das colunas, o código e a mensagem do erro, e a tag da operação. A operação DML continuou a executar mesmo que ocorressem erros, e as linhas que foram processadas com sucesso foram inseridas na tabela de clientes.

Neste artigo, vimos como usar o pacote DBMS_ERRLOG para criar e usar logs de erro para operações DML, que permitem identificar e corrigir os erros que ocorrem durante uma operação DML, sem interromper a execução da operação ou afetar as linhas que foram processadas com sucesso. Vimos também como criar uma tabela de log de erro usando a função DBMS_ERRLOG.CREATE_ERROR_LOG, como executar uma operação DML usando a cláusula LOG ERRORS, e como consultar a tabela de log de erro usando comandos SQL.

Abs

Referências

Giovano Silva

Giovano Silva

Giovano Silva é um profissional com mais de 10 anos de experiência em tecnologias Oracle, com ênfase em PL/SQL. Ele adora escrever sobre soluções para problemas comuns enfrentados por profissionais Oracle em seu dia a dia. Seu objetivo é compartilhar conhecimento, simplificar conceitos complexos e ajudar a comunidade Oracle a crescer coletivamente.

Deixe um comentário

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *

plugins premium WordPress