|
|
@ -85,26 +85,70 @@
|
|
|
|
NOM : \hfill Partiel \hfill~\\
|
|
|
|
NOM : \hfill Partiel \hfill~\\
|
|
|
|
PRENOM : \hfill 90 minutes, 75 points \hfill ~\\
|
|
|
|
PRENOM : \hfill 90 minutes, 75 points \hfill ~\\
|
|
|
|
GROUPE : \hfill Aucun document autoris\'e \hfill~\\
|
|
|
|
GROUPE : \hfill Aucun document autoris\'e \hfill~\\
|
|
|
|
|
|
|
|
|
|
|
|
\end{center}
|
|
|
|
\end{center}
|
|
|
|
|
|
|
|
|
|
|
|
\begin{exercice}D\'efinitions (15 points)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
\begin{exercice}[Curseur (20 points)] \ \\
|
|
|
|
|
|
|
|
\begin{enumerate}
|
|
|
|
|
|
|
|
\item (3 points) Expliquer \`a quoi sert un curseur.
|
|
|
|
|
|
|
|
\cache{Un curseur permet de r\'ecup\'erer des donn\'ees multiples.}
|
|
|
|
|
|
|
|
\item (5 points) Donner un exemple simple qui n’est pas possible de
|
|
|
|
|
|
|
|
traiter sans un curseur, et expliquer pourquoi. \cache{Une
|
|
|
|
|
|
|
|
requete qui renvoie plein de donn\'ees .}
|
|
|
|
|
|
|
|
\item (12 points) Donner un exemple simple d'utilisation d'un curseur.
|
|
|
|
|
|
|
|
\newsavebox\dd
|
|
|
|
|
|
|
|
\begin{lrbox}{\dd}
|
|
|
|
|
|
|
|
\begin{minipage}{\textwidth}
|
|
|
|
|
|
|
|
\begin{verbatim}
|
|
|
|
|
|
|
|
DECLARE
|
|
|
|
|
|
|
|
dnom VARCHAR2(100);
|
|
|
|
|
|
|
|
CURSOR C SELECT nom from ETUDIANT WHERE age > 18;
|
|
|
|
|
|
|
|
BEGIN
|
|
|
|
|
|
|
|
OPEN C;
|
|
|
|
|
|
|
|
FETCH C into dnom;
|
|
|
|
|
|
|
|
WHILE
|
|
|
|
|
|
|
|
LOOP
|
|
|
|
|
|
|
|
INSERT INTO tligne VALUES(dnom) ;
|
|
|
|
|
|
|
|
FETCH C into dnom;
|
|
|
|
|
|
|
|
END LOOP;
|
|
|
|
|
|
|
|
CLOSE C;
|
|
|
|
|
|
|
|
END;
|
|
|
|
|
|
|
|
.
|
|
|
|
|
|
|
|
/
|
|
|
|
|
|
|
|
\end{verbatim}
|
|
|
|
|
|
|
|
\end{minipage}
|
|
|
|
|
|
|
|
\end{lrbox}
|
|
|
|
|
|
|
|
\cache{\usebox\dd}
|
|
|
|
|
|
|
|
\end{enumerate}
|
|
|
|
|
|
|
|
\end{exercice}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
\newpage
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
\begin{exercice}[Exception (15 points)]
|
|
|
|
|
|
|
|
\ \\
|
|
|
|
\begin{enumerate}
|
|
|
|
\begin{enumerate}
|
|
|
|
\item (3 points) Expliquer ce qu'est une exception.
|
|
|
|
\item (3 points) Expliquer ce qu'est une exception.
|
|
|
|
\cache{Une exception permet de r\'ealiser un traitement lors
|
|
|
|
\cache{Une exception permet de r\'ealiser un traitement lors
|
|
|
|
qu'une erreur SQL se produit.}
|
|
|
|
qu'une erreur SQL se produit.}
|
|
|
|
\item (4 points) Donner un exemple d'utilisation de l'exception
|
|
|
|
\item (12 points) Donner un exemple de cr\'eation d'exception \code{MINEUR}
|
|
|
|
\verb+NO_DATA_FOUND+.
|
|
|
|
qui est lev\'ee si la table \code{ETUDIANT (NOM VARCHA2(100), AGE NUMBER);} contient au moins un mineur et affiche le nombre de mineurs.
|
|
|
|
\newsavebox\avecalter
|
|
|
|
\newsavebox\avecalter
|
|
|
|
\begin{lrbox}{\avecalter}
|
|
|
|
\begin{lrbox}{\avecalter}
|
|
|
|
\begin{minipage}{\textwidth}
|
|
|
|
\begin{minipage}{\textwidth}
|
|
|
|
\begin{verbatim}
|
|
|
|
\begin{verbatim}
|
|
|
|
Declare
|
|
|
|
DECLARE
|
|
|
|
begin
|
|
|
|
Dnbmineur
|
|
|
|
Select nom into dnom FROM ELEVE Where age < 0;
|
|
|
|
MINEUR EXCEPTION
|
|
|
|
|
|
|
|
BEGIN
|
|
|
|
|
|
|
|
SELECT count(*) into Dnbmineur FROM ETUDIANT WERE AGE < 18;
|
|
|
|
|
|
|
|
IF Dnbmineur > 0 THEN RAISE MINEUR
|
|
|
|
|
|
|
|
END IF;
|
|
|
|
EXCEPTION
|
|
|
|
EXCEPTION
|
|
|
|
when no_data_found then
|
|
|
|
WHEN MINEUR THEN
|
|
|
|
INSERT INTO tligne VALUES(TO_CHAR(SQLCODE)||' '||SQLERRM||'Age negatif') ;
|
|
|
|
INSERT INTO tligne VALUES();
|
|
|
|
End;
|
|
|
|
End;
|
|
|
|
.
|
|
|
|
.
|
|
|
|
/
|
|
|
|
/
|
|
|
@ -113,35 +157,34 @@ End;
|
|
|
|
\end{lrbox}
|
|
|
|
\end{lrbox}
|
|
|
|
\cache{\usebox\avecalter}
|
|
|
|
\cache{\usebox\avecalter}
|
|
|
|
|
|
|
|
|
|
|
|
\item (2+2+4=8 points) Donner un exemple simple qui n’est pas possible de
|
|
|
|
%% \item (2+2+4=8 points) Donner un exemple simple qui n’est pas possible de
|
|
|
|
traiter sans un curseur, expliquer pourquoi et montrer comment
|
|
|
|
%% traiter sans un curseur, expliquer pourquoi et montrer comment
|
|
|
|
créer un curseur et comment l'utiliser dans ce cas là.
|
|
|
|
%% créer un curseur et comment l'utiliser dans ce cas là.
|
|
|
|
|
|
|
|
|
|
|
|
\begin{SaveVerbatim}{VerbEnv}
|
|
|
|
%% \begin{SaveVerbatim}{VerbEnv}
|
|
|
|
Declare
|
|
|
|
%% Declare
|
|
|
|
dnom Etudaint.nom%TYPE ;
|
|
|
|
%% dnom Etudaint.nom%TYPE ;
|
|
|
|
Cursor r is Select nom from Etudiant FOR UPDATE;
|
|
|
|
%% Cursor r is Select nom from Etudiant FOR UPDATE;
|
|
|
|
BEGIN
|
|
|
|
%% BEGIN
|
|
|
|
OPEN r ;
|
|
|
|
%% OPEN r ;
|
|
|
|
FETCH r INTO dnom ;
|
|
|
|
%% FETCH r INTO dnom ;
|
|
|
|
WHILE r%FOUND
|
|
|
|
%% WHILE r%FOUND
|
|
|
|
LOOP
|
|
|
|
%% LOOP
|
|
|
|
UPDATE Etudiant SET nom=dnom||'old' WHERE CURRENT of r ;
|
|
|
|
%% UPDATE Etudiant SET nom=dnom||'old' WHERE CURRENT of r ;
|
|
|
|
FETCH r INTO dnom ;
|
|
|
|
%% FETCH r INTO dnom ;
|
|
|
|
END LOOP ;
|
|
|
|
%% END LOOP ;
|
|
|
|
COMMIT;
|
|
|
|
%% COMMIT;
|
|
|
|
CLOSE R ;
|
|
|
|
%% CLOSE R ;
|
|
|
|
END ;
|
|
|
|
%% END ;
|
|
|
|
\end{SaveVerbatim}
|
|
|
|
%% \end{SaveVerbatim}
|
|
|
|
\cache{\code{Select nom into dnom from Etudiant ;}
|
|
|
|
%% \cache{\code{Select nom into dnom from Etudiant ;}
|
|
|
|
|
|
|
|
|
|
|
|
ici la liste des noms ne va pas pouvoir rentrer dans dnom.
|
|
|
|
%% \BUseVerbatim{VerbEnv}
|
|
|
|
|
|
|
|
|
|
|
|
Il faut donc utiliser un cureur :
|
|
|
|
%% } \end{enumerate}
|
|
|
|
\BUseVerbatim{VerbEnv}
|
|
|
|
\end{enumerate}
|
|
|
|
|
|
|
|
|
|
|
|
} \end{enumerate}
|
|
|
|
\end{exercice}
|
|
|
|
\end{exercice}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
\newpage
|
|
|
|
\newpage
|
|
|
|
|
|
|
|
|
|
|
|