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 :

Réalisation d'un trigger de vérification de valeur


Sujet :

PL/SQL Oracle

  1. #1
    Nouveau Candidat au Club
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Mars 2022
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Ariège (Midi Pyrénées)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Mars 2022
    Messages : 3
    Points : 1
    Points
    1
    Par défaut Réalisation d'un trigger de vérification de valeur
    Bonjour,
    Je doit réaliser un trigger qui doit vérifier l'existence ou nom d'une valeur dans une table et renvoyer un message d’erreur
    Je suis partit dans la rédaction du script ci dessous:

    Code SQL : 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 VERIF_NC
      BEFORE UPDATE OF ST_ETA ON BT
     for each row
    DECLARE 
     CURSOR udi_nc IS
     select gro.id_numgro  from BT 
    left outer join EQU on BT.ID_NUMEQU = equ.id_numequ
    left outer join GRO on EQU.ID_NUMGRO = gro.id_numgro
    where BT.ST_ETA ='NC';
     
    udi char(50);
    numbt char(50);
     
     
    BEGIN
    open udi_nc;
    numbt := :new.id_numbt;
    select gro.id_numgro INTO udi from  BT,EQU,GRO 
    where BT.ID_NUMEQU = equ.id_numequ and 
     EQU.ID_NUMGRO = gro.id_numgro and BT.ID_NUMBT = numbt;
     
    if udi IN udi_nc then
    raise_application_error (- 20002, "NC en cours");
    END IF;
    close udi_nc;
    END;

    Je pense que cela bloque à la comparaison entre ma variable udi et les données du cuseur udi_nc.
    C'est la première fois que j'utilise un curseur car l'utilisation d'une sous requête ne marche pas dans le trigger.
    Pour info je débute en PL/SQL mais cela doit se voir!

  2. #2
    Membre émérite
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Avril 2013
    Messages
    1 993
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Avril 2013
    Messages : 1 993
    Points : 2 499
    Points
    2 499
    Par défaut
    Salut,
    Quand tu lances ton Update, tu as un message d'erreur à l'écran ou bien il ne s'affiche rien à l'écran et l'Update est exécuté?

    Je ne suis pas un pro en PL/SQL mais quand je lis que tu as un test "if udi IN udi_nc then", à quel moment le cursor udi_nc est exécuté et le résultat du SELECT du cursor est stocké dans un tableau?

    Il faudrait plustôt faire :
    - exécuter le curseur
    - stocker le résultat dans une variable de type tableau
    - comparer le contenu de la variable udi avec le contenu du tableau
    DBA Oracle
    Rédacteur du blog : dbaoraclesql.canalblog.com

  3. #3
    Nouveau Candidat au Club
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Mars 2022
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Ariège (Midi Pyrénées)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Mars 2022
    Messages : 3
    Points : 1
    Points
    1
    Par défaut
    J'ai directement un message d'erreur lors de la compilation du trigger.


    Citation Envoyé par Ikebukuro Voir le message
    Il faudrait plutôt faire :
    - exécuter le curseur
    - stocker le résultat dans une variable de type tableau
    - comparer le contenu de la variable udi avec le contenu du tableau
    Je suis d'accord avec toi ! Mais quelle serait la syntaxe à respecter ?

  4. #4
    Membre émérite
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Avril 2013
    Messages
    1 993
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Avril 2013
    Messages : 1 993
    Points : 2 499
    Points
    2 499
    Par défaut
    Merci de nous donner le message d'erreur, cela va nous orienter vers la solution.

    J'ai trouvé ceci sur le net; il faut bien sur l'adapter à ton curseur.
    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
    CREATE OR REPLACE TRIGGER TRG_TABLE_BI
    BEFORE INSERT
    ON TABLE --Remarque Ikebukuro : sa table de test s'appelle TABLE; 
    FOR EACH ROW
    DECLARE
        CURSOR cur_list IS
            SELECT emp, name, day, salary, id,phone
            FROM TABLE NATURAL JOIN OTHERTABLE
            WHERE emp = :NEW.emp AND name = :NEW.name AND id = :NEW.id;
     
        curChoice cur_list%ROWTYPE; -- Remarque Ikebukuro : déclaration d'une variable qui va stocker le résultat du curseur. Attention, dans cette variable tu auras un enregistrement à la fois, pas l'ensemble des lignes retournées par le curseur.
     
    BEGIN
        OPEN cur_list; --Remarque Ikebukuro : ouverture du curseur
        LOOP
            FETCH cur_list INTO curChoice; --Remarque Ikebukuro :ici tu exécutes le curseur et stockes le résultat dans la variable
     
    -- Remarque Ikebukuro c'est ici que tu dois mettre ton test "if udi IN udi_nc" mais je ne penses pas que ça marchera avec cette syntaxe. 
    -- Un "if udi = udi_nc" marchera peut-être mieux; à tester :-)
            EXIT WHEN cur_list%NOTFOUND; --Remarque Ikebukuro : on sort de la boucle quand le cureur ne ramène plus rien
            dbms_output.put_line(curchoice.id);
            dbms_output.put_line(curChoice.emp);
            dbms_output.put_line(curchoice.name);
        END LOOP;
        CLOSE cur_list;  --Remarque Ikebukuro : fermeture du curseur
     
    END;
    /
    DBA Oracle
    Rédacteur du blog : dbaoraclesql.canalblog.com

  5. #5
    Membre chevronné
    Homme Profil pro
    Développeur Oracle
    Inscrit en
    Décembre 2019
    Messages
    1 138
    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 138
    Points : 1 918
    Points
    1 918
    Par défaut
    Bonjour,

    Plusieurs problèmes dans ton trigger. Déjà, tu ne peux pas interroger la table en train d'être modifiée (erreur mutating table). De plus, le message dans le raise_application_error se place entre apostrophes, pas entre guillemets.
    La seule solution pour ce trigger est d'utiliser le pragma autonomous_transaction, mais ce n'est pas recommandé car il ne verra pas les changements liés à d'autres transactions.

    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
    create or replace trigger verif_nc
    before update of st_eta on bt
    for each row
    declare
     pragma autonomous_transaction;
     cnt number;
     
    begin 
     select count(*)
     into cnt
     from bt
     join equ on (equ.id_numequ = bt.id_numeq)
     join gro on (gro.id_numgro = equ.id_numgro)
     where bt.id_numbt = :new.id_numbt
       and bt.st_eta = 'NC'
       and rownum = 1;
     
     if cnt = 1 then
      raise_application_error (- 20002, 'NC en cours'); 
     end if;
    end;
    Le mieux c'est de vérifier directement dans l'update qui a lieu sur la table BT (et qui donc déclenche le trigger).

  6. #6
    Nouveau Candidat au Club
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Mars 2022
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Ariège (Midi Pyrénées)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Mars 2022
    Messages : 3
    Points : 1
    Points
    1
    Par défaut
    Merci Beaucoup pour ta réponse

Discussions similaires

  1. vérification des valeurs dans un fichier texte
    Par tek.csharp dans le forum C#
    Réponses: 0
    Dernier message: 20/05/2010, 17h13
  2. Réponses: 0
    Dernier message: 06/02/2008, 17h09
  3. Trigger pour éviter les valeurs <= 0
    Par zebiloute dans le forum SQL Procédural
    Réponses: 12
    Dernier message: 30/11/2007, 17h09
  4. Vérifications de valeurs ?
    Par innova dans le forum MS SQL Server
    Réponses: 1
    Dernier message: 20/11/2006, 15h23
  5. [IB] [trigger+generator] récup dernière valeur générée ?
    Par fred64 dans le forum Bases de données
    Réponses: 2
    Dernier message: 14/05/2004, 00h38

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