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