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

Oracle Discussion :

procedure + exception oracle


Sujet :

Oracle

  1. #1
    Candidat au Club
    Inscrit en
    Décembre 2010
    Messages
    4
    Détails du profil
    Informations forums :
    Inscription : Décembre 2010
    Messages : 4
    Points : 4
    Points
    4
    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 : 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
    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.

  2. #2
    Membre actif
    Profil pro
    Inscrit en
    Février 2007
    Messages
    260
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 260
    Points : 281
    Points
    281
    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

  3. #3
    McM
    McM est déconnecté
    Expert éminent

    Homme Profil pro
    Développeur Oracle
    Inscrit en
    Juillet 2003
    Messages
    4 580
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Oracle

    Informations forums :
    Inscription : Juillet 2003
    Messages : 4 580
    Points : 7 740
    Points
    7 740
    Billets dans le blog
    4
    Par défaut
    faire un show errors après la compilation pour avoir l'erreur et la ligne impactée.

  4. #4
    Membre éprouvé
    Inscrit en
    Avril 2006
    Messages
    1 024
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 1 024
    Points : 1 294
    Points
    1 294
    Par défaut
    y'a aussi la vue USER_ERRORS qui va donner les détails.

  5. #5
    Candidat au Club
    Inscrit en
    Décembre 2010
    Messages
    4
    Détails du profil
    Informations forums :
    Inscription : Décembre 2010
    Messages : 4
    Points : 4
    Points
    4
    Par défaut
    le problème se trouve au niveau de la 17ème ligne, quand je fait show errors il me dit:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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

  6. #6
    Membre éclairé Avatar de plabrevo
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    548
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 548
    Points : 674
    Points
    674
    Par défaut
    Et en remplacant
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    	IF(v_enreg%notfound)then
    Par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    	IF(catch_curs%notfound)then
    ?

  7. #7
    Candidat au Club
    Inscrit en
    Décembre 2010
    Messages
    4
    Détails du profil
    Informations forums :
    Inscription : Décembre 2010
    Messages : 4
    Points : 4
    Points
    4
    Par défaut
    Oui ça a marché..... merci les gars...merci @plabrevo

  8. #8
    Membre éclairé Avatar de plabrevo
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    548
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 548
    Points : 674
    Points
    674
    Par défaut
    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.

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

Discussions similaires

  1. Réponses: 11
    Dernier message: 15/11/2006, 16h52
  2. Réponses: 6
    Dernier message: 09/10/2006, 11h58
  3. Réponses: 1
    Dernier message: 31/01/2006, 17h38
  4. Executer un procedure d'oracle sous unix
    Par claralavraie dans le forum Applications et environnements graphiques
    Réponses: 8
    Dernier message: 31/01/2006, 17h34
  5. Gestion des exceptions Oracle
    Par kluh dans le forum Access
    Réponses: 1
    Dernier message: 15/11/2005, 22h54

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