Oracle
 sql >> Baza danych >  >> RDS >> Oracle

Przykład transakcji autonomicznej Oracle

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
  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. customer.pk_name dołączanie do transakcji.fk_name vs. customer.pk_id [serial] dołączanie do transakcji.fk_id [liczba całkowita]

  2. Przestaw Oracle z podzapytaniem

  3. Jak wyodrębnić tylko wartość daty z pola daty w Oracle?

  4. Oracle SQL:Niedozwolona kolumna

  5. Czy w bazach danych Oracle jest jakiś typ logiczny?