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 :

Trigger que Oracle ne veut même pas regarder


Sujet :

PL/SQL Oracle

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 13
    Par défaut Trigger que Oracle ne veut même pas regarder
    Salut comme vous pouvez vous en douter j'ai un problème avec un trigger un peu réticent.
    En fait quand je fait mon CREATE TRIGGER ... dans Oracle je tape entrée pour qu'Oracle me le crée mais la il ne fait rien ... ouais rien du tout même pas de message d'erreur rien.
    Alors bon je me permet de vous poster le code en espérant que quelqu'un trouve mon erreur surement aussi grosse qu'un éléphant dans un couloir mais bon je vois 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
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    CREATE OR REPLACE TRIGGER TrgEnchereAuto
    AFTER INSERT ON Enchere
    DECLARE  
       Modif INTEGER;
       EMax INTEGER;
       CURSOR C IS Select * from Enchere;
    BEGIN
      LOOP
         Modif:=0;
         FOR i IN C
         LOOP
            IF  i.NumIDAnnonce = :NEW.NumIDAnnonce
                AND i.EnchereAuto=1
                AND i.MontantMax>ALL(Select E.MontantMax
                                            From Enchere E
                                            Where E.NumIDAnnonce = :NEW.NumIDAnnonce
                                            AND E.EnchereAuto=0)
                AND i.MontantMax<ANY(Select E.MontantMax
                                            From Enchere E
                                            Where E.NumIDAnnonce = :NEW.NumIDAnnonce
                                            AND E.NumID <>i.NumID)
            THEN
                Select MontantMax
                INTO EMAX
                From Enchere E
                Where MontantMax>ALL(Select MontantMax
                                     From Enchere e
                                     Where e.NumIDAnnonce= :NEW.NumIDAnnonce)
                AND E.NumIDAnnonce = :NEW.NumIDAnnonce;
     
                INSERT INTO Enchere VALUES (i.NumID, i.Annonce, EMAX, sysdate, 0);
                Modif := Modif + 1;
            END IF;
         END LOOP;
         EXIT WHEN Modif=0;
      END LOOP;
    END;
    / --[Rajout aprés edition du message suite à la réponse de Michel SALAIS]
    Merci d'avance pour toutes vos reponses et soyez indulgent si j'ai fait beacoup d'erreur dans ce trigger assez volumineux car je suis un débutant.

  2. #2
    Membre chevronné
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    354
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 354
    Par défaut
    Quel outil utilisez-vous?

    Dans SQL*Plus il faut suivre le code par / au début de la ligne mais vous ne serez pas à la fin de vos soucis ...

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 13
    Par défaut
    Justement j'utilise SQL*Plus et je viens d'ajouter le / à la fin du code et en effet ca marche beaucoup mieux.
    Enfin j'ai une erreur dés la première ligne mais bon c'est déjà mieux que rien du tout.
    Merci pour l'information je me doutait bien que je devais oublier quelques chose d'idiot.

    Cependant j'ai maintenant un erreur :
    ERREUR à la ligne 1 :
    ORA-04082: références NEW ou OLD interdites dans déclencheurs niveau table

    Je vais essayer de comprendre ce que ca veut dire mais je ne vois pas vraiment le problème.
    Est ce que par hazard mon trigger est si mal foutu que ca ou bien y a encore une chance de le sauver ?

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

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Par défaut
    je pense que ce serait mieux de nous expliquer ce que tu veux faire parce que le trigger me semble faire n'importe quoi

    notamment t'as pas le droit de mettre à jour la table qui porte le trigger (INSERT dans un trigger INSERT tu penses pas que ça peut poser problème ?)

  5. #5
    Membre chevronné
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    354
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 354
    Par défaut
    Citation Envoyé par Michel SALAIS Voir le message
    Quel outil utilisez-vous?

    Dans SQL*Plus il faut suivre le code par / au début de la ligne mais vous ne serez pas à la fin de vos soucis ...
    C'est bien ce que j'ai dit vu le code du trigger. Il y a effectivement plein de problèmes qui vous attendent. et la je répète la question de Orafrance : Que voulez-vous faire?

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 13
    Par défaut
    Oui tu as raison mon trigger fait vraiment n'importe quoi !
    J'ai ajouté l'option FOR EACH ROW pour palier l'erreur :
    ORA-04082: références NEW ou OLD interdites dans déclencheurs niveau table
    mais ca fait des erreur de compile :
    Avertissement : Déclencheur créé avec erreurs de compilation.

    Alors pour l'explication ca va pas être simple mais je vais essayer d'être clair.

    J'essaye de faire un base de données qui pourrai gerer un site de vente aux enchère style eBay.

    J'ai une table Enchere :
    Enchère (NumID(Utilisateur), NumIDAnnonce(Annonce), MontantMax, DateEnchere, EnchereAuto)

    Et en fait j'ai deux types d'enchères, automatique ou normal défini par mon attribut EnchereAuto (0 pour normal et 1 pour automatique).
    Les enchère normal c'est un utilisateur qui pour une annonce encherie à hauteur d'un montant (MontantMax) à une date (DateEnchere).
    Les enchères automatiques c'est une enchère qui va avoir un MontantMax cependant elle va générer des tuples enchères normal avec pour valeur de MontantMax : la plus grosse enchère actuel sur l'annonce + 10% tant que se total est inferieur à montantmax.

    L'idée du trigger maintenant :
    Aprés insertion dans ma table enchère d'un nouveaux tuple T
    Boucle 1 Pour chaque enchere automatique EA

    Si EA.NumIDAnnonce=T.NumIDAnnonce
    ET si EA.MontantMax est superieur à tout les autres montant des enchere sur l'annonce
    ET si ce n'est pas EA.NumID (l'utilisateur qui à posé l'enchère automatique) qui est le plus gros encherisseur
    ALORS
    On ajoute un nouveaux tuple dans la table enchère qui correspond à une enchère normal (de l'utilisateur qui à posé l'enchère automatique) avec un montant égal à la plus grosse enchère + 10%

    Boucle1 FIN

  7. #7
    Membre chevronné
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    354
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 354
    Par défaut
    Et si deux utilisateurs ont positionné chacun une enchère automatique sur la même annonce que feras-tu? Ce cas doit être traité ...

    Indépendamment, tu feras mieux d'avoir une table à part pour les enchères automatiques mais ce ne sera pas la seule chose à fiare.

  8. #8
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 13
    Par défaut
    Oui je crois que je vais changer la structure de mes tables car en effet je me lance dans des trucs un peu trop compliqué.
    Algorithmiquement j'ai bien en défini le type de traitement que je souhaite faire mais je ne pense pas que ce soit possible d'implanter un tel algorithme avec des triggers.
    Merci pour votre aide vous m'avez fourni des reponses rapides et utiles.

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

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Par défaut
    surtout il faut laisser à l'application le soin de faire les contrôles applicatifs. Tout faire par trigger n'est pas une bonne solution à mon avis

Discussions similaires

  1. Réponses: 1
    Dernier message: 08/07/2010, 11h55
  2. Trigger sous oracle ne fonctionne pas !
    Par ychaabani dans le forum PL/SQL
    Réponses: 4
    Dernier message: 08/02/2010, 10h24
  3. Le serveur ne supporte pas les triggers, que faire
    Par ersoufiane dans le forum MySQL
    Réponses: 3
    Dernier message: 03/10/2009, 13h59
  4. [RMI] ClassNotFoundException que je ne comprends tjs pas
    Par Satch dans le forum API standards et tierces
    Réponses: 4
    Dernier message: 10/05/2007, 12h07
  5. LEFT JOIN avec Oracle 8i ne va pas... doit utiliser (+)
    Par loikiloik dans le forum Langage SQL
    Réponses: 10
    Dernier message: 21/04/2004, 16h38

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