Précédent   Forum des professionnels en informatique > Bases de données > Oracle
Oracle Forum Oracle : le serveur, les outils, ... Voir F.A.Q Oracle Tutoriels Oracle
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 31/12/2010, 14h54   #1
Invité de passage
 
Inscription : décembre 2010
Messages : 4
Détails du profil
Informations forums :
Inscription : décembre 2010
Messages : 4
Points : 0
Points : 0
Par défaut procedure + exception oracle

bonjour ,
j'ai crée une procédure mais à chaque fois sql*plus me donne un avertissement comme quoi procédure a été créée avec erreurs de compilation...aidez moi à trouver l'erreur please...
Au fait je dois créer la procédure suivante:
procedure reserver(ncli number, nom_hotel varchar, la_ville varchar, catch number,nbp number, deb_res char, fin_res char, out OK boolean)
qui effectue pour le client de clé ncli, et pour nbp personnes, la réservation d’une chambre de catégorie catch dans l’hôtel de nom nom_hotel de la ville de la_ville, pour la période définie par deb_res et fin_res. Si l’hôtel n’existe pas, l’exception HOTEL_INCONNU sera levée. Si la réservation est impossible, le paramètre en mode de sortie OK sera positionné à FAUX. La date de réservation sera naturellement la date du jour (SYSDATE en ORACLE). On supposera l’existence d’une séquence nommée seq_reserv pour attribuer un nouveau numéro de réservation.
voici le code pl/sql:
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
39
40
41
42
43
44
45
46
47
48
49
50
 
--Creation de la sequence
CREATE sequence seqReserv start WITH 17 ;
 
--Creation de la procedure
CREATE OR REPLACE procedure reserver(ncli number, nom_hotel varchar, la_ville varchar, catch number,nbp number, 
										deb_res date, fin_res date, out OK BOOLEAN) 
IS
 
cursor catch_curs IS SELECT ch.numch,ch.numh FROM chambres ch,hotels h 
					 WHERE ch.numh=h.numh AND ch.categorie=catch AND h.nomh=nom_hotel AND h.ville=la_ville;
 
v_enreg catch_curs%rowtype;
v_testeur BOOLEAN;
v_insert integer :0;
HOTEL_INCONNU exception;
 
begin
	open catch_curs;
	fetch catch_curs INTO v_enreg;
 
	IF(v_enreg%notfound)then
		raise HOTEL_INCONNU;
	else		
		while(v_enreg%found)
		loop
 
			v_testeur:=est_libre(v_enreg.numh, v_enreg.numch, deb_res, fin_res);
			IF(v_testeur) then
				INSERT INTO reservations VALUES(seqReserv.NEXTVAL,SYSDATE,deb_res,deb_res,nbp,ncli,v_enreg.numh,v_enreg.numch);
				v_insert :=1;
				exit;
			end IF;
			fetch catch_curs INTO v_enreg;
 
		end loop;
		close catch_curs;
 
		IF(v_insert=1)
			OK:=true;
		else
			OK:=false;
		end IF;
 
		exception 
				when HOTEL_INCONNU then 
					dbms_output.put_line('Désole, lhotel que vous demandez n existe pas.');
	end;
end;
/
function est_libre(nh number, nch number, d number, f number) est une fonction que j'ai déjà créé elle retourne VRAI si la chambre numéro nch de l’hôtel nh est libre entre les dates d et f, et FAUX dans le cas contraire.
merci.
carteman est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/01/2011, 19h07   #2
Membre actif
 
Inscription : février 2007
Messages : 167
Détails du profil
Informations forums :
Inscription : février 2007
Messages : 167
Points : 161
Points : 161
Par défaut Hum

Bonjour,

A priori votre compilateur doit indiquer quelle partie est en erreur.

Si c'est trop compliqué construisez votre procédure petit à petit en compilant toutes la trois lignes ajoutées. 60 lignes d'un coup pour un début c'est trop ambitieux.

Sinon quelques pistes :
- Vérifiez que toutes les variables sont déclarées (y compris les booléens)
- La structure de la conditionnelle est toujours la même. Or elle varie dans votre procédure.
- Une faute de frappe dans l'init de votre variable à 0 (l'assignation c'est := en plsql)
- Enfin il faut autant de end if que de if.

Courage.
Pozzo
Pozzo est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/01/2011, 20h50   #3
McM
Expert Confirmé Sénior
 
Inscription : juillet 2003
Messages : 3 437
Détails du profil
Informations forums :
Inscription : juillet 2003
Messages : 3 437
Points : 4 173
Points : 4 173
faire un show errors après la compilation pour avoir l'erreur et la ligne impactée.
__________________
More Code : More Bugs. Less Code : Less Bugs
McM est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/01/2011, 19h14   #4
Membre Expert
 
Inscription : avril 2006
Messages : 1 024
Détails du profil
Informations forums :
Inscription : avril 2006
Messages : 1 024
Points : 1 175
Points : 1 175
y'a aussi la vue USER_ERRORS qui va donner les détails.
remi4444 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/01/2011, 19h24   #5
Invité de passage
 
Inscription : décembre 2010
Messages : 4
Détails du profil
Informations forums :
Inscription : décembre 2010
Messages : 4
Points : 0
Points : 0
le problème se trouve au niveau de la 17ème ligne, quand je fait show errors il me dit:
Code :
1
2
3
4
 
17/2     PL/SQL: Statement ignored
17/5     PLS-00324: attribut de curseur ne doit pas être appliqué à
         'V_ENREG' non-curseur
carteman est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/01/2011, 17h56   #6
Membre expérimenté

 
Avatar de plabrevo
 
Inscription : décembre 2005
Messages : 541
Détails du profil
Informations forums :
Inscription : décembre 2005
Messages : 541
Points : 598
Points : 598
Et en remplacant
Code :
	IF(v_enreg%notfound)then
Par
Code :
	IF(catch_curs%notfound)then
?
plabrevo est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/01/2011, 18h05   #7
Invité de passage
 
Inscription : décembre 2010
Messages : 4
Détails du profil
Informations forums :
Inscription : décembre 2010
Messages : 4
Points : 0
Points : 0
Oui ça a marché..... merci les gars...merci @plabrevo
carteman est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/01/2011, 18h29   #8
Membre expérimenté

 
Avatar de plabrevo
 
Inscription : décembre 2005
Messages : 541
Détails du profil
Informations forums :
Inscription : décembre 2005
Messages : 541
Points : 598
Points : 598
Quelques commentaires en passant sur le code:
  • En cas d'exception, la valeur OK n'est pas initialisee en retour => revoir la procedure d'exception. Eviter les gestions d'erreur par variable en sortie, privilegier plutot une gestion d'erreurs par exception.
  • En cas d'erreur et d'execution en dehors de SQL*Plus, le message d'erreur ne sera pas affiche (et le script continuera en sequence a cause du premier point) = > Eviter les dbms_output
  • Il manque la liste des colonnes dans l'INSERT VALUES => en cas d'inversion des colonnes dans la table (par exemple), le script va planter et il sera difficile de diagnostiquer l'origine du probleme. Il est imperatif de toujours explicitement lister les colonnes dans les ordres INSERT
  • Accessoirement, regrouper toutes les procedures dans des packages. Le code n'en sera que plus lisible.

Hope this helps.
plabrevo est déconnecté   Envoyer un message privé Réponse avec citation 10
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 16h10.


 
 
 
 
Partenaires

Hébergement Web