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

SQL Oracle Discussion :

Exécution de trigger génère une récursivité, ORA-00036


Sujet :

SQL Oracle

  1. #1
    Membre régulier
    Homme Profil pro
    Développeur Web
    Inscrit en
    Décembre 2013
    Messages
    205
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Côte d'Ivoire

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Décembre 2013
    Messages : 205
    Points : 102
    Points
    102
    Par défaut Exécution de trigger génère une récursivité, ORA-00036
    Bonjour,
    J'ai crée un trigger qui qui contient une séquence qui génère automatiquement la clé primaire et insert les données dans la table.
    Le problème c'est que j'ai une erreur :
    ORA-00036: maximum number of recursive SQL levels (50) exceeded

    Le script de la séquence :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    CREATE SEQUENCE SEQ_region 
    START WITH 4
    INCREMENT BY 1
    NOCYCLE
    NOCACHE;
    COMMIT;
    Le trigger

    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
    create or replace TRIGGER trg_BI_region
    BEFORE INSERT ON region
     
    FOR EACH ROW
    DECLARE
     v_username varchar2(20);
     
    BEGIN
        SELECT USER INTO v_username FROM dual;
     
        IF INSERTING THEN
            IF(:NEW.regionid IS NULL) THEN
                SELECT SEQ_region.NEXTVAL INTO :NEW.regionid FROM dual;
            END IF;
            INSERT INTO region(regionid, region_name, user_name, update_date) 
            VALUES (:NEW.regionid, :NEW.region_name, v_username, TO_CHAR(SYSTIMESTAMP, 'YYYYMMDDHHMMSS'));
         END IF;
     
        IF UPDATING THEN
             UPDATE region SET user_name = v_username, update_date = TO_CHAR(SYSTIMESTAMP, 'YYYYMMDDHHMMSS');
         END IF;
    END;
    Erreurs générées
    Connexion à la base de données Cnx_HRDBI1.
    ORA-00036: maximum number of recursive SQL levels (50) exceeded
    ORA-00036: maximum number of recursive SQL levels (50) exceeded
    ORA-06512: at "HRDBI1.TRG_BI_REGION", line 5
    ORA-04088: error during execution of trigger 'HRDBI1.TRG_BI_REGION'
    ORA-06512: at "HRDBI1.TRG_BI_REGION", line 11

  2. #2
    Membre chevronné
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    721
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2006
    Messages : 721
    Points : 1 880
    Points
    1 880
    Par défaut
    Il me semble que le problème vient du fait que vous inhibez l'insert qui porte sur la même table region.
    Donc pour faire simple: retirez ce insert de votre trigger. Si vous modifiez les champs de la table virtuelle :NEW, les nouvelles valeurs que vous fournissez devraient être prises en compte automatiquement.
    PS: n'hésitez pas à faire une recherche sur les code ORA, en général il y des éléments de réponses pour chaque code d'erreur.

  3. #3
    Membre chevronné
    Homme Profil pro
    Développeur Oracle
    Inscrit en
    Décembre 2019
    Messages
    1 159
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur Oracle

    Informations forums :
    Inscription : Décembre 2019
    Messages : 1 159
    Points : 1 949
    Points
    1 949
    Par défaut
    Bonjour,

    Ce n'est pas la bonne façon de coder un trigger. Il faut utiliser la variable :NEW directement pour alimenter les colonnes.
    Puisque c'est un trigger BEFORE INSERT, la ligne suivante n'a pas de sens:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    IF UPDATING THEN
             UPDATE region SET user_name = v_username, update_date = TO_CHAR(SYSTIMESTAMP, 'YYYYMMDDHHMMSS');
    END IF;
    Sans compter qu'elle n'est pas correcte, puisque tu mettrais à jour toute la table.

  4. #4
    Rédacteur/Modérateur

    Homme Profil pro
    Ingénieur qualité méthodes
    Inscrit en
    Décembre 2013
    Messages
    4 122
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur qualité méthodes
    Secteur : Conseil

    Informations forums :
    Inscription : Décembre 2013
    Messages : 4 122
    Points : 9 547
    Points
    9 547
    Par défaut
    Un trigger-before-insert, ça ne remplace pas l'insert, ça s'exécute en plus de l'insert, juste avant l'insert.

    Exemple d'utilisation de trigger-before-insert : on insère dans une table AAAA, et via le trigger, on insère une ligne plus ou moins identique dans une table AAAA_Journalisation. Le trigger contient alors juste un insert dans cette table de journalisation.

    Ou encore, pour ton besoin, juste avant d'insérer une ligne :NEW, on modifie le contenu de cette ligne :NEW, on dit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    IF(:NEW.regionid IS NULL) THEN
                SELECT SEQ_region.NEXTVAL INTO :NEW.regionid FROM dual;
    END IF;
    Autrement dit, on supprime les lignes 15 et 16 de ton code.

    Je n'ai pas vérifié, j'ai un léger doute, mais il me semble que ça suffit, c'est un trigger-before-insert, l'insert qui va s'exécuter juste après aura les bonnes données dans :NEW.



    Avec ton code, tu dis :

    J'ai un insert à faire, ok, le trigger me demande de faire un insert supplémentaire. Ah, un nouvel insert à faire, qui lui aussi déclenche un trigger, qui lui aussi provoque un insert ... etc etc ... et tu vas insérer une infinité de lignes.

Discussions similaires

  1. [PowerShell] l'exécution de powershell par un .bat génère une bordée d'injures
    Par laurentSc dans le forum Scripts/Batch
    Réponses: 1
    Dernier message: 17/12/2017, 11h54
  2. Réponses: 2
    Dernier message: 17/12/2015, 10h00
  3. [AC-2002] DTPicker génère une erreur d'exécution 2763
    Par Delioneras dans le forum VBA Access
    Réponses: 2
    Dernier message: 03/10/2013, 10h49
  4. [Débutant] ODP.NET Update génère une erreur ORA
    Par adrien1 dans le forum ADO.NET
    Réponses: 4
    Dernier message: 07/05/2013, 11h50
  5. Exécutable qui génére une erreur windows
    Par jouidos dans le forum Windows Forms
    Réponses: 4
    Dernier message: 22/01/2007, 15h50

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