\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}
TP3 
\end{center}


\begin{exercice}[Suppression d’un client]

Information à saisir : n° client

Pr\'evoir  les messages suivants :
\begin{itemize}
\item ‘client inconnu’
\item ‘des locations sont en cours : suppression impossible’ suivi de la liste des locations en cours
\item n  'locations retournées ont été supprimées’
\item ‘le client a bien été supprimé’
\end{itemize}

\end{exercice}
\begin{verbatim}

-- ORA-01422 : selct renvoit trop de choses

-- Test
-- C004
-- client inconnu
--  C001
-- 2 locations sont en cours : suppression impossible
-- VE001
-- VE002
-- C003
-- BUG

start locationvehic2017;

DROP TABLE tligne;
CREATE TABLE tligne (ligne varchar2(300));

set echo off; set verify off; set feed off;

variable vnoclient char(4);
prompt Entrer le numero du client  :
accept vnoclient

declare

dmessage varchar2(200);

dnoveh Tlocation2017.noveh%TYPE;
dnoclientloc Tclient2017.noclient%TYPE;
dnbnoclient number;
dnblocation number;
dnblocationout number;

CURSOR  r  IS 
select noveh
from Tlocation2017
where noclient='&vnoclient';

CURSOR  loc  IS
select  noclient
from Tlocatretour2017
where noclient='&vnoclient'
FOR UPDATE;

begin

dmessage:='client inconnu';

select count(noclient) into dnbnoclient
from Tclient2017
where noclient='&vnoclient';

if dnbnoclient = 0 then insert into tligne values (dmessage);

else

 select count(noclient) into dnblocation from Tlocation2017 where noclient='&vnoclient';

if  dnblocation > 0   then
    dmessage:=dnblocation||' locations sont en cours : suppression impossible';
    insert into tligne values (dmessage);
    open r; 
    fetch r into dnoveh; 
    while  r%found
       loop
           insert into tligne values(dnoveh);
	   COMMIT;
	   fetch r into dnoveh; 
       end loop;
    close r; 
else

select count(noclient) into dnblocationout from Tlocatretour2017 where noclient='&vnoclient';

dmessage:=dnblocationout||' location retourns vont etre supprimees';
insert into tligne values (dmessage);

if dnblocationout=1 then
 open loc; 
 fetch loc into dnoclientloc; 
     DELETE FROM Tlocatretour2017 WHERE CURRENT OF loc;
     COMMIT;

  
close loc;
end if;

 DELETE FROM Tclient2017 WHERE noclient='&vnoclient';

dmessage:='le client a bien ete supprime';
insert into tligne values (dmessage);

end if;
end if;

end;
.
/

select * from tligne; 
set echo on; set verify on; set feed on;
\end{verbatim}
\begin{exercice}
  Afficher la liste des véhicules libres de même catégorie ou de
  catégorie équivalente que le véhicule n° XXXXX (n° saisi).

\begin{SaveVerbatim}{exo2}

Numéro véhicule : numéro     catégorie 

Catégorie     libellé cat.  num vehic.   kms
XXXX          X...X         XX-9999-XX   9999	
XXXX          X...X         XX-9999-XX   9999
XXXX          X...X         XX-9999-XX   9999
XXXX          X...X         XX-9999-XX   9999

\end{SaveVerbatim}


\begin{center}
  \fbox{\BUseVerbatim{exo2}}
\end{center}


{\bf Cas d’erreur :}
\begin{itemize}
\item N° véhicule inconnu
\item Aucun véhicule libre de catégorie équivalente
\end{itemize}
\end{exercice}
\begin{verbatim}
start locationvehic2017;
commit;
set echo off; set verify off; set feed off;

variable vnoclient char(4);
prompt Entrer le numero du client  :
accept vnoclient

declare
dno varchar(4);
dkmdeb number;

CURSOR  loc  IS
select noclient
from Tlocatretour2017
where noclient='&vnoclient'
FOR UPDATE of kmdeb;

begin
open loc;

fetch loc into dno;
while loc%found
loop
	UPDATE Tlocatretour2017 SET kmdeb=7 WHERE CURRENT OF loc ;
	fetch loc into dno;
end loop;
COMMIT;
close loc;

end;
.
/

select * from TLocatretour2017;
set echo on; set verify on; set feed on;
\end{verbatim}

\begin{exercice}Afficher la liste des locations retournées du mois :
 
\begin{SaveVerbatim}{exo3}

Locations retournées du mois 
Catégorie : cat         libellé
	N° véhicule : XXXXX
		N° client  Date début    Nb de jours  Nb de kms
		...        ...           ...          ...   
		...        ...           ...          ...   
		Total véhicule : xx jours
                                                    99999 kms
	N° véhicule : XXXXX
		N° client  Date début    Nb de jours  Nb de kms
		...        ...           ...          ...   
		...        ...           ...          ...   
		Total véhicule : xx jours
                                                    99999 kms
Catégorie : cat         libellé
	N° véhicule : XXXXX
		N° client  Date début    Nb de jours  Nb de kms
		...        ...           ...          ...   
		...        ...           ...          ...   
		Total véhicule : xx jours
                                                    99999 kms
	N° véhicule : XXXXX
		N° client  Date début    Nb de jours  Nb de kms
		...        ...           ...          ...   
		...        ...           ...          ...   
		Total véhicule : xx jours
                                                    99999 kms

\end{SaveVerbatim}

\begin{center}
  \begin{small}
    \fbox{\BUseVerbatim{exo3}}
  \end{small}
\end{center}

\end{exercice}

\begin{verbatim}
DROP TABLE tligne;
CREATE TABLE tligne (ligne varchar2(300));

set echo off; set verify off; set feed off;

declare
dmessage varchar2(300);
dnoclient varchar(4);
dnoveh char(5);
dkm number;
ddatedeb date;
dmois date;
dnbjours number;
dnbkms number;
dtotalkms number;
dtotaljours number:=0;
dcurrentnoveh char(5);

-- between ROUND(to_date(sysdate),'MONTH') and TRUNC(to_date(sysdate,'DD-MON-YY'),'MONTH')

CURSOR  r  IS
select noveh, noclient,  datedeb, (dateretour - datedeb), (kmfin-kmdeb) into dnoveh, dnoclient,  ddatedeb, dnbjours, dnbkms 
from  Tlocatretour2017 
order by noveh;

begin
dmessage:='Aucune voiture louee';

open r; 
fetch r into  dnoveh, dnoclient,  ddatedeb, dnbjours, dnbkms;
dcurrentnoveh:=' ';
dtotalkms:=dnbkms;
dtotaljours:=dnbjours;
while  r%found
       loop
         if (dcurrentnoveh = dnoveh) then
          insert into tligne values (dnoclient||' '||ddatedeb||' '||dnbjours||' '||dnbkms);
	   dtotalkms:=dtotalkms+dnbkms;
	   dtotaljours:=dtotaljours+dnbjours;
	else
          if dcurrentnoveh<>' ' then
	     insert into tligne values ('total jour: '||dtotaljours);
	     insert into tligne values ('total km: '||dtotalkms);
	  end if;
	  insert into tligne values (dnoveh);
	  insert into tligne values (dnoclient||' '||ddatedeb||' '||dnbjours||' '||dnbkms);
	  dtotalkms:=dnbkms;
	  dtotaljours:=dnbjours;
	 end if;
         dcurrentnoveh:=dnoveh;
         fetch r into  dnoveh, dnoclient,  ddatedeb, dnbjours, dnbkms;
       end loop;
       insert into tligne values ('total jour: '||dtotaljours);
       insert into tligne values ('total km: '||dtotalkms);
    close r; 

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}




\end{document}
