sql >> Databáze >  >> RDS >> Oracle

Příklad autonomní transakce Oracle

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.

Vytvořit nebo vyměnit postup PRC_LOG_ERRORS (V_ERROR_CODE V VARCHAR2, V_ERROR_MSG V VARCHAR2, V_PLSQL_PROGRAM V VARCHAR2) AS Pragma Autonomous_Transaction; Začátek do error_log (Error_MSG, V_EROR_SODE, V_EROR_SODE, V_EROR_SODE, V_EROR_ V V_ERROR_ V V_ERROR_ V V_ERROR_ V V V_ROROREM; COMMIT;END;/

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í
  1. Jak se vyhnout dělení nulou v MySQL

  2. Jak zkompilovat všechny neplatné balíčky ve schématu?

  3. Osvědčený vícejazyčný web

  4. Jak používat příkaz CASE v MySQL?