You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

381 lines
8.9 KiB

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

\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 dune 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 lENT 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 dun numéro de véhicule saisi au clavier, afficher limmatriculation et le modèle correspondant ainsi que le nom du client si cest un véhicule en cours de location.
{\bf Cas derreur :} « 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 derreur :}
\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 dun retour de location]
Il est demander d'enregistrer le retour dun véhicule. Donner la
procédure PL/SQL permettant lenregistrement 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 nest 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}