it-swarm.com.de

Commit und Rollback in der gespeicherten Oracle-Prozedur

In meiner gespeicherten Oracle-Prozedur habe ich mehrere Anweisungen zum Einfügen und Aktualisieren wie folgt:

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;

Wenn in einer Anweisung ein Fehler auftritt, möchte ich alle Anweisungen zum Einfügen und Aktualisieren zurücksetzen.

Wie kann ich Commit und Rollback in dieser gespeicherten Prozedur implementieren?

3
Pydi Raju

Sie können dies tun, indem Sie einen Speicherpunkt verwenden.

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;

Das Festschreiben wird normalerweise dem Anrufer überlassen. Dieses Konstrukt garantiert nur, dass entweder alle Einfügungen und die Aktualisierung abgeschlossen sind oder keine.

Auf der äußersten Ebene führt Oracle selbst einen Rollback durch. Mit anderen Worten, wenn Sie EXEC sptest(); in der SQL + -Befehlszeile ausführen, wird es automatisch auf erweitert

DECLARE
BEGIN
   sptest();
EXCEPTION
   ROLLBACK;
END;

Wenn eine aufrufende Prozedur eine Ausnahmebehandlung hat, geschieht dies nicht, da die Ausnahme möglicherweise nicht auf diese äußere Ebene gelangt. Möglicherweise werden die Einfügungen abgeschlossen, und das Update löst eine Ausnahme aus, die vom Aufrufer abgefangen und verarbeitet werden kann, sodass das Update fehlgeschlagen ist, die Einfügungen jedoch erfolgreich waren.

Durch ein Rollback in der gespeicherten Prozedur zum Beginn der Prozedur stellen Sie sicher, dass alle erfolgreich sind oder keine.

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