|
|
\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}
|