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 :

Erreur de déclencheurs


Sujet :

Oracle

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    55
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 55
    Points : 43
    Points
    43
    Par défaut Erreur de déclencheurs
    Bonjour, je souhaiterai ajouter le trigger suivant mais j'ai une erreur que je ne connais pas la source :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    CREATE OR REPLACE TRIGGER "TRG_TEST" 
        AFTER
    INSERT
    OR UPDATE OF "GEN_ID_KIND" ON "KIND"
    REFERENCING OLD AS OLDROW
                       NEW AS NEWROW FOR EACH ROW
    WHEN (NEWROW.GEN_ID_KIND IS NOT NULL)
    BEGIN
    FOR iter IN (SELECT id_frontkind FROM KIND WHERE id_kind= :NEWROW.gen_id_kind)  LOOP
    :NEWROW.id_kind:= iter.id_frontkind;
    END LOOP;
    END;
    Erreur : Paramètre In ou OUT absent dans l'index :: 1

    Merci de vos réponses

  2. #2
    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
    je ne comprends pas bien l'erreur mais le curseur ne marchera pas. Tu ne peux pas faire de SELECT sur la table qui porte le trigger.

    qu'est ce que tu veux faire exactement ?

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    55
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 55
    Points : 43
    Points
    43
    Par défaut
    en fait, lorsque j'ajoute ou je modifierai un champ Gen_id_KIND de la table KIND, je regarde si le champ gen_id_kind n'est pas null.
    Ce champ référence un autre élément de la meme table.

    Si il n'est pas null, je vais chercher dans la table cet element et j'affecte la meme valeur du champ id_frontkind

    PS : j'ai édité la procédure, je me suis légerement égaré. Pardon

  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 : 47
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Points : 19 075
    Points
    19 075
    Par défaut
    dans le cas tu dois faire une fonction en AUTONOMOUS TRANSACTION pour retourner la valeur à modifier... je te laisse faire une recherche pour les détails

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    55
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 55
    Points : 43
    Points
    43
    Par défaut
    Citation Envoyé par Fred_D
    Tu ne peux pas faire de SELECT sur la table qui porte le trigger.
    Erf , donc ça sera impossible ...

    Merci je vais faire une recherche sur ceci, ... je dirai quoi demain.

    Merci encore

  6. #6
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    55
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 55
    Points : 43
    Points
    43
    Par défaut
    J'aurais encore besoin de votre aide.
    J'ai étudié les AUTONOMOUS_TRANSACTION .

    Voila ce que j'ai fait :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    CREATE OR REPLACE  PROCEDURE "PRC_FRONTKIND" (
    idkind in genre.gen_id_kind%TYPE
    )
    is pragma autonomous_transaction;
    begin
    for rec in ( select id_frontkind from kind where id_kind = idKind ) loop
    update kind set id_frontkind = rec.id_frontkind where id_kind = idKind;
    end loop;
    commit;
    end;
    Cette compilation de procédure n'a engendré aucune erreur.

    Maitenant , il faut faire le trigger :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    CREATE OR REPLACE TRIGGER TRG_FRONTKIND
        AFTER
    INSERT
    OR UPDATE OF "GEN_ID_KIND" ON "KIND" REFERENCING OLD AS oldrow NEW AS newrow FOR EACH ROW WHEN (newrow.gen_id_kind is not null) begin
    prc_frontgenre(:newrow.id_kind);
    end;
    Cette dernière me génère toujours l'erreur
    Paramètre In ou OUT absent dans l'index :: 1;


    Où me suis je trompé dans le trigger ?

    Merci de vos aides.

  7. #7
    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
    j'ai un doute là...

    for rec in ( select id_frontkind from kind where id_kind = idKind ) loop
    update kind set id_frontkind = rec.id_frontkind where id_kind = idKind;
    end loop;
    on est d'accord que idkind est unique... donc à chaque boucle tu mets à jour toutes les lignes où id_kind = idKind... du coup c'est les valeurs de la dernière passe dans la boucle qui seront mise... il y a un soucis dans ton traitement là

  8. #8
    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 irenee
    Si il n'est pas null, je vais chercher dans la table cet element et j'affecte la meme valeur du champ id_frontkind
    j'ai pas compris ça... tu veux mettre à jour la colonne des lignes filles de ton enregistrement... mais avec quelle valeur ?

  9. #9
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    55
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 55
    Points : 43
    Points
    43
    Par défaut
    oui, exact, mais comme tu l'a deviné , id_kind est unique et primaire, forcément , dans la boucle , je passe une fois ou jamais.

  10. #10
    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
    dans ce cas tu n'as qu'à faire :

    CREATE OR REPLACE PROCEDURE PRC_FRONTKIND (
    idkind IN NUMBER, idfrontkind IN NUMBER
    )
    is pragma autonomous_transaction;
    begin
    update kind set id_frontkind = idfrontkind where id_kind = idKind;
    commit;
    end;
    dans ton trigger :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    prc_frontgenre(:newrow.id_kind,:newrow.id_frontkind );
    non ?

    Attention, pas de %TYPE dans les paramètres

  11. #11
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    55
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 55
    Points : 43
    Points
    43
    Par défaut
    je vais détailler les tables :

    KIND :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    ID_KIND GEN_ID_KIND ID_FRONTKIND
    1          null        7
    2          null        8
    3          1           7
    Je voudrais par exemple , que lorsque je fais INSERT into KIND( id_kind, gen_id_kind) values (4, 2) qu'il m'affecte automatiquement le champ id_frontkind à celle de la 2 eme ligne, soit 8.

  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
    bah oui... donc :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    update kind set id_frontkind = idfrontkind where id_kind = idKind;
    et tu passes :new.id_frontkind et :new.gen_id_kind à la procédure... rien de plus simple

  13. #13
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    55
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 55
    Points : 43
    Points
    43
    Par défaut
    Euh je n'ai pas très bien compris.

    Voici en détail mes procédures, fonctions et triggers. Peut tu me dire s'il te paraissent correctes ?

    Fonction toute bête, qui me retourne le frontkind d'un kind donné.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    CREATE OR REPLACE  FUNCTION "GIVEFRONTKIND" (idkind IN NUMBER)
    return NUMBER
    is idfront NUMBER;
    begin
    select id_frontkind into idfront from kind where id_kind = idkind;
    return idfront;
    end givefrontkind;
    Procedure de MAJ de la table
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    CREATE OR REPLACE  PROCEDURE "PRC_FRONTKIND" (idkind IN NUMBER, idfrontkind IN NUMBER)
    is pragma autonomous_transaction;
    begin
    update kind set id_frontkind = givefrontkind(idfrontkind) where id_genre = idKind;
    commit;
    end;
    trigger associés à la procedure
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    CREATE OR REPLACE TRIGGER "TRG_FRONTKIND" 
        AFTER
    INSERT
    OR UPDATE OF "GEN_ID_KIND" ON "KIND" REFERENCING OLD AS OLDROW NEW AS NEWROW FOR EACH ROW begin
    if :newrow.gen_id_kind is not null then
    prc_frontkind(:newrow.id_kind, :newrow.gen_id_kind);
    end if; 
    end;
    voila ce que j'ai fait, à mon avis tu dois penser à la même chose ...
    Sauf que le "update" de la proc ne marche pas. J'ai l'impression que , pendant cette requete, la table prise est celle sans l'insertion !!! et donc la mise à jour ne fonctionne pas.

  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
    pourquoi tu fais la fonction GIVEFRONTKIND alors que la valeur tu la connais ? C'est :new.id_front_kind.

    De toute façon, le select ne peut pas te trouver la ligne alors qu'elle est en cours d'insertion... ça parait logique quand même

  15. #15
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    55
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 55
    Points : 43
    Points
    43
    Par défaut
    Citation Envoyé par Fred_D
    pourquoi tu fais la fonction GIVEFRONTKIND alors que la valeur tu la connais ? C'est :new.id_front_kind.
    Et non justement, je ne la connais pas. Les insertions se sont qu'avec les 2 premiers champs (id_kind et gen_id_kind). Je dois remplir le :new.id_frontkind

    Citation Envoyé par Fred_D
    De toute façon, le select ne peut pas te trouver la ligne alors qu'elle est en cours d'insertion... ça parait logique quand même
    Ici je recherche un élément déja inséré dans la table, donc ce select marche sans souci.

  16. #16
    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
    donc il n'y a qu'une seule ligne qui peut être la fille de celle que tu insères ?

    Dans ce cas :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    CREATE OR REPLACE TRIGGER "TRG_FRONTKIND" 
        AFTER
    INSERT
    OR UPDATE OF "GEN_ID_KIND" ON "KIND" REFERENCING OLD AS OLDROW NEW AS NEWROW FOR EACH ROW begin
    if :newrow.gen_id_kind is not null then
    :newrow.id_frontkind := GIVEFRONTKIND(:newrow.id_kind);
    end if; 
    end;

  17. #17
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    55
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 55
    Points : 43
    Points
    43
    Par défaut
    Merci Fred_D, c'était presque ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    CREATE OR REPLACE TRIGGER "TRG_FRONTKIND" 
        BEFORE
    INSERT
    OR UPDATE OF "GEN_ID_KIND" ON "KIND" REFERENCING OLD AS OLDROW NEW AS NEWROW FOR EACH ROW begin
    if :newrow.gen_id_kind is not null then
    :newrow.id_frontkind := GIVEFRONTKIND(:newrow.id_kind);
    end if; 
    end;
    et surtout
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    CREATE OR REPLACE  FUNCTION "GIVEFRONTKIND" ( 
        idkind IN NUMBER
    )
    return NUMBER
    is idfront NUMBER;
    pragma autonomous_transaction;
    begin
    select id_frontkind into idfront from kind where id_kind = idkind;
    return idfront;
    end givefrontkind;
    Sinon j'aboutit toujours au même problème de blocage de SELECT de la table portant le trigger...

    En tout cas , un très grand merci pour ton aide. Tu m'a très bien aidé.

  18. #18
    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
    c'est quoi ce blocage ?

    content de t'avoir aidé, mais j'espère surtout que tu as compris pourquoi ça fonctionne

  19. #19
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    55
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 55
    Points : 43
    Points
    43
    Par défaut
    Citation Envoyé par Fred_D
    c'est quoi ce blocage ?
    En fait, vu qu'on appelle la fonction GIVEFRONTKIND, qui fait un select sur la table comportant le trigger, le souci réapparait ...

    Merci de m'avoir guider sur le pragma autonomous_transaction ... J'aurais passer 2 semaines à le trouver

  20. #20
    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
    mais quel souci ?

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

Discussions similaires

  1. Réponses: 10
    Dernier message: 25/07/2011, 16h02
  2. Réponses: 11
    Dernier message: 11/03/2009, 23h12
  3. Déclencheur créé avec erreurs de compilation.
    Par mehdiyou dans le forum SQL
    Réponses: 6
    Dernier message: 16/04/2008, 13h39
  4. Erreur dans le déclencheur on-check-delete-master
    Par rvfranck dans le forum Oracle
    Réponses: 4
    Dernier message: 19/11/2004, 11h53
  5. déclencheur et message d'erreur
    Par marie253 dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 19/08/2004, 17h00

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