I Oracle kan en autonom transaktion commit eller rollback data i samma session utan att commitera eller rulla tillbaka i huvudtransaktionen. PRAGMA (kompilatordirektiv) uttalande används för att definiera autonom transaktion i Oracle. Följande är ett exempel på autonoma Oracle-transaktioner.
Syntax för att definiera autonom transaktion i Oracle
PRAGMA AUTONOMOUS_TRANSACTION; /* in the declaration section of PL/SQL Block */
Oracle Stored Procedure Exempel för autonom transaktion
Följande Oracle-lagrade procedur för den autonoma transaktionen är att logga de fel som uppstått i alla PL/SQL-program (procedurer, paket eller funktioner, etc.). Det kommer att infoga felinformationen i tabellen error_log och kommer att överföra data utan att påverka någon huvudtransaktion i något PL/SQL-program. Du kan anropa denna procedur från vilket PL/SQL-program som helst för att logga felinformationen. Nedan ska jag visa dig hur. Skapa följande objekt att testa i ditt system:
Skapa tabellfellogg
CREATE TABLE error_log ( error_code VARCHAR2 (100), error_msg VARCHAR2 (4000), date_occurred DATE, plsql_program_ref VARCHAR2 (100) ) /
Oracles lagrade procedur för autonom transaktion till loggfel
Proceduren nedan tar tre parametrar som du måste klara av när du anropar proceduren från andra lagrade procedurer eller funktioner vid tidpunkten för felet.
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; /
Nu kan du anropa den lagrade proceduren prc_log_errors från andra PL/SQL-programs undantagshanteringssektion för att logga felinformationen. Här är ett exempel:
Skapa tabell test_data
CREATE TABLE test_data (some_data VARCHAR2 (100)) /
Skapa funktion fnc_test
Följande funktion kommer att infoga vissa data i test_data tabell, och efter det kommer det att generera felet eftersom det divideras med 0 på nästa rad. Vid fel, i undantagsavsnittet, anropar den proceduren prc_log_errors för att logga felet. Om funktionen körs utan fel kommer den att returnera TRUE annars returnerar den FALSE. I fallet nedan kommer den att returnera FALSK efter att felet har loggats.
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; /
Testa
Anropa ovanstående funktion fnc_test .
BEGIN IF fnc_test THEN COMMIT; ELSE ROLLBACK; END IF; EXCEPTION WHEN OTHERS THEN ROLLBACK; END; /
Även det återställs vid misslyckande, men ändå kommer data att sparas i error_log-tabellen, eftersom proceduren prc_log_errors använder PRAGMA AUTONOMOUS_TRANSACTION .
Kontrollera test_data-tabellen, bör inte ha några poster.
SELECT * FROM test_data;
Utdata
no rows selected.
Kontrollera data i error_log-tabellen
SELECT * FROM error_log;
Utdata
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
Se även:
- Oracle PL/SQL Bulk Collect With Save Exception Exemple