IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

PL/SQL Oracle Discussion :

Trigger before insert - ORA 1403 non détecté


Sujet :

PL/SQL Oracle

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    26
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 26
    Points : 16
    Points
    16
    Par défaut Trigger before insert - ORA 1403 non détecté
    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 ?

  2. #2
    Membre à l'essai
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    26
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 26
    Points : 16
    Points
    16
    Par défaut
    Apparemment il semble que l'exception ne soit pas implicitement remontée à l'application cliente parce que l'exception ne fait pas partie de la catégorie des erreurs mais de la catégorie des messages informels.

    Est-ce que quelqu'un peut confirmer ?

  3. #3
    Expert confirmé
    Profil pro
    Inscrit en
    Août 2008
    Messages
    2 947
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 2 947
    Points : 5 846
    Points
    5 846
    Par défaut
    Les 2 codes ne sont pas équivalent, il n'y a pas d'erreur no_data_found renvoyé par un SELECT INTO lorsqu'on utilise une fonction d'agrégation.
    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
    27
    28
    SQL> declare
      2    l_val number;
      3  begin
      4    select 1 into l_val
      5      from dual
      6     where 0 = 1;
      7  end;
      8  /
    declare
    *
    ERROR at line 1:
    ORA-01403: no data found
    ORA-06512: at line 4
     
     
    SQL>
    SQL> declare
      2    l_val number;
      3  begin
      4    select sum(1) into l_val
      5      from dual
      6     where 0 = 1;
      7  end;
      8  /
     
    PL/SQL procedure successfully completed.
     
    SQL>
    Ils faudraient vérifier les tests menés ?

Discussions similaires

  1. [10g] Trigger before insert
    Par Lung dans le forum Oracle
    Réponses: 6
    Dernier message: 21/12/2007, 16h22
  2. Trigger Before Insert et Before Update
    Par NicoNours dans le forum SQL Procédural
    Réponses: 4
    Dernier message: 14/08/2007, 10h20
  3. Trigger : Before insert
    Par guitou0 dans le forum Développement
    Réponses: 6
    Dernier message: 29/06/2007, 11h39
  4. Trigger Before Insert
    Par Fred_ET dans le forum Administration
    Réponses: 7
    Dernier message: 22/11/2006, 00h29
  5. Créer un trigger "before insert" avec SQL Server
    Par bubi dans le forum Développement
    Réponses: 2
    Dernier message: 14/11/2005, 10h12

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo