Jest to możliwe przy użyciu transakcji autonomicznej.
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));
Następnie uruchom ten anonimowy PL/SQL. Przyjrzyj się uważnie, procedura lokalna upd_table_3
nie jest uruchamiany, gdy jest zadeklarowany. Jest uruchamiany po wywołaniu w głównym BEGIN
blok:
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;
/
Procedura powinna nie powieść się celowo przy czwartej wstawce z ORA-02291
. Zrobiłem to w ten sposób. Następnie
ROLLBACK;
Wszystkie tabele powinny zostać wycofane z wyjątkiem t3
, który wstawiliśmy w autonomicznej transakcji.
SELECT * FROM t1;
no rows selected
SELECT * FROM t2;
no rows selected
SELECT * FROM t3;
X
----------
3
SELECT * FROM t4;
no rows selected