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]Récupere la valeure courante d'un trigger


Sujet :

Oracle

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    117
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 117
    Par défaut [PL/SQL]Récupere la valeure courante d'un trigger
    bonjour a tous, voila je n'arrive pas a récupere la valeure vourante d'un champs voila mon code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    create or replace trigger gestEmplacement
    after update of acquittee ON Facture
    begin
        update Emplacement 
        set libre=0 
        where numemplacement=(select numemplacement from sejour 
                                where numfact=this.numfact)
    end;
    j'amerais savoir si il existait une sorte de this en pl/sql ?

  2. #2
    Membre éclairé
    Profil pro
    Inscrit en
    Août 2005
    Messages
    68
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2005
    Messages : 68
    Par défaut
    pas de this mais par contre tu as

    et
    Par contre, si tu veux accéder aux valeurs, je crois que tu es obligé de déclarer ton trigger FOR EACH ROW => ton trigger se déclenche pour chaque ligne que tu mets à jour (si tu mets à jour 2 lignes dans un même ordre UPDATE, le trigger se déclenche deux fois).

    Ca donne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    create or replace trigger gestEmplacement
    after update of acquittee ON Facture
    FOR EACH ROW
    begin
        update Emplacement
        set libre=0
        where numemplacement=(select numemplacement from sejour
                                where numfact=:NEW.numfact)
    end;

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    117
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 117
    Par défaut
    es tu bien sur que l'on puisse récuperer une valeure avec le mot clé NEW meme si on ne ne met pas à jour ce champs ? car pour l'instant ca ne fait pas le résultat attendu ...
    Je me demdande si il ne faut pas utiliser un curseur afin de récupere la valeure qui m(interesse ???

  4. #4
    Membre Expert
    Avatar de LeoAnderson
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    2 938
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 2 938
    Par défaut
    Non, si vous faites un curseur, vous allez non seulement perdre du temps, chercher à réinventer ce qui existe et risquez de tomber sur la fameuse table en mutation !

    Si votre trigger est du type AFTER UPDATE FOR EACH ROW, :new vous permet de spécifier "cette ligne qui a déclenché le trigger" alors que :old concerne toujours cette même ligne mais les valeurs avant exécution de la commande.
    Si votre trigger se déclenche sur INSERT, DELETE et/ou en BEFORE, seule l'une ou l'autre de :new et :old sera renseigné, évidemment ! :-)

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    117
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 117
    Par défaut
    bon et bien voila mon tout nouveau triggeur mais voila mon message :
    ORA-04082: références NEW ou OLD interdites dans déclencheurs niveau table.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    create or replace trigger valideFacture
    after update of acquittEE ON Facture
    begin
        update Emplacement
        set libre=1
        where Emplacement.Numemplacement=Sejour.Numemplacement and
        sejour.numfact=facture.numfact and
        facture.numfact=:NEW.numFact
    end;
    en claire ce que je veux faire c'est mettre a jour le champ 'libre' de la table 'Emplcement' lorsque l'on fait un update sur le champ 'acquittEE' de la table 'facture'.

  6. #6
    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
    Par défaut
    Fais un show err juste après la création de ton trigger et tu devrais d'où vient le problème

  7. #7
    Membre confirmé
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    117
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 117
    Par défaut
    variable de lien erronée 'NEW.NUMFACTURE
    Voici l'erreur donc en gros je ne peux pas récupérer le 'numfact' de la ligne sur laquelle le trigger se déclenche ?

  8. #8
    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
    Par défaut
    Citation Envoyé par LeoAnderson
    Si votre trigger est du type AFTER UPDATE FOR EACH ROW, :new vous permet de spécifier "cette ligne qui a déclenché le trigger" alors que :old concerne toujours cette même ligne mais les valeurs avant exécution de la commande.

  9. #9
    Membre Expert
    Avatar de LeoAnderson
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    2 938
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 2 938
    Par défaut
    En effet le FOR EACH ROW est primordial.
    Il permet de dire que si l'ordre impacte pulsieurs lignes, le trigger devra se déclencher n fois (une fois par ligne).
    Dans le cas contraire, il se déclenche une seule fois, pour les 10000 lignes impactées. Il est alors évident que les informations :NEW et :OLD n'ont pas de sens...

  10. #10
    Membre confirmé
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    117
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 117
    Par défaut
    bon et bien voila mon trigger marche voila le code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    create or replace trigger valideFacture
    after update of acquittEE ON Facture
    FOR EACH ROW
    begin
        update Emplacement
        set libre=1
        where numemplacement=(select numemplacement from sejour where numfact=:NEW.numfact );
     
    end;

  11. #11
    Membre averti
    Inscrit en
    Août 2006
    Messages
    15
    Détails du profil
    Informations personnelles :
    Âge : 47

    Informations forums :
    Inscription : Août 2006
    Messages : 15
    Par défaut
    Bonjour,

    Je pensais avoir trouvé la solution à mon problème, mais la mise en oeuvre des précédents messages m'affiche le message d'erreur suivant à la création du trigger :
    Failed to commit: Paramètre IN ou OUT absent dans l'index :: 1

  12. #12
    Membre averti
    Inscrit en
    Août 2006
    Messages
    15
    Détails du profil
    Informations personnelles :
    Âge : 47

    Informations forums :
    Inscription : Août 2006
    Messages : 15
    Par défaut
    Après quelques tests, voici la conclusion, la création du trigger ne s'effectue pas correctement si exécutée via dbVisualizer ou même l'enterprise manager Web d'Oracle 10G.
    Par contre, la création s'effectue très bien avec Toad...

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 2
    Dernier message: 23/11/2009, 20h11
  2. SQL et GUID : Valeur de caractère non valide pour la ....
    Par jackfirst72 dans le forum Bases de données
    Réponses: 5
    Dernier message: 06/03/2007, 10h46
  3. [SQL] récuperer la derniére valeur d'un champ autoincrément
    Par belakhdarbts dans le forum PHP & Base de données
    Réponses: 15
    Dernier message: 26/06/2006, 13h37
  4. Réponses: 3
    Dernier message: 18/06/2005, 00h31
  5. [jsp] récuperation de valeur d'un formulaire
    Par peppena dans le forum Servlets/JSP
    Réponses: 12
    Dernier message: 30/03/2004, 21h00

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