В 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 групово събиране с пример за изключения за запазване
-
Пример за задействане на Oracle WHEN
-
Как да върнете корекцията след неуспешна фаза на превключване в R12.2
-
Каква е минималната настройка, необходима за разгръщане на .NET приложение с Oracle клиент 11?
-
Открийте дали дадена стойност съдържа поне една цифрова цифра в Oracle
-
Връщане на номер от оператора Oracle Select след датата на синтактичен анализ