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