\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 2020-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 Tvehicule2021
where noveh='&vnumvehicule';

dmessage :=  dimmatriculation||' est l immatriculation du vehicule'||'&vnumvehicule'|
|' de modele '||dmodele;

select nom into dnom
from  Tclient2021, Tlocation2021
where Tlocation2021.noveh='&vnumvehicule' and Tlocation2021.noclient=Tclient2021.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 Tlocation2021
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-2022'
-- 370000

-- PB date de retour inf date debut
-- VE003
-- '03-JAN-2022'
-- 37

-- PB Km de retour inf KM debut
-- VE004
-- '03-JAN-2022'
-- 4000000

-- ORA-00001 : pb de clef non respectee
-- ORA-02290 : check constraint Viole les contraintes d'integrite du modele.

insert into Tlocation2021 values ('C002','VE004',to_date('29-01-2016','DD-MM-YYYY'),to_date('10-02-2021','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 char(10);
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 Tvehicule2021
where noveh='&vnovehicule';

dmessage:='Vehicule pas en cours de location';

select noclient into dnoclient
from Tlocation2021
where noveh='&vnovehicule';

select datedeb, kmdeb, noclient into ddatedebut, dkmdeb, dnoclient
from Tlocation2021
where noveh='&vnovehicule';

if (ddatedebut >= TO_DATE(&vdateretour,'DD-MM-YYYY'))
 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 Tlocatretour2021 values (dnoclient,'&vnovehicule',ddatedebut,dkmdeb,&vkmfin,to_date(&vdateretour,'DD-MM-YYYY'));
-- Insert into Tlocatretour2021 values (dnoclient,'&vnovehicule',ddatedebut,dkmdeb,&vkmfin,to_date('15-12-2021','DD-MM-YYYY'));

Insert into tligne values ('Retour bien effectue ');

Delete Tlocation2021 WHERE  noveh='&vnovehicule';

Insert into tligne values ('Effacement location en cours ');

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 <user>/<password>@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}
