No meu procedimento armazenado Oracle, tenho várias instruções de inserção e atualização como abaixo:
create or replace PROCEDURE SPTest
AS
BEGIN
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;
END;
Se eu receber algum erro em qualquer instrução, quero reverter todas as instruções de inserção e atualização.
Como posso implementar commit e rollback neste procedimento armazenado?
Você pode fazer isso usando um ponto de salvamento.
O commit normalmente será deixado para o chamador. Essa construção apenas garante que todas as inserções e a atualização sejam feitas ou nenhuma delas.
No nível mais externo, o Oracle fará um rollback sozinho. Em outras palavras, se você fizer isso
EXEC sptest();
na linha de comando SQL+, ela será expandida automaticamente paraMas se um procedimento de chamada tem tratamento de exceção, isso não acontece, pois a exceção pode não chegar a esse nível externo. Portanto, você pode acabar com as inserções feitas, a atualização lançando uma exceção que pode ser capturada e tratada pelo chamador, de modo que a atualização falhará, mas as inserções foram bem-sucedidas.
Ao fazer uma reversão no procedimento armazenado para o início do procedimento, você garante que todos eles sejam bem-sucedidos ou nenhum deles.