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

Oracle Discussion :

[PL/SQL] Trigger qui appelle une procédure


Sujet :

Oracle

  1. #1
    Membre du Club
    Inscrit en
    Septembre 2005
    Messages
    219
    Détails du profil
    Informations forums :
    Inscription : Septembre 2005
    Messages : 219
    Points : 44
    Points
    44
    Par défaut [PL/SQL] Trigger qui appelle une procédure
    Bonjour,

    J'ai créé sous Oracle un TRIGGER (sur la mise à jour du champ a dans une table Ma_table) au sein duquel je souhaite lancer une procédure pour mettre à jour (UPDATE) deux champs si a est supérieur à 1 (dans ce cas je veux mettre le champ u à 1 et le champ a reste à 1.) Or j'ai un message d'erreur qui me dit que ma syntaxe est incorrecte. Je précise que le trigger et la procédure compilent bien mais avec erreurs et que x, y et z sont les attributs qui forment la clé primaire de Ma_table.

    Voici mon code :

    CREATE PROCEDURE Ma_procedure (
    m_x IN NUMBER(8 ),
    m_y IN NUMBER(8 ),
    m_z IN NUMBER(8 )
    )
    IS
    BEGIN
    UPDATE Ma_table SET (u = 1) AND (a = 1)
    WHERE (x = m_x) AND (y = m_y) AND (z = m_z);
    COMMIT;
    END;
    /

    CREATE TRIGGER Mon_trigger UPDATE OF a ON Ma_table
    FOR EACH ROW
    BEGIN
    IF (:new.a > 1) THEN
    CALL Ma_procedure(:new.x,:new.y,:new.z);
    END IF;
    END;
    /

    Merci pour votre aide. Je suis preneur d'une quelconque indication ;-)

  2. #2
    Membre expert

    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Janvier 2004
    Messages
    2 862
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Chef de projet en SSII
    Secteur : Conseil

    Informations forums :
    Inscription : Janvier 2004
    Messages : 2 862
    Points : 3 609
    Points
    3 609
    Par défaut
    Le colonnes mises à jour sont à séparer par des virgules (et non par des and) dans la clause set.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    UPDATE Ma_table SET u = 1, a = 1 
    WHERE (x = m_x) AND (y = m_y) AND (z = m_z);
    Un problème sans solution est un problème mal posé

    Merci de poser vos questions sur le forum, je ne réponds pas aux questions posées par MP.

  3. #3
    Membre expert

    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Janvier 2004
    Messages
    2 862
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Chef de projet en SSII
    Secteur : Conseil

    Informations forums :
    Inscription : Janvier 2004
    Messages : 2 862
    Points : 3 609
    Points
    3 609
    Par défaut
    Attention dans un trigger vous ne pouvez pas mettre à jour la table concernée par le trigger sinon vous allez vous trouvez confronté à l'erreur sur les tables en mutation (ora-04091). Voici une documentation sur cette erreur :
    http://sgbd.developpez.com/oracle/ora-04091/
    Un problème sans solution est un problème mal posé

    Merci de poser vos questions sur le forum, je ne réponds pas aux questions posées par MP.

  4. #4
    Expert éminent sénior
    Avatar de orafrance
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    15 967
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Points : 19 073
    Points
    19 073
    Par défaut
    Ce serait nettement mieux d'expliquer le but parce qu'il me semble que la solution n'est super top

  5. #5
    Membre du Club
    Inscrit en
    Septembre 2005
    Messages
    219
    Détails du profil
    Informations forums :
    Inscription : Septembre 2005
    Messages : 219
    Points : 44
    Points
    44
    Par défaut
    En fait il s'agit de regarder si un joueur à plus d'un carton jaune au cours d'un match de football, si tel est le cas on mets à 1 son nombre de cartons rouges et à 1 également son nombre de cartons jaunes. Je voulais juste généraliser, j'espère que c'est plus clair maintenant...

  6. #6
    Expert éminent sénior
    Avatar de orafrance
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    15 967
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Points : 19 073
    Points
    19 073
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    CREATE TRIGGER Mon_trigger UPDATE OF a ON Ma_table
    FOR EACH ROW
    BEGIN
    IF (:new.carton_jaune > 1) THEN
    :new.carton_rouge :=1;
    END IF;
    END;
    /
    tout simplement

Discussions similaires

  1. Réponses: 0
    Dernier message: 06/05/2015, 11h47
  2. Connaître le code qui appelle une procédure
    Par The Jos dans le forum Langage
    Réponses: 4
    Dernier message: 13/08/2010, 11h08
  3. Zend : Faire appel à une procédure stocké SQL
    Par CocoLeNain dans le forum Zend_Db
    Réponses: 2
    Dernier message: 22/04/2009, 10h23
  4. [Delphi 7] Lien web qui appelle une procédure
    Par Kropernic dans le forum Web & réseau
    Réponses: 9
    Dernier message: 16/11/2007, 09h17
  5. Réponses: 2
    Dernier message: 21/04/2006, 14h32

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