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

Administration Oracle Discussion :

quelle instruction faut il utiliser dans le trigger jouant le rôle que distinct


Sujet :

Administration Oracle

  1. #1
    Membre à l'essai
    Inscrit en
    Octobre 2006
    Messages
    47
    Détails du profil
    Informations forums :
    Inscription : Octobre 2006
    Messages : 47
    Points : 23
    Points
    23
    Par défaut quelle instruction faut il utiliser dans le trigger jouant le rôle que distinct
    Bonjour,

    j'ai besoin d'utiliser le distinct dans mon trigger mais cela ne marche pas. Ya -il autre chose qui puisse marcher. J'ai aussi essaye le unique lui aussi ne fonctionne pas.

    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
    CREATE OR REPLACE TRIGGER insert_table1
    before INSERT ON table1 FOR each row
     
    declare
    begin
     
     
              INSERT INTO attestcmp (............ )  SELECT distinct r.tab_y, r.tab_b, r.tab_s, r.tab_n, r.tab_d, s.tab_r_s, s.tab_r_n, s.tab_r_d, s.tab_r_cons, i.tab_hs_c||i.tab_hsp_c AS tar
            FROM table1 r, sadg s, sadi i
            WHERE r.ky = s.ky AND
                  r.kc = s.kc AND
                  r.kd = s.kd AND
                  r.kn = s.kn AND
                  r.ky = i.ky AND
                  r.kc = i.kc AND
                  r.kd = i.kd AND
                  r.kn = i.kn AND 
                  i.tab_hs_c||i.tab_hsp_c= '239100';

  2. #2
    McM
    McM est déconnecté
    Expert éminent

    Homme Profil pro
    Développeur Oracle
    Inscrit en
    Juillet 2003
    Messages
    4 580
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Oracle

    Informations forums :
    Inscription : Juillet 2003
    Messages : 4 580
    Points : 7 740
    Points
    7 740
    Billets dans le blog
    4
    Par défaut
    Un SELECT dans un trigger a le même fonctionnement qu'un SELECT sous SQLPLUS.

    PS : Ton code : i.tab_hs_c||i.tab_hsp_c= '239100'
    Attention, tout dépend de ce que tu peux avoir dans tes colonnes, mais tu peux te retrouver avec
    TAB_HS_C || TAB_HSP_C = '239100'
    '2' '39100'
    '23' '9100'
    '239' '100'
    '2391' '00'
    '23910' '0'

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

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Points : 19 075
    Points
    19 075
    Par défaut
    comme il faut deviner l'erreur moi je miserai bien sur un mutating table et m'est avis qu'une recherche permettrait de répondre à la question

  4. #4
    Membre à l'essai
    Inscrit en
    Octobre 2006
    Messages
    47
    Détails du profil
    Informations forums :
    Inscription : Octobre 2006
    Messages : 47
    Points : 23
    Points
    23
    Par défaut
    je sais ce qu'il ya dans mes colonnes et je sais d'ailleurs pourquoi j'ai des enregistrements multiples. Ce que je veux c'est d'uliser le distinct pour qu'il ne me renvoie qu'un seul enregistrement par insersion.

    J'ai utiliser avec le même select le distinst sous SQLPLUS ça marche mais une fois dans le trigger ça ne réagit pas.

  5. #5
    Membre émérite Avatar de nuke_y
    Profil pro
    Indépendant en analyse de données
    Inscrit en
    Mai 2004
    Messages
    2 076
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Indépendant en analyse de données

    Informations forums :
    Inscription : Mai 2004
    Messages : 2 076
    Points : 2 370
    Points
    2 370
    Par défaut
    Je ne sais pas si c'est ça, mais vu le trigger (BEFORE INSERT) ça veut dire que si tu as les données suivantes à insérer dans table1 :
    Ca va donner ça :
    Insertion de a 1
    -> déclenchement du trigger, insertion de n lignes dans attestcmp
    Insertion de b 2
    -> déclenchement du trigger, insertion de n lignes dans attestcmp
    Insertion de c 2
    -> déclenchement du trigger, insertion de n lignes dans attestcmp
    ...
    Donc c'est normal que tu ais des doublons dans attestcmp. Est-ce que tu ne devrais pas filtrer la (les) ligne(s) à insérer en te basant sur la clé de ligne qui est interceptée par le trigger ?

  6. #6
    Expert éminent sénior
    Avatar de SheikYerbouti
    Profil pro
    Inscrit en
    Mai 2003
    Messages
    6 760
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2003
    Messages : 6 760
    Points : 11 862
    Points
    11 862
    Par défaut
    Comme le présume Fred,l'erreur en exécution est probablement table en mutation car vous ne pouvez pas exécuter un ordre du DML sur la même table que celle qui supporte le trigger.

  7. #7
    Membre émérite Avatar de nuke_y
    Profil pro
    Indépendant en analyse de données
    Inscrit en
    Mai 2004
    Messages
    2 076
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Indépendant en analyse de données

    Informations forums :
    Inscription : Mai 2004
    Messages : 2 076
    Points : 2 370
    Points
    2 370
    Par défaut
    Excusez moi mais je ne comprend pas. La table dans laquelle le trigger insère est attestcmp et celle qui possède le trigger est table1, non ?

    Ou alors un truc m'échappe...

    EDIT :
    Il ne parle pas d'erreur en exécution, il dit que "ça ne marche pas", non ?

  8. #8
    Expert éminent sénior
    Avatar de SheikYerbouti
    Profil pro
    Inscrit en
    Mai 2003
    Messages
    6 760
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2003
    Messages : 6 760
    Points : 11 862
    Points
    11 862
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    ...
    CREATE OR REPLACE TRIGGER insert_table1
    before INSERT ON table1 FOR each row
     
    declare
    begin
     
     
              INSERT INTO attestcmp (............ )  SELECT distinct r.tab_y, r.tab_b, r.tab_s, r.tab_n, r.tab_d, s.tab_r_s, s.tab_r_n, s.tab_r_d, s.tab_r_cons, i.tab_hs_c||i.tab_hsp_c AS tar
            FROM table1 r, sadg s, sadi i
    ...

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

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Points : 19 075
    Points
    19 075
    Par défaut
    TRIGGER insert_table1
    before INSERT ON table1 FOR each row

    declare
    begin


    INSERT INTO attestcmp (............ ) SELECT distinct r.tab_y, r.tab_b, r.tab_s, r.tab_n, r.tab_d, s.tab_r_s, s.tab_r_n, s.tab_r_d, s.tab_r_cons, i.tab_hs_c||i.tab_hsp_c AS tar
    FROM table1 r, sadg s, sadi i
    mutating table

    grillaid

    Sheik balises CODE

  10. #10
    Expert éminent sénior
    Avatar de SheikYerbouti
    Profil pro
    Inscrit en
    Mai 2003
    Messages
    6 760
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2003
    Messages : 6 760
    Points : 11 862
    Points
    11 862
    Par défaut
    On peut jouer avec le gras dans les balises code ?

  11. #11
    Membre éprouvé
    Inscrit en
    Avril 2006
    Messages
    1 024
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 1 024
    Points : 1 294
    Points
    1 294
    Par défaut
    Y'a un truc un peu bizarre, c'est que sur un trigger "FOR EACH ROW" à aucun moment on ne fait référence à la donnée insérée (:NEW.machin) ce qui fait qu'à chaque ligne insérée, on répète la meme requête... meme s'il n'y avait pas l'erreur de table en mutation, c'est un peu loufoque d'accumuler à chaque fois la meme chose dans la table attestcmp... m'enfin bon ce n'est qu'une opinion gratuite...

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

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Points : 19 075
    Points
    19 075
    Par défaut
    Citation Envoyé par SheikYerbouti
    On peut jouer avec le gras dans les balises code ?
    l'astuce c'est la balise QUOTE


  13. #13
    Membre éprouvé
    Inscrit en
    Avril 2006
    Messages
    1 024
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 1 024
    Points : 1 294
    Points
    1 294
    Par défaut
    Citation Envoyé par SheikYerbouti
    On peut jouer avec le gras dans les balises code ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     je sais pas, ça se teste... ;)

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

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Points : 19 075
    Points
    19 075
    Par défaut
    Citation Envoyé par remi4444
    m'enfin bon ce n'est qu'une opinion gratuite...
    faut dire qu'on a tellement peu d'info qu'on en est tous réduit à ça

  15. #15
    Membre émérite Avatar de nuke_y
    Profil pro
    Indépendant en analyse de données
    Inscrit en
    Mai 2004
    Messages
    2 076
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Indépendant en analyse de données

    Informations forums :
    Inscription : Mai 2004
    Messages : 2 076
    Points : 2 370
    Points
    2 370
    Par défaut
    Citation Envoyé par remi4444
    Y'a un truc un peu bizarre, c'est que sur un trigger "FOR EACH ROW" à aucun moment on ne fait référence à la donnée insérée (:NEW.machin) ce qui fait qu'à chaque ligne insérée, on répète la meme requête... meme s'il n'y avait pas l'erreur de table en mutation, c'est un peu loufoque d'accumuler à chaque fois la meme chose dans la table attestcmp... m'enfin bon ce n'est qu'une opinion gratuite...
    C'est exactement ce que je pense, et c'était ce que j'expliquais.

    Après l'histoire de la mutating table, j'ai toujours pas compris en quoi ça posait un problème de faire un select sur une table dans un trigger BEFORE INSERT qui porte sur la table. Mais ça doit justement être le point de détail qui rend ce truc problématique. Je ferais des tests pour voir par moi même et je chercherais de la doc sur la mutating table pour comprendre.

  16. #16
    Membre à l'essai
    Inscrit en
    Octobre 2006
    Messages
    47
    Détails du profil
    Informations forums :
    Inscription : Octobre 2006
    Messages : 47
    Points : 23
    Points
    23
    Par défaut
    je donne un peu la structure de la table 1 :

    table 1 (tab_y,tab_b,tab_s,tab_n,ky,kc,kd,kn,t_cod)

    Cette table est en relation avec une autre table nommé table 2 qui lui est définit de la maniére suivante :
    table 2 (t_cod, t_lib, ngt, par)

    Cette table table 2 n'intervient pas lui dans mon trigger mais comme table 1 est liée à table table2, si cette derniére à 5 t_cod, table 1 aura à son tour 5 references ce qui est normal. exple :

    table 1 :
    (
    tab_y 20061020
    tab_b LMO
    tab_s F
    tab_n 3
    ky 2006
    kc LMO
    kd NHUI
    kn 12
    t_cod CHAT

    tab_y 20061020
    tab_b LMO
    tab_s F
    tab_n 3
    ky 2006
    kc LMO
    kd NHUI
    kn 12
    t_cod SOURIS

    tab_y 20061020
    tab_b LMO
    tab_s F
    tab_n 3
    ky 2006
    kc LMO
    kd NHUI
    kn 12
    t_cod LAPIN

    tab_y 20061020
    tab_b LMO
    tab_s F
    tab_n 3
    ky 2006
    kc LMO
    kd NHUI
    kn 12
    t_cod BOEUF

    tab_y 20061020
    tab_b LMO
    tab_s F
    tab_n 3
    ky 2006
    kc LMO
    kd NHUI
    kn 12
    t_cod CHIEN
    )


    or moi les reférences que je recupére dans la table 1 sont indépendamment de t_cod, c'est pour ça que je veux le distinct pour m'épargner 5, 8, ou n enreristrement lié à la table table 2. Puisque ce que je recupére dans table 1 les champs suivants pour la table attestcmp
    tab_y 20061020
    tab_b LMO
    tab_s F
    tab_n 3

    voilà j'espère que je me fais comprendre

  17. #17
    Membre éprouvé
    Inscrit en
    Avril 2006
    Messages
    1 024
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 1 024
    Points : 1 294
    Points
    1 294
    Par défaut
    Citation Envoyé par hadid
    ....
    voilà j'espère que je me fais comprendre
    Pas vraiment vraiment...

    Le problème c'est que dans ton trigger, on ne vois jamais de référence avec l'enregistrement courant, c'est là que le mystère reste épais pour moi.... quel que soit la ligne que tu insères, tu fait toujours la même requête, c'est bizarre....

    Tu connais le fonctionnement de :NEW ? si oui, pourquoi tu ne l'utilises pas ?

  18. #18
    Membre à l'essai
    Inscrit en
    Octobre 2006
    Messages
    47
    Détails du profil
    Informations forums :
    Inscription : Octobre 2006
    Messages : 47
    Points : 23
    Points
    23
    Par défaut
    je m'exuse voici le trigger en question

    CREATE OR REPLACE TRIGGER insert_attestcmp
    before INSERT ON table1 FOR each row

    declare
    begin


    INSERT INTO attestcmp SELECT distinct :new.tab_y, :new.tab_b, :new.tab_s, :new.tab_n, :new.tab_d, s.tab_r_s, s.tab_r_n, s.tab_r_d, s.tab_r_cons, i.tab_hs_c||i.tab_hsp_c AS tar
    FROM sadg s, sadi i
    WHERE :new.ky = s.ky AND
    :new.kc = s.kc AND
    :new.kd = s.kd AND
    :new.kn = s.kn AND
    :new.ky = i.ky AND
    :new.kc = i.kc AND
    :new.kd = i.kd AND
    :new.kn = i.kn AND
    i.tab_hs_c||i.tab_hsp_c= '239100';



    c'est celui là

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

Discussions similaires

  1. Réponses: 5
    Dernier message: 25/08/2012, 15h09
  2. quelle sont les balises utilisent dans le javascript de débutant ?
    Par oussamadag dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 15/01/2010, 21h49
  3. Quelles classes faut-il utiliser?
    Par anaranjado dans le forum AWT/Swing
    Réponses: 3
    Dernier message: 31/12/2008, 11h41
  4. Que faut il utiliser pour faire des recherches dans LDAP?
    Par kabouns dans le forum API standards et tierces
    Réponses: 5
    Dernier message: 04/08/2006, 15h24
  5. Réponses: 7
    Dernier message: 12/07/2006, 10h24

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