Oracle
 sql >> база данни >  >> RDS >> Oracle

Пример за автономна транзакция на Oracle

В Oracle автономна транзакция може да поеме или връща данните в същата сесия, без да извършва или връща обратно в основната транзакция. Инструкцията PRAGMA (директива за компилатор) се използва за дефиниране на автономна транзакция в Oracle. Следва пример за автономна транзакция на Oracle.

Синтаксис за дефиниране на автономна транзакция в Oracle

PRAGMA AUTONOMOUS_TRANSACTION; /* in the declaration section of PL/SQL Block */

Пример за съхранявана процедура на Oracle за автономна транзакция

Следната съхранена процедура на Oracle за автономната транзакция е да регистрира грешките, възникнали във всяка PL/SQL програма (процедури, пакети или функции и т.н.). Той ще вмъкне информацията за грешката в таблицата error_log и ще запише данните, без да засяга нито една основна транзакция в която и да е PL/SQL програма. Можете да извикате тази процедура от всяка PL/SQL програма, за да регистрирате информацията за грешката. По-долу ще ви покажа как. Създайте следните обекти за тестване във вашата система:

Създаване на дневник за грешки в таблица

CREATE TABLE error_log
(
   error_code          VARCHAR2 (100),
   error_msg           VARCHAR2 (4000),
   date_occurred       DATE,
   plsql_program_ref   VARCHAR2 (100)
)
/

Запазена процедура на Oracle за автономна транзакция за регистриране на грешки

Процедурата по-долу приема три параметъра, които трябва да предадете в момента на извикване на процедурата от други съхранени процедури или функции в момента на грешката.

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;
/

Сега можете да извикате съхранената процедура prc_log_errors от секцията за обработка на изключения на друга PL/SQL програма, за да регистрирате информацията за грешката. Ето един пример:

Създаване на таблица test_data

CREATE TABLE test_data (some_data VARCHAR2 (100))
/

Създаване на функция fnc_test

Следната функция ще вмъкне някои данни в test_data таблица и след това ще генерира грешката, защото се дели на 0 в следващия ред. При грешка в секцията за изключения извиква процедурата prc_log_errors за да регистрирате грешката. Ако функцията се изпълнява без грешка, тогава тя ще върне TRUE, иначе ще върне FALSE. В случая по-долу той ще върне FALSE след регистриране на грешката.

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;
/

Тест

Извикайте горната функция fnc_test .

BEGIN
   IF fnc_test
   THEN
      COMMIT;
   ELSE
      ROLLBACK;
   END IF;
EXCEPTION
   WHEN OTHERS
   THEN
      ROLLBACK;
END;
/

Дори при неуспех се връща назад, но все пак данните ще бъдат запазени в таблицата error_log, тъй като процедурата prc_log_errors използва PRAGMA AUTONOMOUS_TRANSACTION .

Проверете таблицата test_data, не трябва да има записи.

SELECT * FROM test_data;

Изход

no rows selected.

Проверете данните в таблицата error_log

SELECT * FROM error_log;

Изход

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

Вижте също:

  • Oracle PL/SQL групово събиране с пример за изключения за запазване
  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Пример за задействане на Oracle WHEN

  2. Как да върнете корекцията след неуспешна фаза на превключване в R12.2

  3. Каква е минималната настройка, необходима за разгръщане на .NET приложение с Oracle клиент 11?

  4. Открийте дали дадена стойност съдържа поне една цифрова цифра в Oracle

  5. Връщане на номер от оператора Oracle Select след датата на синтактичен анализ