I Oracle kan en autonom transaktion begå eller rulle tilbage dataene i samme session uden at begå eller rulle tilbage i hovedtransaktionen. PRAGMA (compiler direktiv) erklæring bruges til at definere autonom transaktion i Oracle. Følgende er et eksempel på en autonom Oracle-transaktion.
Syntaks til at definere autonom transaktion i Oracle
PRAGMA AUTONOMOUS_TRANSACTION; /* in the declaration section of PL/SQL Block */
Oracle Stored Procedure Eksempel for Autonom Transaction
Den følgende Oracle-lagrede procedure for den autonome transaktion er at logge de fejl, der er opstået i ethvert PL/SQL-program (Procedurer, pakker eller funktioner osv.). Det vil indsætte fejlinformationen i tabellen error_log og vil begå dataene uden at påvirke nogen hovedtransaktion i noget PL/SQL-program. Du kan kalde denne procedure fra ethvert PL/SQL-program for at logge fejlinformationen. Nedenfor vil jeg vise dig hvordan. Opret følgende objekter for at teste i dit system:
Opret tabelfejllog
CREATE TABLE error_log ( error_code VARCHAR2 (100), error_msg VARCHAR2 (4000), date_occurred DATE, plsql_program_ref VARCHAR2 (100) ) /
Oracle Stored Procedure for autonom transaktion til log-fejl
Nedenstående procedure tager tre parametre, som du skal passere, når du kalder proceduren fra andre lagrede procedurer eller funktioner på tidspunktet for fejlen.
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 kalde den lagrede procedure prc_log_errors fra andre PL/SQL-programmers undtagelseshåndteringssektion for at logge fejlinformationen. Her er et eksempel:
Opret tabel test_data
CREATE TABLE test_data (some_data VARCHAR2 (100)) /
Opret funktion fnc_test
Den følgende funktion vil indsætte nogle data i test_data tabel, og derefter vil den generere fejlen, fordi den dividerer med 0 i næste linje. Ved fejl, i undtagelsessektionen, kalder den proceduren prc_log_errors for at logge fejlen. Hvis funktionen udføres uden fejl, vil den returnere TRUE, ellers vil den returnere FALSK. I nedenstående tilfælde vil den returnere FALSK efter at have logget fejlen.
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; /
Test
Kald ovenstående funktion fnc_test .
BEGIN IF fnc_test THEN COMMIT; ELSE ROLLBACK; END IF; EXCEPTION WHEN OTHERS THEN ROLLBACK; END; /
Selv det ruller tilbage ved fejl, men stadig vil dataene blive gemt i error_log-tabellen, fordi proceduren prc_log_errors bruger PRAGMA AUTONOMOUS_TRANSACTION .
Tjek test_data-tabellen, bør ikke have nogen poster.
SELECT * FROM test_data;
Output
no rows selected.
Tjek data i error_log-tabellen
SELECT * FROM error_log;
Output
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 også:
- Oracle PL/SQL-masseindsamling med eksempel på Gem undtagelser