Précédent   Forum des professionnels en informatique > Bases de données > Oracle > PL/SQL
PL/SQL Forum d'entraide sur le PL/SQL
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 09/01/2008, 19h57   #1
Invité de passage
 
Inscription : décembre 2007
Messages : 13
Détails du profil
Informations forums :
Inscription : décembre 2007
Messages : 13
Points : 4
Points : 4
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 :
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.
Borni Gloim est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/01/2008, 20h08   #2
Membre éprouvé
 
Inscription : décembre 2007
Messages : 354
Détails du profil
Informations personnelles :
Localisation : France

Informations forums :
Inscription : décembre 2007
Messages : 354
Points : 408
Points : 408
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 ...
Michel SALAIS est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/01/2008, 20h19   #3
Invité de passage
 
Inscription : décembre 2007
Messages : 13
Détails du profil
Informations forums :
Inscription : décembre 2007
Messages : 13
Points : 4
Points : 4
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 ?
Borni Gloim est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/01/2008, 20h58   #4
Rédacteur/Modérateur
 
Avatar de orafrance
 
Inscription : janvier 2004
Messages : 15 861
Détails du profil
Informations personnelles :
Âge : 35

Informations forums :
Inscription : janvier 2004
Messages : 15 861
Points : 16 212
Points : 16 212
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 ?)
orafrance est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/01/2008, 21h17   #5
Membre éprouvé
 
Inscription : décembre 2007
Messages : 354
Détails du profil
Informations personnelles :
Localisation : France

Informations forums :
Inscription : décembre 2007
Messages : 354
Points : 408
Points : 408
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?
Michel SALAIS est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/01/2008, 21h28   #6
Invité de passage
 
Inscription : décembre 2007
Messages : 13
Détails du profil
Informations forums :
Inscription : décembre 2007
Messages : 13
Points : 4
Points : 4
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
Borni Gloim est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/01/2008, 21h47   #7
Membre éprouvé
 
Inscription : décembre 2007
Messages : 354
Détails du profil
Informations personnelles :
Localisation : France

Informations forums :
Inscription : décembre 2007
Messages : 354
Points : 408
Points : 408
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.
Michel SALAIS est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/01/2008, 21h54   #8
Invité de passage
 
Inscription : décembre 2007
Messages : 13
Détails du profil
Informations forums :
Inscription : décembre 2007
Messages : 13
Points : 4
Points : 4
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.
Borni Gloim est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/01/2008, 22h37   #9
Rédacteur/Modérateur
 
Avatar de orafrance
 
Inscription : janvier 2004
Messages : 15 861
Détails du profil
Informations personnelles :
Âge : 35

Informations forums :
Inscription : janvier 2004
Messages : 15 861
Points : 16 212
Points : 16 212
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
orafrance est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 14h48.


 
 
 
 
Partenaires

Hébergement Web