C'est possible en utilisant une Transaction Autonome.
CREATE TABLE t1 (x INTEGER PRIMARY KEY);
CREATE TABLE t2 (x INTEGER);
CREATE TABLE t3 (x INTEGER);
CREATE TABLE t4 (x INTEGER REFERENCES t1(x));
Ensuite, exécutez ce PL/SQL anonyme. Regardez bien, la procédure locale upd_table_3
n'est pas exécuté lorsqu'il est déclaré. Il est exécuté lorsqu'il est appelé dans le BEGIN
principal bloquer :
DECLARE
PROCEDURE upd_table_3 IS
PRAGMA AUTONOMOUS_TRANSACTION;
BEGIN
INSERT INTO t3 VALUES (3);
COMMIT;
END;
BEGIN
INSERT INTO t1 VALUES (1);
INSERT INTO t2 VALUES (2);
upd_table_3;
INSERT INTO t4 VALUES (4);
COMMIT;
END;
/
La procédure doit échouer intentionnellement au 4ème insert avec ORA-02291
. Je l'ai fait de cette façon. Alors
ROLLBACK;
Toutes les tables doivent être restaurées sauf t3
, dont nous avons fait l'insertion dans une transaction autonome.
SELECT * FROM t1;
no rows selected
SELECT * FROM t2;
no rows selected
SELECT * FROM t3;
X
----------
3
SELECT * FROM t4;
no rows selected