\documentclass[a4paper,11pt]{article} \usepackage[utf8x]{inputenc} \usepackage[T1]{fontenc} \usepackage[french]{babel} \usepackage[a4paper,hmargin=20mm,vmargin=30mm]{geometry}%\usepackage{fullpage} \usepackage{url} \usepackage{comment} \usepackage{fancyhdr}% fancy header \usepackage{fancyvrb} \fancypagestyle{monstyle}{ %\fancyhead{} \renewcommand{\headrulewidth}{1pt} %% %\renewcommand{\footrulewidth}{0.4pt} % \fancyhead[LE]{\slshape \thepage/ \pageref{LastPage}} %% \fancyhead[RO]{\slshape \thepage/ \pageref{LastPage}} %\fancyhf{} %\fancyhead[LE]{\slshape LE} %\fancyhead[CE]{\slshape CE} %\fancyhead[RE]{\slshape RE} \fancyhead[LO]{\bfseries 2018-2021 BD PLS/SQL\rightmark} %\fancyhead[CO]{\slshape APF} \fancyhead[RO]{\bfseries ~\leftmark } %% %\fancyfoot{} % \fancyfoot[LE,RO]{} \fancyfoot[CO,CE]{}%\slshape\thepage/\pageref{LastPage}} %% %\fancyfoot[LO,RE]{\small\slshape \ddmmyyyydate version du \today} } % \pagestyle{fancy} \usepackage{amsmath} \usepackage{amsthm} \theoremstyle{definition} \newtheorem{exercice}{Exercice} \pagestyle{monstyle} \usepackage{amsmath} \usepackage{amsthm} \newcommand{\code}[1]{\texttt{#1}} \begin{document} \begin{center} TP1 : Location de v\'ehicules \end{center} Contexte : L'objectif est de gérer les locations d’une agence de locations de véhicules. Les tables utilisées sont les suivantes : \begin{description} \item[Tclient2021]: \begin{itemize} \item Numéro client \item Nom \item Ville \item Code postal \end{itemize} \item[Tcategorie2021]: \begin{itemize} \item Numéro categorie \item Libellé \end{itemize} \item[Tremplacement2021]: \begin{itemize} \item Numéro catégorie \item Numéro catégorie équivalente \end{itemize} \item[Tvehicule2021]: \begin{itemize} \item Numéro véhicule \item Immatriculation \item Modèle \item Couleur \item Dernier kilométrage \end{itemize} \item[Tlocation2021]: \begin{itemize} \item Numéro client \item Numéro véhicule \item Date début location \item Date retour prévue \item Kilométrage départ \end{itemize} \item[Tlocatretour2021]: \begin{itemize} \item Numéro client \item Numéro véhicule \item Date début location \item Date retour prévue \item Kilométrage départ \item Date retour effectif \item Kilométrage fin \end{itemize} \end{description} Vous trouverez sur l’ENT le script de création et de remplissage des tables (des occurrences pourront être ajoutées si nécessaire) \code{locationvehic2021.sql} Vos procédures SQL devront avoir la structure suivante : \begin{SaveVerbatim}{VerbEnv} drop table tligne ; create table Tligne (ligne varchar2(200)) ; Déclaration des variables hôtes Saisie des paramètres Bloc PL/SQL Select * from Tligne ; \end{SaveVerbatim} {\centering \fbox{\BUseVerbatim{VerbEnv}}\par} \begin{exercice}[Sans utiliser la clause exception] A partir d’un numéro de véhicule saisi au clavier, afficher l’immatriculation et le modèle correspondant ainsi que le nom du client si c’est un véhicule en cours de location. {\bf Cas d’erreur :} « n° de véhicule inconnu ». \end{exercice} \begin{verbatim} -- Test VE001 -- aa-2000-za est l immatriculation du vehicule VE001 de modele clio 3 loue par Dup -- Test VE005 -- ff-6000-za est l immatriculation du vehicule VE005 de modele Picasso -- Test VE008 -- VE008 vehicule inconnu DROP TABLE tligne; CREATE TABLE tligne (ligne varchar2(100)); set echo off; set verify off; set feed off; variable vnumvehicule char(5) variable toto char(5) prompt Entrer le numero du vehicule : accept vnumvehicule declare dimmatriculation char(10); dmodele varchar2(30); dmessage varchar2(100); dnom VARCHAR2(80); begin dmessage := '&vnumvehicule'||' vehicule inconnu'; select immat, modele into dimmatriculation, dmodele from Tvehicule2017 where noveh='&vnumvehicule'; dmessage := dimmatriculation||' est l immatriculation du vehicule'||'&vnumvehicule'| |' de modele '||dmodele; select nom into dnom from Tclient2017, Tlocation2017 where Tlocation2017.noveh='&vnumvehicule' and Tlocation2017.noclient=Tclient2017.noclient; Insert into tligne values (dmessage||' loue par '||dnom); exception when no_data_found then insert into tligne values (dmessage); end; . / select * from tligne; set echo on; set verify on; set feed on; \end{verbatim} \begin{exercice}[Avec la clause exception] Afficher le numéro du véhicule loué par un client dont le numéro sera saisi. {\bf Cas d’erreur :} \begin{itemize} \item « aucune location pour ce client » \item « plusieurs locations en cours pour ce client » (cf un prochain TP pour traiter ce problème) \end{itemize} \end{exercice} \begin{verbatim} -- Test C001, C002, C003 : -- plusieurs locations pour C001 -- vehicule VE003 est loue par C002 -- aucune location pour C003 DROP TABLE tligne; CREATE TABLE tligne (ligne varchar2(100)); set echo off; set verify off; set feed off; variable vnoclient char(4) prompt Entrer le numero du client : accept vnoclient declare dnovehicule char(5); BEGIN select noveh into dnovehicule from Tlocation2017 where noclient='&vnoclient'; Insert into tligne values ('vehicule '||dnovehicule||' est loue par '||'&vnoclient'); exception when no_data_found then insert into tligne values ('aucune location pour '||'&vnoclient'); when too_many_rows then insert into tligne values ('plusieurs locations pour '||'&vnoclient'); end; . / select * from tligne; set echo on; set verify on; set feed on; \end{verbatim} \begin{exercice}[Mise à jour : enregistrement d’un retour de location] Il est demander d'enregistrer le retour d’un véhicule. Donner la procédure PL/SQL permettant l’enregistrement du retour, pour une date de retour donnée et pour un véhicule dont on saisira le numéro. On saisira également le kilométrage de fin de location. Informations à saisir par l'utilisateur sont : numéro du véhicule, date de retour, kilométrage de fin. Les messages suivants sont à prévoir : \begin{itemize} \item numéro véhicule inconnu \item ce véhicule n’est pas en cours de location \item la date de retour doit être postérieure à la date de début de location \item le kilométrage de fin doit être supérieur au kilométrage de début \item le retour a bien été enregistré et le kilométrage du véhicule a été mis à jour \end{itemize} \end{exercice} \begin{verbatim} -- TEST -- VE009 -- numero de vehicule inconnu -- VE004 -- Vehicule pas en cours de location -- VE003 -- '03-JAN-2007' -- 370000 -- PB date de retour inf date debut -- VE003 -- '03-JAN-2018' -- 37 -- PB Km de retour inf KM debut -- VE004 -- '03-JAN-2018' -- 4000000 -- ORA-00001 : pb de clef non respectee -- ORA-02290 : check constraint Viole les contraintes d'integrite du modele. insert into Tlocation2017 values ('C002','VE004',to_date('29-01-2016','DD-MM-YYYY'),to_date('10-02-2017','DD-MM-YYYY'),5000); DROP TABLE tligne; CREATE TABLE tligne (ligne varchar2(100)); set echo off; set verify off; set feed off; variable vnovehicule char(5); variable vdateretour date; variable vkmfin number; prompt Entrer le numero du vehicule : accept vnovehicule prompt Entrer la date de retour : accept vdateretour prompt Entrer le kilometrage de fin : accept vkmfin declare dnovehicule char(5); ddatedebut date; dkmdeb number(6); dnoclient char(4); dmessage varchar2(100); begin dmessage:='numero de vehicule inconnu'; select noveh into dnovehicule from Tvehicule2017 where noveh='&vnovehicule'; dmessage:='Vehicule pas en cours de location'; select noclient into dnoclient from Tlocation2017 where noveh='&vnovehicule'; select datedeb, kmdeb, noclient into ddatedebut, dkmdeb, dnoclient from Tlocation2017 where noveh='&vnovehicule'; if (ddatedebut >= &vdateretour) then Insert into tligne values ('PB date de retour inf date debut'); else if (dkmdeb >= &vkmfin) then Insert into tligne values ('PB Km de retour inf KM debut'); else Insert into Tlocatretour2017 values (dnoclient,'&vnovehicule',ddatedebut,dkmdeb,&vkmfin,to_date(&vdateretour,'DD-MM-YYYY')); -- Insert into Tlocatretour2017 values (dnoclient,'&vnovehicule',ddatedebut,dkmdeb,&vkmfin,to_date('15-12-2021','DD-MM-YYYY')); Insert into tligne values ('Retour bien effectue '); end if; end if; exception when no_data_found then insert into tligne values (dmessage); end; . / select * from tligne; set echo on; set verify on; set feed on; \end{verbatim} \paragraph{Premi\`ere s\'eance :} Connexion : \verb+sqlplus /@KIROV+ Lors de votre première connexion modifier votre mot de passe avec la commande : \verb+PASSWORD;+ Ce qui est équivalent à : \verb+ALTER USER dupond IDENTIFIED BY password;+ Pour lancer un fichier \verb+.sql+ en sqlplus, il suffit de taper : \verb+@toto.sql;+ Pour quitter sqlplus, il suffit de taper : \verb+quit;+ Lancer \verb+sqlplus+ avec cette commande \verb+rlwrap sqlplus+ vous permet d'avoir l'historique. \end{document}