web-dev-qa-db-fra.com

Validation et restauration dans la procédure stockée Oracle

Dans ma procédure stockée Oracle, j'ai plusieurs instructions d'insertion et de mise à jour comme ci-dessous:

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;

Si j'obtiens une erreur dans une instruction, je souhaite annuler toutes les instructions d'insertion et de mise à jour.

Comment puis-je implémenter la validation et la restauration dans cette procédure stockée?

3
Pydi Raju

Vous pouvez le faire en utilisant un point de sauvegarde.

create or replace PROCEDURE SPTest
AS 
BEGIN 

  -- We create a savepoint here.
  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;

-- If any exception occurs
EXCEPTION
  WHEN OTHERS THEN
    -- We roll back to the savepoint.

    ROLLBACK TO sp_sptest;
    -- And of course we raise again,
    -- since we don't want to hide the error.
    -- Not raising here is an error!
    RAISE; 
END;

La validation sera généralement laissée à l'appelant. Cette construction garantit simplement que soit toutes les insertions et la mise à jour sont effectuées, soit aucune ne l'est.

Au niveau le plus externe, Oracle effectuera une restauration par lui-même. En d'autres termes, si vous faites EXEC sptest(); sur la ligne de commande SQL +, il sera automatiquement développé pour

DECLARE
BEGIN
   sptest();
EXCEPTION
   ROLLBACK;
END;

Mais si une procédure d'appel a une gestion des exceptions, cela ne se produit pas, car l'exception peut ne pas atteindre ce niveau externe. Vous pouvez donc vous retrouver avec les insertions effectuées, la mise à jour lançant une exception qui peut être interceptée et gérée par l'appelant, de sorte que la mise à jour aura échoué mais que les insertions ont réussi.

En effectuant une restauration dans la procédure stockée au début de la procédure, vous vous assurez que tous réussissent, ou aucun d'entre eux ne réussit.

6
SQB
--Rollback on Exception else Commit;

--SET TRANSACTION READ WRITE;

 BEGIN
  SAVEPOINT ABC;  
  update table_A set column1 ='Y' where id = 69;

  update table_A set column2 ='S'  where id = 70; 

  EXCEPTION
  WHEN OTHERS THEN   
  ROLLBACK TO ABC;   
COMMIT;

END;

--createdon is of datetime type and has an exception. So rollback will happen.
0
Swati Gagare