Estou tendo um problema no rollback do Oracle.
Em meu procedimento armazenado, tenho várias instruções de inserção e atualização. Se tudo estiver bem, estou enviando uma mensagem de sucesso e também estou rastreando o status de sucesso em uma tabela Z_AUDIT_HISTORY.
Agora, a mesma coisa que preciso no status de falha também precisa primeiro reverter todas as instruções e rastrear o status de falha nesta tabela Z_AUDIT_HISTORY.
Meu procedimento:
create or replace PROCEDURE SPTest
AS
BEGIN
SAVEPOINT sp_sptest;
insert into emptest(empid,empname,deptno)
(1,'ravi',10);
insert into test1(id,name,sal)
(1,'raju',4444);
update emptest set empname='hari' where empid=1;
INSERT INTO Z_AUDIT_HISTORY(AUDIT_HISTORTY_ID,STATUS)
VALUES(SEQ_AUDIT_HISTORTY_ID.NEXTVAL,'SUCESS');
DBMS_OUTPUT.PUT_LINE('Sucess');
EXCEPTION
WHEN OTHERS THEN
INSERT INTO Z_AUDIT_HISTORY(AUDIT_HISTORTY_ID,ASSET_ID,STATUS)
VALUES(SEQ_AUDIT_HISTORTY_ID.NEXTVAL,p_asset_id,'FAIL');
DBMS_OUTPUT.PUT_LINE('Whoops');
ROLLBACK TO sp_sptest;
RAISE;
END;
Quando executo meu procedimento, estou recebendo o erro abaixo.
ORA-06512: at line 1
01438. 00000 - "value larger than specified precision allowed for this column"
*Cause: When inserting or updating records, a numeric value was entered
that exceeded the precision defined for the column.
*Action: Enter a value that complies with the numeric column's precision,
or use the MODIFY option with the ALTER TABLE command to expand
the precision.
Há três coisas acontecendo aqui.
Ao lidar com a exceção, você faz uma inserção seguida de uma reversão. Isso significa que a inserção também é revertida. No mÃnimo, troque a ordem das instruções:
Melhor ainda, lide com o login em uma transação autônoma. Isso significa que é uma transação separada que não é afetada por nada que aconteça na transação principal. Para logar, você quer isso.
E chamá-lo
Você obtém um erro porque gera a exceção após fazer a reversão.
Você não quer que a exceção desapareça silenciosamente, você quer saber sobre ela.
O que você pode fazer é lidar com as exceções que você está esperando. Por exemplo, se você sabe que
ORA-06512
pode ocorrer um e sabe o que precisa fazer nesse caso, pode adicionar um manipulador especÃfico para essa situação, seja em seu procedimento armazenado ou no código que o chama.