|
Publicité ' | |||||||||||||||||||||||
|
|
#1 |
|
Candidat au titre de Membre du Club
![]() Inscription : juillet 2002 Messages : 23 ![]() |
Bonjour,
j'ai créé mon premier trigger avec un curseur à l'intérieur : la partie du code qui pose problème est en rouge. L'exécution du code suivant donne les messages d'erreur suivants : LINE/COL ERROR 27/1 PL/SQL: Statement ignored 27/28 PLS-00405: sous-interrogation non autorisée dans ce contexte 31/1 PL/SQL: Statement ignored 31/23 PLS-00405: sous-interrogation non autorisée dans ce contexte 39/1 PL/SQL: Statement ignored 39/24 PLS-00405: sous-interrogation non autorisée dans ce contexte /* mon trigger :*/ create or replace trigger trigger_inscription before update or insert on inscription for each row declare nbre_etud number(2,0); nbre_module number(2,0); cursor curseur_prerequis is select codmodpreq from prerequis start with codmod = :new.codmod connect by prior codmodpreq=codmod; codmod_du_curseur prerequis.codmod%type; begin /*Test si les modules prerequis sont présents dans la table inscription : */ open curseur_prerequis; loop fetch curseur_prerequis into codmod_du_curseur; exit when curseur_prerequis%notfound; if codmod_du_curseur not in(select codmod from inscription where numetud=:new.numetud) then raise_application_error ( -20003,'Erreur cet étudiant ne s est pas inscrit dans un(ou les) module(s) prerequis'); end if; if :new.numetud not in( select e.numetud from etudiant e where not exists(select ex.codmod from examen ex where ex.codmod=codmod_du_curseur and not exists( select r.numetud,r.codexam from resultat r,module m where e.numetud=r.numetud and ex.codexam=r.codexam))) then raise_application_error ( -20004,'Erreur cet étudiant n a pas passé tous les examens dans un des modules prerequis'); end if; if :new.numetud not in (select num_etudiant from vue_trigger3 where code_module=codmod_du_curseur) then raise_application_error ( -20005,'Erreur cet étudiant n a pas la moyenne (noteprerequis) dans un des modules prerequis'); end if; end loop; close curseur_prerequis; end;/ C'EST AU NIVEAU DES 3 IF DANS LE CURSEUR QUE CA COINCE. JE NE SAIS PAS SI CE TYPE DE REQUETE EST AUTORISEE ICI. MERCI DE VOTRE AIDE D'AVANCE |
|
|
00
|
|
|
#2 | ||||||
![]() Salim Développeur et DBA Oracle Inscription : octobre 2006 Messages : 872 ![]() |
Salut,
Première remarque dans un block plsql le select a la synthaxe suivante NB : On utilise le select dans un block plsql s'il ramene une seule ligne( si le nombre de ligne est >1 alors tu auras l'erreur too_many_rows et s'il ramene aucune ligne tu auras l'erreur no_data_found) De préférence utiliser le curseur pour ne pas gérer les erreurs Code :
Code :
Code :
|
||||||
|
|
00
|
|
|
#3 |
|
Candidat au titre de Membre du Club
![]() Inscription : juillet 2002 Messages : 23 ![]() |
super merci pour le coup de main : j'ai mis des count() partout et ça marche.
|
|
|
00
|
|
|
#4 |
![]() Salim Développeur et DBA Oracle Inscription : octobre 2006 Messages : 872 ![]() |
Salut,
De rien, n'oublie pas de mettre la discussion a résolu. |
|
|
00
|
|
|
#5 | ||
|
Expert Confirmé
![]() Inscription : septembre 2004 Messages : 2 942 ![]() |
NON ! c'est catastrophique pour les perfs !!!
(et ne me dites pas qu'on s'en fout, en ne s'en fout jamais des perfs, et il faut prendre les bonnes habitudes dès le départ !) Si le but est de savoir s'il a ou non des modules, au lieu de tout compter (et potentiellement parcourir des millions de lignes) et juste comparer avec 0 ou 1, il faut travailler par gestion des exceptions ! Code :
|
||
|
|
00
|
|
|
#6 |
![]() Salim Développeur et DBA Oracle Inscription : octobre 2006 Messages : 872 ![]() |
Salut,
Merci pour ta remarque Leo, C'est bien d'apprendre les bonnes manières et ne jamais négliger la performance. |
|
|
00
|
Copyright © 2000-2012 - www.developpez.com