V Oracle může autonomní transakce potvrdit nebo vrátit zpět data ve stejné relaci, aniž by došlo k potvrzení nebo vrácení zpět v hlavní transakci. Příkaz PRAGMA (směrnice kompilátoru) se používá k definování autonomních transakcí v Oracle. Následuje příklad autonomní transakce Oracle.
Syntaxe pro definování autonomní transakce v Oracle
PRAGMA AUTONOMOUS_TRANSACTION; /* v sekci deklarace bloku PL/SQL */
Příklad uložené procedury Oracle pro autonomní transakci
Následující uložená procedura Oracle pro autonomní transakci je zaznamenat chyby, které se vyskytly v libovolném programu PL/SQL (postupy, balíčky nebo funkce atd.). Vloží informace o chybě do tabulky error_log a potvrdí data bez ovlivnění jakékoli hlavní transakce v jakémkoli programu PL/SQL. Tuto proceduru můžete zavolat z libovolného programu PL/SQL a zaznamenat informace o chybě. Níže vám ukážu, jak na to. Vytvořte následující objekty k testování ve vašem systému:
Vytvořit tabulku Error_Log
CREATE TABLE error_log( error_code VARCHAR2 (100), error_msg VARCHAR2 (4000), date_occurred DATE, plsql_program_ref VARCHAR2 (100))/
Uložená procedura Oracle pro autonomní transakce s logováním chyb
Níže uvedená procedura má tři parametry, které musíte předat v době volání procedury z jiných uložených procedur nebo funkcí v době chyby.
Nyní můžete volat uloženou proceduru prc_log_errors z části zpracování výjimek jiného programu PL/SQL, abyste zaprotokolovali informace o chybě. Zde je příklad:
Vytvořit test_data tabulky
CREATE TABLE test_data (some_data VARCHAR2 (100))/
Vytvořit funkci fnc_test
Následující funkce vloží některá data do test_data tabulka a poté vygeneruje chybu, protože je na dalším řádku dělena nulou. Při chybě v sekci výjimek volá proceduru prc_log_errors pro přihlášení chyby. Pokud se funkce provede bez chyby, vrátí hodnotu TRUE, jinak vrátí hodnotu FALSE. V níže uvedeném případě vrátí FALSE po zaprotokolování chyby.
VYTVOŘIT NEBO NAHRADIT FUNKCI fnc_test RETURN BOOLEANIS n NUMBER;BEGIN INSERT INTO test_data VALUES ('abc'); /* vygenerovat chybu */ n :=2 / 0; VRAŤTE PRAVDU; VÝJIMKA, KDYŽ POTOM OSTATNÍ prc_log_errors (TO_CHAR (SQLCODE), SQLERRM, 'FNC_TEST'); RETURN FALSE;END fnc_test;/
Test
Zavolejte výše uvedenou funkci fnc_test .
BEGIN IF fnc_test THEN COMMIT; ELSE ROLLBACK; END IF;EXCEPTION WHEN OTHERS THE WEN ROLLBACK;END;/
I když se při selhání vrací zpět, přesto budou data uložena v tabulce error_log, protože postup prc_log_errors používá PRAGMA AUTONOMOUS_TRANSACTION .
Zkontrolujte tabulku test_data, neměla by obsahovat žádné záznamy.
SELECT * FROM test_data;
Výstup
nejsou vybrány žádné řádky.
Zkontrolujte data v tabulce error_log
SELECT * FROM error_log;
Výstup
ERROR_CODE ERROR_MSG DATE_OCCURRED PLSQL_PROGRAM_REF-1476 ORA-01476:dělitel je roven nule 27/03/2019 15:43:12 FNC_TEST
Viz také:
- Hromadné shromažďování Oracle PL/SQL s příkladem výjimek uložení