In Oracle kan een autonome transactie de gegevens in dezelfde sessie vastleggen of terugdraaien zonder in de hoofdtransactie vast te leggen of terug te draaien. De PRAGMA-verklaring (compilerrichtlijn) wordt gebruikt om autonome transacties in Oracle te definiëren. Het volgende is een voorbeeld van een autonome Oracle-transactie.
Syntaxis om autonome transactie in Oracle te definiëren
PRAGMA AUTONOMOUS_TRANSACTION; /* in the declaration section of PL/SQL Block */
Oracle Stored Procedure Voorbeeld voor Autonome Transactie
De volgende Oracle-opgeslagen procedure voor de autonome transactie is het loggen van de fouten die zijn opgetreden in elk PL/SQL-programma (procedures, pakketten of functies, enz.). Het zal de foutinformatie invoegen in de tabel error_log en zal de gegevens vastleggen zonder enige hoofdtransactie in een PL/SQL-programma te beïnvloeden. U kunt deze procedure vanuit elk PL/SQL-programma aanroepen om de foutinformatie te loggen. Hieronder laat ik je zien hoe. Maak de volgende objecten om in uw systeem te testen:
Tabel maken Error_Log
CREATE TABLE error_log ( error_code VARCHAR2 (100), error_msg VARCHAR2 (4000), date_occurred DATE, plsql_program_ref VARCHAR2 (100) ) /
Opgeslagen Oracle-procedure voor autonome transactie om fouten te loggen
De onderstaande procedure heeft drie parameters nodig, die u moet doorgeven op het moment dat u de procedure aanroept vanuit andere opgeslagen procedures of functies op het moment van de fout.
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 kunt u de opgeslagen procedure prc_log_errors . aanroepen uit de uitzonderingsbehandelingssectie van andere PL/SQL-programma's om de foutinformatie te loggen. Hier is een voorbeeld:
Tabel test_data maken
CREATE TABLE test_data (some_data VARCHAR2 (100)) /
Functie maken fnc_test
De volgende functie zal wat gegevens invoegen in de test_data tabel, en daarna zal het de fout genereren omdat het wordt gedeeld door 0 in de volgende regel. Bij een fout roept het in de uitzonderingssectie de procedure prc_log_errors . aan om de fout te loggen. Als de functie foutloos wordt uitgevoerd, wordt TRUE geretourneerd, anders wordt FALSE geretourneerd. In het onderstaande geval zal het FALSE retourneren na het loggen van de fout.
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
Roep de bovenstaande functie fnc_test . aan .
BEGIN IF fnc_test THEN COMMIT; ELSE ROLLBACK; END IF; EXCEPTION WHEN OTHERS THEN ROLLBACK; END; /
Zelfs als het terugdraait als het mislukt, worden de gegevens toch opgeslagen in de tabel error_log, omdat de procedure prc_log_errors gebruikt PRAGMA AUTONOMOUS_TRANSACTION .
Controleer de test_data-tabel, mag geen records bevatten.
SELECT * FROM test_data;
Uitvoer
no rows selected.
Controleer gegevens in de tabel error_log
SELECT * FROM error_log;
Uitvoer
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
Zie ook:
- Oracle PL/SQL Bulk Collect met voorbeeld opslaan uitzonderingen