Oracle
 sql >> Base de données >  >> RDS >> Oracle

Exemple de transaction autonome Oracle

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