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 :

Erreur PL/SQL déclencheur créé avec erreur de compilation


Sujet :

PL/SQL Oracle

  1. #1
    Membre à l'essai
    Inscrit en
    Avril 2008
    Messages
    22
    Détails du profil
    Informations forums :
    Inscription : Avril 2008
    Messages : 22
    Points : 14
    Points
    14
    Par défaut Erreur PL/SQL déclencheur créé avec erreur de compilation
    Salut à tous,

    Alors je vous préviens, je débute à PL/SQL c'est mon premier trigger mais comme le sujet l'indique il est pas encore au point... ^^

    Alors ce que je dois faire:
    Le déclencheur doit en cas d'ajout ou de modification vérifier les informations suivantes:
    - que pour le même NO de contrat à la même date qu'il n'y ai pas un lieu identique à deux horaire différent.
    - il doit bloquer l'exécution de la requête dans le cas contraire...

    La table en question:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    create table PARCOURS (
    	NO_CONTRAT varchar(32) not null,
    	NO_PARCOURS number not null,
    	DATE_PA date not null,
    	HEURE_PA varchar(5) not null,
    	LIEU_PA varchar(32) not null,
    	constraint PK_PARCOURS primary key (NO_CONTRAT, NO_PARCOURS),
    	constraint FK_PA_NO_CONTRAT foreign key (NO_CONTRAT)
    		references CONTRAT(NO_CONTRAT)
    );
    Mon déclencheur:
    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
     
    create or replace trigger VERIF_HEURE_LIEU_DEPART
    	before insert or update on PARCOURS
    	for each row
    		declare
    			LIEU varchar(32);
    			CONTRAT varchar(32);
    			DATE_O date;
    			HEURE varchar(5);
    		begin
    			select NO_CONTRAT, DATE_PA, LIEU_PA, HEURE_PA into CONTRAT, DATE_O, LIEU, HEURE
    				from PARCOURS;
    			if (:new.LIEU_PA = LIEU and :new.NO_CONTRAT = CONTRAT and :new.DATE_PA = DATE_O and :new.HEURE_PA <> HEURE) then
    				raise_application_error(-20001,'Ce parcours existe avec un horaire différent.');
    			end if
    		end;
    Merci de votre aide!

    Bye

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

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Points : 19 073
    Points
    19 073
    Par défaut
    Pour le débuggage, en cherchant un peu tu devrais pouvoir trouver tout seul

    Commence par faire un SHOW ERR après la compil pour savoir ce qui cloche

  3. #3
    Membre à l'essai
    Inscrit en
    Avril 2008
    Messages
    22
    Détails du profil
    Informations forums :
    Inscription : Avril 2008
    Messages : 22
    Points : 14
    Points
    14
    Par défaut
    Merci je me rappelais pas du show err...
    Par contre maintenant j'ai une erreur lors de l'exécution :
    insert into PARCOURS values ('03SEP729 BUS#2','4','20091024','14:58','QC-MLT-QC')
    *
    ERREUR à la ligne 1 :
    ORA-01403: aucune donnée trouvée
    ORA-06512: à "XXXX.VERIF_HEURE_LIEU_DEPART", ligne 7
    ORA-04088: erreur lors d'exécution du déclencheur 'XXXX.VERIF_HEURE_LIEU_DEPART'
    Comment je fais pour éviter ça quand on fait un insert...
    Merci d'avance

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

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Points : 19 073
    Points
    19 073
    Par défaut


    On a déjà souvent traité cette question EXCEPTION WHEN NO_DATA_FOUND

  5. #5
    Membre à l'essai
    Inscrit en
    Avril 2008
    Messages
    22
    Détails du profil
    Informations forums :
    Inscription : Avril 2008
    Messages : 22
    Points : 14
    Points
    14
    Par défaut
    Désolé...
    J'ai ajouté l'exception je n'ai plus d'erreur mais mon trigger ne fonctionne pas, quand je fais une insertion celle-ci est effectué même si le no_contrat, la date, et le lieu sont identique mais à des heures différentes...

    mon trigger :
    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
    create or replace trigger VERIF_HEURE_LIEU_DEPART
    	before insert or update on PARCOURS
    	for each row
    		declare
    			LIEU varchar(32);
    			CONTRAT varchar(32);
    			DATE_O date;
    			HEURE varchar(5);
    		begin
    			select NO_CONTRAT, DATE_PA, HEURE_PA, LIEU_PA into CONTRAT, DATE_O, HEURE, LIEU
    				from PARCOURS
    				where NO_CONTRAT = :new.NO_CONTRAT
    				and DATE_O = :new.DATE_PA
    				and LIEU LIKE :new.LIEU_PA;
    		exception
    			when no_data_found then
    				dbms_output.put_line('Pas de donnée.');
     
    			if (:new.HEURE_PA <> HEURE) then
    				raise_application_error(-20001,'Ce parcours existe avec un horaire différent.');
    			end if;
    			end;
    mon insert:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    insert into PARCOURS values ('03SEP729 BUS#2','8','24102009','15:54','QC-MLT-QC');
    J'ai essayer avec LIKE mais j'ai le même résultat..
    Merci de votre aide.

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

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Points : 19 073
    Points
    19 073
    Par défaut
    Le SELECT est complétement inutile.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    CREATE OR REPLACE TRIGGER VERIF_HEURE_LIEU_DEPART
    	BEFORE INSERT OR UPDATE ON PARCOURS
    	FOR each row
    	IF :old.NO_CONTRAT = :new.NO_CONTRAT AND
    				:old.DATE_PA = :new.DATE_PA AND
    				:old.LIEU_PA = :new.LIEU_PA THEN
    				raise_application_error(-20001,'Ce parcours existe avec un horaire différent.');
           END IF;
    END;
    Je dirais même que le trigger ne sert à rien... il suffit d'une contrainte UNIQUE sur NO_CONTRAT,DATE_PA,LIEU_PA

  7. #7
    Membre à l'essai
    Inscrit en
    Avril 2008
    Messages
    22
    Détails du profil
    Informations forums :
    Inscription : Avril 2008
    Messages : 22
    Points : 14
    Points
    14
    Par défaut
    Ca je sais mais c'est un exo dans un TP....
    et merci pour la solution je la test

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

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Points : 19 073
    Points
    19 073
    Par défaut
    ha OK... donc on débuggue à ta place alors que tu es sensé apprendre... bien bien bien... on va en rester là je pense alors

  9. #9
    Membre à l'essai
    Inscrit en
    Avril 2008
    Messages
    22
    Détails du profil
    Informations forums :
    Inscription : Avril 2008
    Messages : 22
    Points : 14
    Points
    14
    Par défaut
    Il manque le Begin dans ton code et j'ai le même résultat que précédemment...
    L'insertion a quand même lieu...
    la structure de ma table:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    create table PARCOURS (
    	NO_CONTRAT varchar(32) not null,
    	NO_PARCOURS number not null,
    	DATE_PA date not null,
    	HEURE_PA varchar(5) not null,
    	LIEU_PA varchar(32) not null,
    	constraint PK_PARCOURS primary key (NO_CONTRAT, NO_PARCOURS),
    	constraint FK_PA_NO_CONTRAT foreign key (NO_CONTRAT)
    		references CONTRAT(NO_CONTRAT)
    );
    est ce que ça peut venir qu'il faudrait utiliser like sur certain champs?

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

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Points : 19 073
    Points
    19 073
    Par défaut
    c'est que les données ne sont pas exactement identiques probablement, t'as pas un espace qui traine ?

  11. #11
    Membre à l'essai
    Inscrit en
    Avril 2008
    Messages
    22
    Détails du profil
    Informations forums :
    Inscription : Avril 2008
    Messages : 22
    Points : 14
    Points
    14
    Par défaut
    Nop...

    résultat du select:
    NO_CONTRAT NO_PARCOURS DATE_PA HEURE LIEU_PA
    -------------------------------- ----------- -------- ----- --------------------------------
    03SEP729 BUS#2 4 20/09/24 14:58 QC-MLT-QC
    03SEP729 BUS#2 3 24/10/09 14:58 QC-MLT-QC
    03SEP729 BUS#2 6 24/10/09 14:58 QC-MLT-QC
    03SEP729 BUS#2 7 24/10/09 14:54 QC-MLT-QC
    03SEP729 BUS#2 8 24/10/09 15:54 QC-MLT-QC
    03SEP729 BUS#2 9 24/10/09 15:54 QC-MLT-QC
    03SEP729 BUS#2 10 24/10/09 15:54 QC-MLT-QC
    03SEP729 BUS#2 11 24/10/09 15:59 QC-MLT-QC
    03SEP729 BUS#2 1 24/10/09 14:13 QC-MLT-QC
    03SEP729 BUS#2 2 24/04/09 14:13 QC-MLT-QC

    j'utilise toujours le même insert je modifie juste l'heure..


    En tout cas je te remercie pour ton aide
    bye

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

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Points : 19 073
    Points
    19 073
    Par défaut
    la 2eme colonne change sur chaque ligne

    BUS#2 1 BUS#2 11

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

Discussions similaires

  1. Réponses: 5
    Dernier message: 03/01/2023, 10h56
  2. Déclencheur créé avec erreurs de compilation.
    Par mehdiyou dans le forum SQL
    Réponses: 6
    Dernier message: 16/04/2008, 12h39
  3. Erreur syntaxe SQL DELETE avec sous requête
    Par jeanbenoit1987 dans le forum Langage SQL
    Réponses: 6
    Dernier message: 07/12/2007, 12h14
  4. Erreur de connexion à une BDD SQL Server 2000 avec BDE
    Par SchpatziBreizh dans le forum Bases de données
    Réponses: 3
    Dernier message: 17/06/2005, 11h22
  5. Réponses: 6
    Dernier message: 08/06/2004, 14h51

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