\documentclass[a4paper,11pt]{article}

\usepackage[utf8x]{inputenc}
\usepackage[T1]{fontenc}
\usepackage[french,british]{babel}
\usepackage[a4paper,hmargin=20mm,vmargin=30mm]{geometry}%\usepackage{fullpage}
\usepackage{url}
\usepackage{comment}
\usepackage{fancyhdr}% fancy header
\usepackage{multirow}
\usepackage{slashbox}

\usepackage{color, colortbl}
\definecolor{Gray}{gray}{0.9}
\usepackage{adjustbox}
\usepackage{slashbox}
%\usepackage{times}
\usepackage{tikz,pgflibraryarrows,pgffor,pgflibrarysnakes}
\usetikzlibrary{decorations.pathreplacing}
\usetikzlibrary{calc}

\usepackage[bf]{caption}

\usepackage{tcolorbox}

\usepackage{pdfpages}

\usepackage{listings}

\lstset{
  literate=
  {á}{{\'a}}1 {é}{{\'e}}1 {í}{{\'i}}1 {ó}{{\'o}}1 {ú}{{\'u}}1
  {Á}{{\'A}}1 {É}{{\'E}}1 {Í}{{\'I}}1 {Ó}{{\'O}}1 {Ú}{{\'U}}1
  {à}{{\`a}}1 {è}{{\`e}}1 {ì}{{\`i}}1 {ò}{{\`o}}1 {ù}{{\`u}}1
  {À}{{\`A}}1 {È}{{\'E}}1 {Ì}{{\`I}}1 {Ò}{{\`O}}1 {Ù}{{\`U}}1
  {ä}{{\"a}}1 {ë}{{\"e}}1 {ï}{{\"i}}1 {ö}{{\"o}}1 {ü}{{\"u}}1
  {Ä}{{\"A}}1 {Ë}{{\"E}}1 {Ï}{{\"I}}1 {Ö}{{\"O}}1 {Ü}{{\"U}}1
  {â}{{\^a}}1 {ê}{{\^e}}1 {î}{{\^i}}1 {ô}{{\^o}}1 {û}{{\^u}}1
  {Â}{{\^A}}1 {Ê}{{\^E}}1 {Î}{{\^I}}1 {Ô}{{\^O}}1 {Û}{{\^U}}1
  {œ}{{\oe}}1 {Œ}{{\OE}}1 {æ}{{\ae}}1 {Æ}{{\AE}}1 {ß}{{\ss}}1
  {ű}{{\H{u}}}1 {Ű}{{\H{U}}}1 {ő}{{\H{o}}}1 {Ő}{{\H{O}}}1
  {ç}{{\c c}}1 {Ç}{{\c C}}1 {ø}{{\o}}1 {å}{{\r a}}1 {Å}{{\r A}}1
  {€}{{\EUR}}1 {£}{{\pounds}}1
}

%% \lstset{language=[Oracle]SQL,
%%         style=Oracle,
%% }

\tcbuselibrary{listings,skins,breakable}
\usepackage{textcomp}
    \usepackage{color}

    \definecolor{codegreen}{rgb}{0,0.6,0}
    \definecolor{codegray}{rgb}{0.5,0.5,0.5}
    \definecolor{codepurple}{HTML}{C42043}
    \definecolor{backcolour}{HTML}{F2F2F2}
    \definecolor{bookColor}{cmyk}{0,0,0,0.90}  
    \color{bookColor}

    \lstset{upquote=true}
    
\lstdefinestyle{mystyle}{
        backgroundcolor=\color{backcolour},   
        commentstyle=\color{codegreen},
        keywordstyle=\color{codepurple},
        numberstyle=\footnotesize\color{codegray},
        stringstyle=\color{codepurple},
        basicstyle=\footnotesize,
        breakatwhitespace=false,         
        breaklines=true,                 
        captionpos=b,                    
        keepspaces=true,                 
        numbers=left,                    
       % numbersep=-10pt,                  
        showspaces=false,                
        showstringspaces=false,
        showtabs=false,      
    }
    \lstset{style=mystyle} 

\newtcblisting{customFrame}{
    arc=0mm,
    top=0mm,
    bottom=0mm,
    left=3mm,
    right=0mm,
    width=\textwidth,
    listing only,
    listing options={style=frameStyle},
    breakable
}
\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}
\usetikzlibrary{fit}



\theoremstyle{definition}
\newtheorem{exercice}{Exercice}

\pagestyle{monstyle}

\usepackage{amsmath}
\usepackage{amsthm}

\newcommand{\code}[1]{\texttt{#1}}

\usepackage{boxedminipage}
\usepackage{setspace}
\usepackage[official]{eurosym}

\newsavebox\svbx
\newif\ifcache
\long\def\cache#1{\ \newline
  \setbox\svbx=\vbox{\leavevmode \newline \begin{spacing}{1}#1\end{spacing}}
 \smallskip\par\noindent
 \begin{boxedminipage}{\linewidth}
  \ifcache    
  \leavevmode\hrule height 0pt\vskip \ht\svbx\hrule height 0pt
  \else \unvbox\svbx
  \fi
 \end{boxedminipage}
 \par\smallskip}


\cachefalse % version prof
%\cachetrue % version  etudiant



%%%%%%%%% Gestion de la correction

\usepackage{ifthen}
\usepackage{framed}
\usepackage{environ}
\usepackage{xcolor}
\colorlet{shadecolor}{gray!10!red!5}

\ifdefined\iscorrec     % Définition depuis le script d'appel
\else
  \def\iscorrec{1}      % 0=> sujet, 1=>corrigé
\fi

%%% \begin{correction}....\end{correction}
%   le contenu ne s'affiche que si \iscorrec=1

\NewEnviron{correction}{\ifthenelse{\iscorrec=1}{%
    \medskip\medskip\par\begin{shaded}\noindent{\bf Solution:} \BODY \end{shaded}
}{}}


%%%%%%%%% Paramètres individuels du sujet

%%% Valeurs par défaut (pour une compilation isolée)

\ifdefined\assignedparameters\else                           
    \def\assignedparameters{1,1,1,1}   % dans cet exemple, 4 paramètres requis
\fi

%%% Liste permettant d'accéder aux assignedparameters: \ListAP[1], \ListAP[2], etc.

\usepackage{listofitems}
\ifx\assignedparameters\empty       % (erreur de \readlist dans ce cas)
\else
    \readlist*\ListAP{\assignedparameters}
\fi

%%% Switch de versions, définie ici "à vide" pour mettre du renewcommand plus tard

\newcommand{\switch}{}


%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%


\begin{document}


\begin{center}
 NOM : \hfill Examen \hfill~\\
 PRENOM : \hfill 90 minutes%% , 75 points
 \hfill ~\\
 GROUPE : \hfill   \hfill~\\
  
\end{center}

\section*{PL/SQL : R\'eservation d'un terrain de sport}

Une entreprise de location de terrain de badminton/padel souhaite
informatiser la gestion de ses locaux. Chaque terrain possède un
numéro : il y a 10 terrains de badminton numérotés de 1 à 10, et 2 de
padels de 1 à 2. Il est possible qu'il y ait entre 2 et 4 joueurs pour
le badminton, mais exactement 4 joueurs pour le padel. Les tarifs
horaires pour la location du terrain ne sont pas les mêmes pour le
badminton et le padel. Ils varient également en fonction de
l'horaire. La réservation se fait pour un créneau dont l’heure de
début est connue (9h , 10h, ... , 17h) et la durée spécifique au sport
pratiqué (1h ou 2h). Une fois sur place, il est également possible de
louer des équipements (raquettes et chaussures) pour un supplément :
\begin{center}
  \begin{tabular}{|l|c|c|}
    \hline
Prix à l’unité	& BADMINTON &	PADEL \\ \hline
Raquette	& 1 \euro{}	& 2 \euro{}  \\ \hline
Paire de chaussures&	2 \euro{} &	3 \euro{} \\ \hline
  \end{tabular}
\end{center}
Lors d'une réservation, il faut connaître au moins les coordonnées
d'un des joueurs pour savoir qui a fait la réservation. Lors d'une
réservation en ligne, il est possible d'inscrire le nom et le numéro
de téléphone des joueurs, afin qu'un rappel leur soit envoyé le jour
de leur réservation. Il faut pouvoir sortir une facture avec le
montant total de la réservation ; c'est à dire le tarif de la location
en fonction du sport et du créneau horaire, ainsi que des équipements
loués.

MCD de l’application : 
%\newpage
%\begin{center}
%  \includegraphics{MCD.png}
%\end{center}
\begin{center}
     	   \begin{tikzpicture}[every node/.style={inner sep=0,outer sep=0}]

             \node (equip) at (3,3) {
               \begin{varwidth}{1.5in}
 \begin{tabular}{|l|}
   \hline
   \rowcolor{lightgray}EQUIPEMENT\\
\hline
\underline{idEquipement}\\
Libell\'e\\
Tarif\\
\hline
 \end{tabular}
\end{varwidth}
};

      \node (con) at (7,3) {
               \begin{varwidth}{1.5in}
 \begin{tabular}{l}
\rowcolor{Gray}contenir\\
\hline
nombre\\
\end{tabular}
\end{varwidth}
};
\draw[rounded corners] ($(con.north west)-(0.03,-0.03)$) rectangle ($(con.south east)+(-0.03,0.03)$);



      \node (faire) at (10,0) {
               \begin{varwidth}{1.5in}
 \begin{tabular}{l}
\rowcolor{Gray}Faire\\
\hline
~ \\
\end{tabular}
\end{varwidth}
};
\draw[rounded corners] ($(faire.north west)-(0.03,-0.03)$) rectangle ($(faire.south east)+(-0.03,0.03)$);




      \node (DFres) at (14,-3) {
               \begin{varwidth}{1.5in}
 \begin{tabular}{l}
\rowcolor{Gray}DF\_reserver\\
\hline
~ \\
\end{tabular}
\end{varwidth}
};
\draw[rounded corners] ($(DFres.north west)-(0.03,-0.03)$) rectangle ($(DFres.south east)+(-0.03,0.03)$);



      \node (DFpra) at (-1,-3) {
               \begin{varwidth}{1.5in}
 \begin{tabular}{l}
\rowcolor{Gray}DF\_pratiquer\\
\hline
~ \\
\end{tabular}
\end{varwidth}
};
\draw[rounded corners] ($(DFpra.north west)-(0.03,-0.03)$) rectangle ($(DFpra.south east)+(-0.03,0.03)$);



      \node (fact) at (6.5,-3) {
               \begin{varwidth}{1.5in}
 \begin{tabular}{l}
\rowcolor{Gray}facturer\\
\hline
tarifHoraire \\
\end{tabular}
\end{varwidth}
};
\draw[rounded corners] ($(fact.north west)-(0.03,-0.03)$) rectangle ($(fact.south east)+(-0.03,0.03)$);

   \node (DFcon) at (3,0) {
               \begin{varwidth}{1.5in}
 \begin{tabular}{l}
\rowcolor{Gray}DF\_concerner\\
\hline
~ \\
\end{tabular}
\end{varwidth}
};
\draw[rounded corners] ($(DFcon.north west)-(0.03,-0.03)$) rectangle ($(DFcon.south east)+(-0.03,0.03)$);


\node (res) at (7,0) {\begin{varwidth}{1.5in}
\begin{tabular}{|l|}
\hline
\rowcolor{lightgray}RESERVATION\\
\hline
\underline{idReservation}\\
dateReserv\\
nbJoueurs\\ \hline
\end{tabular}
\end{varwidth}
};



\node (ter) at (-1,0) {\begin{varwidth}{2.5in}
\begin{tabular}{|l|}
\hline
\rowcolor{lightgray}TERRAIN\\
\hline
\underline{idTerrain}\\
numTerrain\\
\hline
\end{tabular}
\end{varwidth}
};


\node (cre) at (10,-3) {\begin{varwidth}{2.5in}
\begin{tabular}{|l|}
\hline
\rowcolor{lightgray}CRENEAU\\
\hline
\underline{numCreneau}\\
heureD\'ebut\\
\hline
\end{tabular}
\end{varwidth}
};

\node[draw,rectangle] (g) at (3,-3) {\begin{varwidth}{2in}
\begin{tabular}{l}
 \rowcolor{lightgray}SPORT\\
  \hline
  \underline{nomSport}\\
  nbMinJoueurs\\
  nbMaxJoueurs\\
  dur\'ee\\
\end{tabular}
\end{varwidth}};



\node[draw,rectangle] (c) at (13,0) {
\begin{tabular}{|l|}
  \hline
  \rowcolor{lightgray}JOUEUR\\
\hline
\underline{idjoueur}\\
Nom\\
Pénom\\
num\'ero\\
\hline
\end{tabular}
};

\draw (equip) --  (con) node [pos=0.5, above] {$0,n$};
\draw (res) --  (con) node [midway, right] {$0,n$};
\draw (faire) -- (c) node [midway, above] {$0,n$};
\draw (res) -- (faire)  node [midway, above] {$1,n$};
\draw (res) -- (DFres) node [midway, above] {$1,1$};
\draw (cre) -- (DFres) node [midway, above] {$0,n$};
\draw (cre) -- (fact) node [midway, above] {$0,n$};
\draw (fact) -- (g)  node [midway, above] {$0,n$};
\draw (g) -- (DFpra)  node [midway, above] {$1,n$};
\draw (ter) -- (DFpra)  node [midway, right] {$1,1$};
\draw (ter) -- (DFcon)  node [midway, above] {$0,n$};
\draw (res) -- (DFcon)  node [midway, above] {$1,1$};



           \end{tikzpicture}
\end{center}
%  \newpage
Modèle relationnel :

EQUIPEMENT(\underline{idEquipement}, libell\'e, tarif)

CONTENIR(\underline{idReservation}, \underline{idEquipement}, nombre)

TERRAIN(\underline{idTerrain}, numTerrain, nomSport)

RESERVATION(\underline{idReservation}, dateReserv, nbJoueurs, idTerrain, numCreneau)

FAIRE(\underline{idReservation}, \underline{idJoueur})

JOUEUR(\underline{idJoueur}, nom, pr\'enom, num\'ero)

SPORT(\underline{nomSport}, nbMinJoueurs, nbMaxJoueurs, dur\'ee)

FACTURER(\underline{nomSport}, \underline{numCreneau}, tarifHoraire)

CRENEAU(\underline{numCreneau}, heureD\'ebut)


Ordres de création des tables :

\begin{verbatim}
create table EQUIPEMENT ( 
idEquipement char(3) primary key, 
libelle varchar2(20), 
tarif number(5,2));

create table JOUEUR ( 
idJoueur char(2) primary key, 
nom varchar2(20), 
pnom varchar2(20), 
numero number);

create table CRENEAU ( 
numCreneau char(2) primary key, 
heureDebut number(2));

create table SPORT (
nomSport varchar2(10),
nbMinJoueurs number,
nbMaxJoueurs number,
duree number);

create table TERRAIN (
idTerrain char(3) primary key,
numTerrain number,
nomSport varchar2(10) references SPORT);

create table RESERVATION ( 
idReserv char(3) primary key, 
dateReserv date, 
nbJoueurs number, 
idTerrain char(5) references TERRAIN, 
numCreneau char(2) references CRENEAU );

create table faire ( 
idReserv char(3) references RESERVATION, 
idJoueur char(2) references JOUEUR, 
primary key(idReserv, idJoueur));

create table contenir (
idReserv char(3) primary key references RESERVATION,
idEquipement char(3) references EQUIPEMENT,
nombre number);

create table facturer(
nomSport varchar2(10) references SPORT,
numCreneau char(2) references CRENEAU,
tarifHoraire number,
primary key(nomSport, numCreneau));
\end{verbatim}


Consignes :
\begin{itemize}
\item Les résultats seront affichés avec une table Tresultat (ligne varchar2 (200))
\item La partie SQL+ n’est pas demandée pour les exercices 2 et 3
\end{itemize}


\begin{exercice} (10 points)
\def\versionExo{\ListAP[1]} 

\ifnum\versionExo=1
%MF1
Donner le programme (partie SQL + et PL/SQL) permettant d’enregistrer
un {\bf sport}.

Messages à prévoir :
\begin{itemize}
\item Le nom du sport est déjà attribué
\item Le nombre maximum de joueurs ne peut être inférieur au nombre minimum
\item La durée est de 1h ou 2h
\item Le sport a été enregistré : nom du sport
\end{itemize}

\begin{SaveVerbatim}{Maxpoints}
DROP TABLE tligne ;
CREATE TABLE tligne (ligne varchar2(100)) ;

\end{SaveVerbatim}

%% \cache{%\begin{small}
%%     \BUseVerbatim{Maxpoints}
%% %  \end{small}
%}
\lstinputlisting{exo1-MF.sql}
\fi
\ifnum\versionExo=2
%PB1
  Donner le programme (partie SQL + et PL/SQL) permettant d’enregistrer une réservation sans {\bf équipement}.

Messages à prévoir :

\begin{itemize}
\item L’identifiant de la réservation est déjà attribué     
\item La date de réservation doit être postérieure à la date du jour
\item L’identifiant du terrain est inconnu
\item Le numéro du créneau est inconnu
\item La réservation a été enregistrée
\end{itemize}
\lstinputlisting{exo1-PB.sql}
\fi
\ifnum\versionExo=3
%FG1
 Donner le programme (partie SQL + et PL/SQL) permettant d’enregistrer
 un équipement sans {\bf réservation}.

 Messages à prévoir :
 \begin{itemize}
 \item L’identifiant de l’équipement est déjà attribué
 \item Le tarif doit être supérieure à 0
 \item Le libellé doit être unique
 \item L’équipement a été enregistré : Libellé
 \end{itemize}
 \lstinputlisting{exo1-FGL.sql}
 \fi
\ifnum\versionExo=4
%PL1
 Donner le programme (partie SQL + et PL/SQL) permettant d’enregistrer
 un nouveau {\bf cr\'eneau}.

 Messages à prévoir :
 \begin{itemize}
 \item L’identifiant du cr\'eneau  est déjà attribué
 \item L'heure de d\'ebut est d\'ej\`a attribu\'ee
 \item L'heure de d\'ebut doit \^etre comprise entre 9h et 17h
 \end{itemize}
 \lstinputlisting{exo1-PL.sql}
 \fi

 Au moins un des messages doit \^etre g\'er\'e avec une exception et au moins un autre doit \^etre g\'er\'e sans exception.
\end{exercice}


\begin{exercice} (15 points)
  
\def\versionExo{\ListAP[2]} 

\ifnum\versionExo=1
%MF2
Donner le programme permettant la suppression d’un {\bf joueur} à condition
qu’il n’ait pas fait de réservations pour aujourd’hui ou dans le
futur. L’identifiant du joueur aura été précédemment lu dans la
variable \code{vidJoueur}.  Messages à prévoir, utilisation d’au moins
une exception utilisateur:
\begin{itemize}
\item Joueur inconnu
\item Impossible, il existe des réservations faites par ce joueur pour aujourd’hui ou dans le futur
\item Nb  actions de réservations faites dans le passé par ce joueur ont été supprimées
\item Joueur supprimé
\end{itemize}
 \lstinputlisting{exo2-MF.sql}
\fi
\ifnum\versionExo=2
%PB2
Donner le programme permettant la suppression de toutes les {\bf réservations} du mois de mars utilisant l’équipement d’identifiant contenu dans la variable videquip.

Messages à prévoir :
\begin{itemize}
\item L’identifiant de l’équipement est inconnu
\item nb réservations ont été supprimées
\end{itemize}
 \lstinputlisting{exo2-PB.sql}
\fi
\ifnum\versionExo=3
%FG2
Donner le programme permettant la suppression d’un {\bf équipement} à
condition qu’il ne soit plus réservé (aujourd’hui et dans le futur),
on utilisera l’identifiant de l’équipement contenu dans la variable
\code{videquip}.

Messages à prévoir :
\begin{itemize}
\item L’identifiant de l’équipement est inconnu
\item Des réservations en cours ou à venir utilisent cet équipement
\item nb réservations passées ont été supprimées
\end{itemize}
 \lstinputlisting{exo2-FGL.sql}
\fi
\ifnum\versionExo=4
%PL2
Donner le programme permettant la suppression d’un {\bf terrain} à
condition qu’il ne soit plus réservé (aujourd’hui et dans le futur),
on utilisera l’identifiant du terrain  contenu dans la variable
\code{vidterrain}.

Messages à prévoir :
\begin{itemize}
\item L’identifiant du terrain est inconnu
\item Des réservations en cours ou à venir utilisent cet équipement
\item nb réservations passées ont été supprimées
\end{itemize}
 \lstinputlisting{exo2-PL.sql}
\fi
\end{exercice}

\begin{exercice} (20 points)
  
\def\versionExo{\ListAP[3]} 
\ifnum\versionExo=1
%MF3
Donner le programme permettant d’afficher les réservations actuelles
  ou futures par créneau horaire pour un {\bf sport donné}. On utilisera le
  nom du sport contenu dans la variable \code{vnomSport}. On affichera les
  résultats dans l’ordre croissant de l’heure de début, puis de la
  date de réservation.
  
\begin{SaveVerbatim}{Affichage}
Heure de début : XX
	Id réservation                  date : XX/XX/XX
	Id réservation                  date : XX/XX/XX
	Id réservation                  date : XX/XX/XX
	...
Heure de début : XX
	Id réservation                  date : XX/XX/XX
	Id réservation                  date : XX/XX/XX
	...
Nombre de réservations total pour ce sport : nb 
\end{SaveVerbatim}

%     \cache{%\begin{small}
\begin{center}
 \fbox{    \BUseVerbatim{Affichage}}
\end{center}

%\end{small}
     %     }
 \lstinputlisting{exo3-MF.sql}
\fi
\ifnum\versionExo=2
%PB3
Donner le programme permettant d’afficher la liste des réservations
concernant le {\bf terrain} d’identifiant T003, affichage dans l’ordre
croissant de la date de réservation, puis du nom des joueurs.

\begin{SaveVerbatim}{AffichagePB}
Id reservation : XXXXX		date : XX/XX/XX
	nom joueur
	nom joueur
	nom joueur
	...
Id reservation : XXXXX		date : XX/XX/XX
	nom joueur
	nom joueur
	...
...
Nombre de réservations sans équipement : nb 
\end{SaveVerbatim}

%     \cache{%\begin{small}
\begin{center}
 \fbox{    \BUseVerbatim{AffichagePB}}
\end{center}

%\end{small}
     %     }
 \lstinputlisting{exo3-PB.sql}
\fi
\ifnum\versionExo=3
%FG3
  Donner le programme permettant d’afficher la liste des joueurs à
  prévenir lors de la suppression d’un {\bf équipement} lié à sa réservation
  actuelle ou future. On utilisera l’identifiant de l’équipement
  contenu dans la variable \code{videquip}. On affichera les résultats
  dans l’ordre décroissant de la date de réservation, puis du nom des
  joueurs.

  \begin{SaveVerbatim}{AffichageFG}
Id réservation : XXXXX		date : XX/XX/XX
	nom joueur
	nom joueur
	nom joueur
	...
Id réservation : XXXXX		date : XX/XX/XX
	nom joueur
	nom joueur
	...
...
Nombre de joueurs à prévenir : nb 
  \end{SaveVerbatim}
\begin{center}
 \fbox{    \BUseVerbatim{AffichageFG}}
\end{center}
 \lstinputlisting{exo3-FGL.sql}
\fi
\ifnum\versionExo=4
%PL3
  Donner le programme permettant d’afficher la liste des joueurs à
  prévenir lors de la suppression, pour cause de coupure \'electrique
  d'EDF, d’un {\bf cr\'eneau} lié à sa réservation actuelle ou future. On
  utilisera l’identifiant du cr\'eneau  contenu dans la variable
  \code{vnumcreneau}. On affichera les résultats dans l’ordre décroissant
  de la date de réservation, puis du nom des joueurs.

  \begin{SaveVerbatim}{AffichagePL}
Id réservation : XXXXX		date : XX/XX/XX
	nom joueur
	nom joueur
	nom joueur
	...
Id réservation : XXXXX		date : XX/XX/XX
	nom joueur
	nom joueur
	...
...
Nombre de joueurs à prévenir : nb 
  \end{SaveVerbatim}
\begin{center}
 \fbox{    \BUseVerbatim{AffichagePL}}
\end{center}
 \lstinputlisting{exo3-PL.sql}
\fi
\end{exercice}



\begin{exercice} (20 points)

\def\versionExo{\ListAP[4]} 

\ifnum\versionExo=1
%MF4
Donner le programme permettant d’afficher pour chaque réservation le
{\bf coût de la  réservation du terrain}. On affichera les résultats dans
l’ordre décroissant du coût du terrain.

\begin{SaveVerbatim}{AffichageMF2}
Id. réserv: XXXXX  heure début : X  durée : X  tarif horaire : 99  Coût terrain :9999 euros
Id. réserv: XXXXX  heure début : X  durée : X  tarif horaire : 99  Coût terrain :9999 euros
...
\end{SaveVerbatim}


\begin{center}
  \fbox{\begin{small}
      \BUseVerbatim{AffichageMF2}
    \end{small}
}
\end{center}
%\lstinputlisting{exo4-MF.sql}
\fi
\ifnum\versionExo=2
%PB4
  Donner le programme permettant d’afficher la liste de toutes les
  {\bf réservations en calculant leur nombre de joueurs}. On affichera les
  résultats dans l’ordre décroissant du nombre de joueur par
  réservation.
  
  \begin{SaveVerbatim}{AffichagePB2}
Id réservation : XXXXX		date : XX/XX/XX	Nombre de joueurs : 999
Id réservation : XXXXX		date : XX/XX/XX	Nombre de joueurs : 999
Id réservation : XXXXX		date : XX/XX/XX	Nombre de joueurs : 999
...
Nombre de joueur moyen par réservation : 999
  \end{SaveVerbatim}

\begin{center}
  \fbox{\begin{small}
      \BUseVerbatim{AffichagePB2}
    \end{small}
}
\end{center}
%\lstinputlisting{exo4-PB.sql}
\fi
\ifnum\versionExo=3
%FG4
Donner le programme permettant d’afficher la liste de toutes les
{\bf réservations en calculant le montant des coûts engendrés par leurs
équipements}. On affichera les résultats dans l’ordre décroissant du
coût lié aux équipement de la réservation.

\begin{SaveVerbatim}{AffichageFG2}
Id réservation : XXXXX		date : XX/XX/XX	Coût des équipements : 9999 euros
Id réservation : XXXXX		date : XX/XX/XX	Coût des équipements : 9999 euros
Id réservation : XXXXX		date : XX/XX/XX	Coût des équipements : 9999 euros
...
\end{SaveVerbatim}

\begin{center}
  \fbox{\begin{small}
      \BUseVerbatim{AffichageFG2}
    \end{small}
}
\end{center}
\lstinputlisting{exo4-FGL.sql}
\fi
\ifnum\versionExo=4
%PL4
  Donner le programme permettant d’afficher pour chaque {\bf cr\'eneau le
  b\'en\'efice fait et le nombre de joueurs}. On affichera les résultats dans
l’ordre décroissant des b\'en\'efices.

\begin{SaveVerbatim}{AffichagePL2}
NumCreneau: XXXXX  heure début : X    Benefice :9999 euros   nb joueurs : 9999 
NumCreneau: XXXXX  heure début : X    Benefice :9999 euros   nb joueurs : 9999
...
\end{SaveVerbatim}


\begin{center}
  \fbox{\begin{small}
      \BUseVerbatim{AffichagePL2}
    \end{small}
}
\end{center}
\lstinputlisting{exo4-PL.sql}
\fi
\end{exercice}


\section*{Rappels}
%% Les fonctions \code{connexion}, \code{deconnexion} et \code{sql\_error}
%% sont rappell\'ees ci-dessous. Elles ne sont pas \`a r\'e\'ecrire sur
%% vos copies, mais \`a utiliser dans les exercices si besoin.

%% \begin{verbatim}
%% void connexion()
%% {	VARCHAR uid[50];
%% 	char login[20];
%% 	char passwd[20];
%% 	printf("Donner votre login : ");
%% 	scanf("%s",login);
%% 	printf("\nDonnez votre mot de passe Oracle : ");
%% 	scanf("%s",passwd);
%% 	printf("\n");
%% 	strcpy(uid.arr,login);
%% 	strcat(uid.arr,"/");
%% 	strcat(uid.arr,passwd);
%% 	strcat(uid.arr,"@kirov");
%% 	uid.len=strlen(uid.arr);

%% 	EXEC SQL CONNECT :uid;
%% 	if (sqlca.sqlcode==0)
%% 		printf(" Connexion réussie avec succès.\n\n");
%% 	else
%% 	{
%% 		printf ("Problème à la connexion.\n\n");
%% 		exit(1);
%% 	}}
%% \end{verbatim}


%% \begin{verbatim}
%% void deconnexion(int validation)
%% {
%% 	if (validation == 1)
%% 	{  EXEC SQL COMMIT WORK RELEASE;
%% 	} else
%% 	{  EXEC SQL ROLLBACK WORK RELEASE;}
%% 	printf("Déconnexion sans problème.\n");
%% }
%% \end{verbatim}

%% \begin{verbatim}
%% void sql_error(char *msg) 
%% {	char err_msg[128]; 
%% 	long buf_len, msg_len; 

%% 	EXEC SQL WHENEVER SQLERROR CONTINUE; 

%% 	printf("%s\n", msg); 
%% 	buf_len = sizeof (err_msg); 
%% 	sqlglm(err_msg, &buf_len, &msg_len); 

%% 	if (msg_len > buf_len)
%% 	msg_len = buf_len;

%% 	printf("%.*s\n", msg_len, err_msg);
%% 	deconnexion(0);
%% 	exit(1);
%% }
%% \end{verbatim}


\section*{MEMO}
\subsection*{Langage PL/SQL}

\begin{verbatim}
DECLARE
    variable_PL/SQL   {type SQL  |  nom_table.nom_colonne%TYPE  |  nom_table%ROWTYPE} ;
    CURSOR curseur IS SELECT … ;
    nom_exception EXCEPTION;
BEGIN
    OPEN curseur ;
    FETCH curseur INTO  liste de variables ;
    curseur%FOUND
    CLOSE curseur ;
    RAISE nom_exception ;
    SELECT   liste_de_sélection  INTO liste de variables  FROM … WHERE … ORDER BY ... ;
    Variable PL/SQL  :=   ‘&variable_ SQLPlus’  …
    IF  … THEN …  [ELSE …]  END IF ;
    WHILE  …   LOOP  …   END LOOP ;
EXCEPTION
    WHEN nom_exception THEN …;
    WHEN NO_DATA_FOUND THEN … ;
    WHEN OTHERS THEN  … :
END ;
\end{verbatim}

%% \subsection*{Langage PRO*C}
%% \begin{verbatim}
%% struct {long sqlcode;/* code resultant de l'exécution
%%                          =0 -> ok,
%%                          >0 -> ok avec un code d'état,
%%                          <0 -> erreur */
%%         struct {
%%                 unsigned short sqlerrml;/*longueur du message*/
%%                 char sqlerrmc[70];/*message d'erreur*/
%%         } sqlerrm;
%%         long sqlerrd[6];/* seul sqlerrd[2] est utilisé -> donne le nombre de lignes modifiées
%%                            UPDATE ou rajoutées par INSERT ou ramenées par un SELECT*/
%%         char sqlwarn[8];/*sqlwarn[0] 'W’ -> warning*/
%%         sqlwarn[0] = '' /*-> pas de warning*/
%%         sqlwarn[1] = 'W'/*-> troncation numérique ou char*/
%%         sqlwarn[2] = 'W'/*-> valeur Null est ignore */
%%         sqlwarn[3] = 'W'/*-> plus de champs dans SELECT que de variables pour recevoir*/
%%         sqlwarn[4] = 'W'/*-> toutes les lignes d'une table sont touchées (par DELETE ou 
%%                              UPDATE par exemple)*/
%%         sqlwarn[5]      /* inutilisé */
%%         sqlwarn[6] = 'W'/*-> Oracle a dû exécuter un rollback */
%%         sqlwarn[7] = 'W'/*-> la donnée ramenée par un FETCH a été modifié 
%%         depuis que la clause SELECT a été executé */
%% } sqlca;
%% :var_hote INDICATOR :indicateur
%% :var_hote :indicateur
%% \end{verbatim}

%\includepdf[pages=-]{MEMO.pdf}

\end{document}
