Gdzie Poleciał Commit W Procedurze Składowanej
Częściej niż by się chciało poszukuje się miejsca zatwierdzenia transakcji. W gąszczu procedur, funkcji i pakietów nietrudno o zabłąkany COMMIT. Poniżej drobna podpowiedź jak taki COMMIT można zlokalizować.
DROP TABLE T1 / DROP TABLE T2 / CREATE TABLE T1(id NUMBER) / CREATE TABLE T2(descr VARCHAR2(100)) / CREATE PROCEDURE P1_TEST IS BEGIN INSERT INTO T1 VALUES (1); COMMIT; END; / CREATE PROCEDURE P2_TEST IS BEGIN INSERT INTO T2 VALUES ('ALA'); P1_TEST; END; /
BEGIN P2_TEST; END; /
Wykonanie powyższej intrukcji wstawi nam rekordy to tabel T1 i T2 i w żaden sposób nie zgłosi wykonanego COMMIT’a. Aby zlokalizować zatwierdzenie transakcji należy posłużyć się małym fortelem. Na tabeli T2 należy utworzyć tymczasowy constraint, który zgłosi nam chęć zatwierdzenia transakcji.
ALTER TABLE T2 ADD CONSTRAINT T2_C CHECK(descr = 'KOT') DEFERRABLE INITIALLY DEFERRED NOVALIDATE /
Próba wywołania procedury P2_TEST w tym przypadku zgłosi nam błąd
Error starting at line : 27 in command -
BEGIN
P2_TEST;
END;
Error report -
ORA-02091: transaction rolled back
ORA-02290: check constraint (NEX_DWH250.T2_C) violated
ORA-06512: at "NEX_DWH250.P1_TEST", line 4
ORA-06512: at "NEX_DWH250.P2_TEST", line 4
ORA-06512: at line 2
02091. 00000 - "transaction rolled back"
*Cause: Also see error 2092. If the transaction is aborted at a remote
site then you will only see 2091; if aborted at host then you will
see 2092 and 2091.
*Action: Add rollback segment and retry the transaction.
Analizując powyższy komunikat błędu da się jednoznacznie wskazać miejsce występowania COMMIT.
Szymon
Komentarze |0|
Kategoria: Oracle 11g | Oracle 19c | Oracle 21c | PL/SQL | SQL
Tagi: ALTER TABLE, COMMIT, CONSTRAINT, DEFFERED, NOVALIDATE, PROCEDURE
Tagi: ALTER TABLE, COMMIT, CONSTRAINT, DEFFERED, NOVALIDATE, PROCEDURE