Dans Oracle, une transaction autonome peut valider ou annuler les données dans la même session sans valider ou annuler dans la transaction principale. L'instruction PRAGMA (directive du compilateur) est utilisée pour définir une transaction autonome dans Oracle. Voici un exemple de transaction autonome Oracle.
Syntaxe pour définir une transaction autonome dans Oracle
PRAGMA AUTONOMOUS_TRANSACTION; /* in the declaration section of PL/SQL Block */
Exemple de procédure stockée Oracle pour une transaction autonome
La procédure stockée Oracle suivante pour la transaction autonome consiste à consigner les erreurs survenues dans n'importe quel programme PL/SQL (procédures, packages ou fonctions, etc.). Il insèrera les informations d'erreur dans la table error_log et validera les données sans affecter aucune transaction principale dans n'importe quel programme PL/SQL. Vous pouvez appeler cette procédure à partir de n'importe quel programme PL/SQL pour consigner les informations d'erreur. Ci-dessous, je vais vous montrer comment. Créez les objets suivants à tester dans votre système :
Créer un tableau Error_Log
CREATE TABLE error_log ( error_code VARCHAR2 (100), error_msg VARCHAR2 (4000), date_occurred DATE, plsql_program_ref VARCHAR2 (100) ) /
Procédure stockée Oracle pour les erreurs de journalisation des transactions autonomes
La procédure ci-dessous prend trois paramètres, que vous devez transmettre au moment de l'appel de la procédure à partir d'autres procédures ou fonctions stockées au moment de l'erreur.
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; /
Vous pouvez maintenant appeler la procédure stockée prc_log_errors à partir de la section de gestion des exceptions d'un autre programme PL/SQL pour enregistrer les informations d'erreur. Voici un exemple :
Créer un tableau test_data
CREATE TABLE test_data (some_data VARCHAR2 (100)) /
Créer la fonction fnc_test
La fonction suivante insère des données dans le test_data table, et après cela, il générera l'erreur car il divise par 0 dans la ligne suivante. En cas d'erreur, dans la section des exceptions, il appelle la procédure prc_log_errors pour consigner l'erreur. Si la fonction s'exécute sans erreur, elle renverra TRUE sinon elle renverra FALSE. Dans le cas ci-dessous, il renverra le FALSE après avoir enregistré l'erreur.
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; /
Tester
Appelez la fonction ci-dessus fnc_test .
BEGIN IF fnc_test THEN COMMIT; ELSE ROLLBACK; END IF; EXCEPTION WHEN OTHERS THEN ROLLBACK; END; /
Même en cas d'échec, les données seront enregistrées dans la table error_log, car la procédure prc_log_errors utilise PRAGMA AUTONOMOUS_TRANSACTION .
Vérifiez la table test_data, elle ne devrait contenir aucun enregistrement.
SELECT * FROM test_data;
Sortie
no rows selected.
Vérifiez les données dans la table error_log
SELECT * FROM error_log;
Sortie
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
Voir aussi :
- Exemple de collecte groupée Oracle PL/SQL avec exceptions d'enregistrement