W Oracle transakcja autonomiczna może zatwierdzić lub wycofać dane w tej samej sesji bez zatwierdzania lub wycofywania w głównej transakcji. Instrukcja PRAGMA (dyrektywa kompilatora) służy do definiowania transakcji autonomicznej w Oracle. Poniżej znajduje się przykład autonomicznej transakcji Oracle.
Składnia do zdefiniowania transakcji autonomicznej w Oracle
PRAGMA AUTONOMOUS_TRANSACTION; /* in the declaration section of PL/SQL Block */
Przykład procedury przechowywanej Oracle dla transakcji autonomicznej
Poniższa procedura składowana Oracle dla transakcji autonomicznej służy do rejestrowania błędów występujących w dowolnym programie PL/SQL (procedury, pakiety lub funkcje itp.). Wstawi on informacje o błędzie do tabeli error_log i zatwierdzi dane bez wpływu na jakąkolwiek główną transakcję w jakimkolwiek programie PL/SQL. Możesz wywołać tę procedurę z dowolnego programu PL/SQL, aby zarejestrować informacje o błędzie. Poniżej pokażę jak. Utwórz następujące obiekty do przetestowania w swoim systemie:
Utwórz dziennik błędów_tabeli
CREATE TABLE error_log ( error_code VARCHAR2 (100), error_msg VARCHAR2 (4000), date_occurred DATE, plsql_program_ref VARCHAR2 (100) ) /
Zapisana procedura Oracle dla transakcji autonomicznych w celu rejestrowania błędów
Poniższa procedura przyjmuje trzy parametry, które musisz przekazać w momencie wywołania procedury z innych procedur składowanych lub funkcji w momencie wystąpienia błędu.
CREATE OR REPLACE PROCEDURE prc_log_errors (v_error_code IN VARCHAR2, v_error_msg IN VARCHAR2, v_plsql_program IN VARCHAR2) AS PRAGMA AUTONOMOUS_TRANSACTION; BEGIN INSERT INTO error_log (ERROR_CODE, ERROR_MSG, DATE_OCCURRED, PLSQL_PROGRAM_REF) VALUES (v_error_code, v_error_msg, SYSDATE, v_plsql_program); COMMIT; END; /
Teraz możesz wywołać procedurę składowaną prc_log_errors z sekcji obsługi wyjątków innego programu PL/SQL, aby zarejestrować informacje o błędach. Oto przykład:
Utwórz tabelę test_data
CREATE TABLE test_data (some_data VARCHAR2 (100)) /
Utwórz funkcję fnc_test
Poniższa funkcja wstawi niektóre dane do test_data tabeli, a następnie wygeneruje błąd, ponieważ w następnym wierszu jest dzielony przez 0. W przypadku błędu w sekcji wyjątków wywołuje procedurę prc_log_errors aby zarejestrować błąd. Jeśli funkcja zostanie wykonana bez błędu, zwróci TRUE, w przeciwnym razie zwróci FALSE. W poniższym przypadku zwróci FALSE po zarejestrowaniu błędu.
CREATE OR REPLACE FUNCTION fnc_test RETURN BOOLEAN IS n NUMBER; BEGIN INSERT INTO test_data VALUES ('abc'); /* generate error */ n := 2 / 0; RETURN TRUE; EXCEPTION WHEN OTHERS THEN prc_log_errors (TO_CHAR (SQLCODE), SQLERRM, 'FNC_TEST'); RETURN FALSE; END fnc_test; /
Test
Wywołaj powyższą funkcję fnc_test .
BEGIN IF fnc_test THEN COMMIT; ELSE ROLLBACK; END IF; EXCEPTION WHEN OTHERS THEN ROLLBACK; END; /
Nawet jeśli się to nie powiedzie, dane zostaną zapisane w tabeli error_log, ponieważ procedura prc_log_errors używa PRAGMA AUTONOMOUS_TRANSACTION .
Sprawdź tabelę test_data, nie powinna zawierać żadnych rekordów.
SELECT * FROM test_data;
Wyjście
no rows selected.
Sprawdź dane w tabeli error_log
SELECT * FROM error_log;
Wyjście
ERROR_CODE ERROR_MSG DATE_OCCURRED PLSQL_PROGRAM_REF -1476 ORA-01476: divisor is equal to zero 27/03/2019 15:43:12 FNC_TEST
Zobacz też:
- Przykład zbiorczego zbierania Oracle PL/SQL z wyjątkami zapisu