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 :
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;
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.
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 :
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;
Ma question est : pourquoi l'exception ORA-01403 ne remonte pas jusqu'à l'application cliente alors que les autres exceptions le font ?