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|

Legenda *) Pola oznaczone gwiazdką są wymagane
**) Możesz używać tych znaczników i atrybutów HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>