In Oracle, una transazione autonoma può eseguire il commit o il rollback dei dati nella stessa sessione senza eseguire il commit o il rollback nella transazione principale. L'istruzione PRAGMA (direttiva del compilatore) viene utilizzata per definire una transazione autonoma in Oracle. Quello che segue è un esempio di transazione autonoma Oracle.
Sintassi per definire una transazione autonoma in Oracle
PRAGMA AUTONOMOUS_TRANSACTION; /* in the declaration section of PL/SQL Block */
Esempio di procedura memorizzata Oracle per transazione autonoma
La seguente procedura memorizzata Oracle per la transazione autonoma consiste nel registrare gli errori verificatisi in qualsiasi programma PL/SQL (procedure, pacchetti o funzioni, ecc.). Inserisce le informazioni sull'errore nella tabella error_log e salva i dati senza influire su alcuna transazione principale in alcun programma PL/SQL. È possibile chiamare questa procedura da qualsiasi programma PL/SQL per registrare le informazioni sull'errore. Di seguito ti mostrerò come. Crea i seguenti oggetti da testare nel tuo sistema:
Crea registro errori tabella
CREATE TABLE error_log ( error_code VARCHAR2 (100), error_msg VARCHAR2 (4000), date_occurred DATE, plsql_program_ref VARCHAR2 (100) ) /
Procedura memorizzata Oracle per la transazione autonoma per registrare gli errori
Di seguito la procedura accetta tre parametri, che devi passare al momento della chiamata della procedura da altre procedure o funzioni memorizzate al momento dell'errore.
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; /
Ora puoi chiamare la stored procedure prc_log_errors dalla sezione di gestione delle eccezioni di un altro programma PL/SQL per registrare le informazioni sull'errore. Ecco un esempio:
Crea tabella test_data
CREATE TABLE test_data (some_data VARCHAR2 (100)) /
Crea funzione fnc_test
La seguente funzione inserirà alcuni dati nei test_data tabella e, successivamente, genererà l'errore perché sta dividendo per 0 nella riga successiva. In caso di errore, nella sezione delle eccezioni, chiama la procedura prc_log_errors per registrare l'errore. Se la funzione viene eseguita senza errori, restituirà TRUE altrimenti restituirà FALSE. Nel caso seguente, restituirà FALSE dopo aver registrato l'errore.
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
Chiama la funzione sopra fnc_test .
BEGIN IF fnc_test THEN COMMIT; ELSE ROLLBACK; END IF; EXCEPTION WHEN OTHERS THEN ROLLBACK; END; /
Anche se si esegue il rollback in caso di errore, i dati verranno comunque salvati nella tabella error_log, poiché la procedura prc_log_errors sta utilizzando PRAGMA AUTONOMOUS_TRANSACTION .
Controlla la tabella test_data, non dovrebbe avere record.
SELECT * FROM test_data;
Uscita
no rows selected.
Controlla i dati nella tabella error_log
SELECT * FROM error_log;
Uscita
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
Vedi anche:
- Esempio di raccolta in blocco Oracle PL/SQL con eccezioni di salvataggio