varchar2(4000); begin v_sqlerrm := sqlerrm; v_sqlcode := sqlcode; insert into Log_Error (error_id, processo_nome, error_code, sqlerror_message, user_error, date_error) values (seglog_error.nextval, p_processo_nome, v_sqlcode, v_sqlerrm, user,sysdate); Commit; end InsereLog; / Entao esta procedure pode ser invocada dentro do controle de manipulacao de excecao de um bloco PL/SQL, podendo tanto ser um bloco declarado (um objeto compilado no banco de dados) ou um bloco anonimo. No exemplo que se segue, um bloco PL/SQL anonimo tenta executar uma transacao que insere NULL em uma tabela que aceita NULL e depois tenta inserir NULL para uma tabela que nao aceita NULL, ocorrendo o erro ORA-01400 no segundo insert. Create table TabAceitaNULL (CampoNULL number null); Create table TabNaoAceitaNULL (CampoNaoNULL number not null); begin insert into TabAceitaNULL (CampoNULL) values (NULL); insert into TabNaoAceitaNULL (CampoNaoNULL) values (NULL); exception when OTHERS then InsereLog(Erro ao inserir nas tabelas TabAceitaNULL e TabNaoAceitaNULL); raise; end; / Ao executar o bloco anonimo supracitado, a transacao falhara na segunda instrucao insert, ocorrera entao um rollback, que desfara tanto o segundo como o primeiro insert. Contudo o LOG nao sera desfeito, pois nao participou da transacao principal na qual ocorreu o erro. Ao realizar consulta sobre as tabelas TabAceitaNULL e TabNaoAceitaNULL estarao vazias, e ao consultar a tabela Log_Error e possivel ver os logs dos erros. Outro ponto a ser comentado e que comumente, os desenvolvedores utilizam procedimentos para realizar atualizacoes no banco de dados, e as funcoes ficam limitadas a consultas ou calculos. Isso porque os procedimentos eram a unica forma de aplicar alteracoes no banco de dados. A partir da versao Oracle 10g funcoes podem realizar alteracoes no banco de dados e sendo elas autonomas ou nao. Contudo as funcoes nao autonomas que realizam operacoes dentro do banco de dados ainda nao poderao ser chamadas a partir de uma instrucao de SELECT, caso isso seja feito ira ocorrer o erro ORA-14552. Contudo se a funcao abrir uma transacao autonoma, ela podera ser usada em instrucao SELECT. Este comportamento e exatamente igual aos objetos sequencias. Cenario do problema e resolucao Empresas que tem um grande volume de boletos a serem pagos pelos clientes usam a troca de informacoes de cobranca em rede bancaria. E seus sistemas devem gerar boletos para que os clientes possam pagar o titulo na rede bancaria. Estes boletos devem conter o "nosso numero", informacao que a rede bancaria usa para identificar quais boletos foram liquidados.Em geral o nosso numero, que os estabelecimentos bancarios usam, e um numero dentro de uma faixa numerica. O valor da faixa numerica pode variar de banco para banco, alem disso, existe o digito verificador que e baseado no calculo do Modulo 11 e entre outros detalhes. Contudo apenas para simplificar e a titulo de ilustracao, a faixa numerica seria do numero 1 a 9999999 pelo banco "A". Entao em uma empresa que possui varias filiais, cada filial tem a sua carteira de cobranca e por sua vez gera os boletos. Para cada boleto gerado, o "nosso numero" tem que ter o valor numerico igual ao do boleto antecessor acrescido de um, entao o analista criou uma tabela para