Bonjour,
Je rencontre un problème assez surprenant :
J'ai une application cliente en C++ qui écrit dans une base de données Oracle 9i.
Un trigger a été créé en BEFORE INSERT sur une table T.
Le trigger se présente sous la forme suivante :
Lorsque l'application cliente insère des données dans la table TABLE_T, le trigger TRIGGER_T est déclenché avant insertion dans cette table.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26 CREATE OR REPLACE TRIGGER SCHEMA_S.TRIGGER_T BEFORE INSERT ON SCHEMA_S.TABLE_T FOR EACH ROW DECLARE type VALEURS is record (VALEUR1 NUMBER(9,0), VALEUR2 NUMBER(9,0), VALEUR3 NUMBER(9,0)); vals VALEURS; BEGIN SELECT SUM(V1) SV1, SUM(V2) SV2, SUM(V3) SV3 into vals FROM (SELECT ... FROM ... WHERE ... ); :new.CHAMP1 := vals.VALEUR1; :new.CHAMP2 := vals.VALEUR2; :new.CHAMP3 := vals.VALEUR3; END;
Dans certains cas le sous SELECT de TRIGGER_T ne retourne pas de lignes (anomalie fonctionnelle). Quand ce sous select ne retourne pas de lignes, le système génère une erreur ORA-01403.
Malheureusement cette exception n'est pas remontée à l'application cliente. Je ne comprend pas pourquoi. En effet si on effectue la même insertion avec les mêmes valeurs depuis Toad ou SqlPlus, ces programmes indiquent bien que l'exception ORA-01403 a été générée.
Afin de valider mon test, j'ai également tenté d'insérer les mêmes valeurs depuis une application en VBA+ADO 2.8. le phénomène est le même. Dans le cas du sous select ne retournant pas de lignes, aucune exception n'est remontée au programme VBA.
Je peux vous confirmer que l'application cliente reçoit toutes les exceptions Oracle sauf celle-ci, même d'autres exceptions générées par le trigger.
Par exemple le trigger suivant génère une exception ORA-01400 que mon application cliente reçoit et traite :
Ma question est : pourquoi l'exception ORA-01403 ne remonte pas jusqu'à l'application cliente alors que les autres exceptions le font ?
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23 CREATE OR REPLACE TRIGGER ROBUST.TRG_CARACTMLIGNEUEMISAGEMAT_I BEFORE INSERT ON ROBUST.CARACTMLIGNEUNITEREMISAGEMAT FOR EACH ROW DECLARE type VALEURS is record (VALEUR1 NUMBER(9,0), VALEUR2 NUMBER(9,0), VALEUR3 NUMBER(9,0)); vals VALEURS; BEGIN SELECT NULL kt, NULL kcc, NULL ku into vals FROM DUAL; :new.CHAMP1 := vals.VALEUR1; :new.CHAMP2 := vals.VALEUR2; :new.CHAMP3 := vals.VALEUR3; END;
Partager