diff --git a/EXOS/Partiel2020.tex b/EXOS/Partiel2020.tex index 270dafc..3e2f5e7 100644 --- a/EXOS/Partiel2020.tex +++ b/EXOS/Partiel2020.tex @@ -90,7 +90,7 @@ \begin{center} NOM : \hfill Partiel \hfill~\\ - PRENOM : \hfill 90 minutes, 80 points \hfill ~\\ + PRENOM : \hfill 90 minutes, 90 points \hfill ~\\ GROUPE : \hfill Aucun document autoris\'e \hfill~\\ \end{center} @@ -101,14 +101,25 @@ \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 (5 points) Donner un exemple simple de requ\^ete en + pr\'ecisant la table utilis\'ee qui n’est pas possible de traiter + sans un curseur, et expliquer pourquoi. \cache{SELECT * + + from ETUDIANTS + + WHERE + + + 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} +SET echo off; +SET verify off; +SET feedback off; DECLARE dnom VARCHAR2(100); CURSOR C SELECT nom from ETUDIANT WHERE age > 18; @@ -124,6 +135,9 @@ CLOSE C; END; . / +SET echo on; +SET verify on; +SET feedback on; \end{verbatim} \end{minipage} \end{lrbox} @@ -138,27 +152,47 @@ END; \ \\ \begin{enumerate} \item (3 points) Expliquer ce qu'est une exception. - \cache{Une exception permet de r\'ealiser un traitement lors - qu'une erreur SQL se produit.} + \cache{Une exception permet de r\'ealiser un traitement + + lors qu'une erreur SQL se produit. + + ou lorsque l utilisateur le decide} \item (12 points) Donner un exemple de cr\'eation d'exception \code{MINEUR} 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 \begin{lrbox}{\avecalter} \begin{minipage}{\textwidth} \begin{verbatim} + +SET echo off; +SET verify off; +SET feedback off; + DECLARE Dnbmineur MINEUR EXCEPTION + BEGIN -SELECT count(*) into Dnbmineur FROM ETUDIANT WERE AGE < 18; -IF Dnbmineur > 0 THEN RAISE MINEUR +SELECT count(*) into Dnbmineur +FROM ETUDIANT +WERE AGE < 18; + +IF Dnbmineur > 0 +THEN RAISE MINEUR END IF; + EXCEPTION WHEN MINEUR THEN INSERT INTO tligne VALUES(); -End; + +END; + . / + +SET echo on; +SET verify on; +SET feedback on; \end{verbatim} \end{minipage} \end{lrbox} @@ -298,14 +332,112 @@ Date\_creation\\ \end{tikzpicture} \end{center} - \newpage + + -\begin{exercice}[NBA, PLSQL] (45 points) +\begin{exercice}[NBA, PLSQL] (60 points) Le MLD ci-dessus stocke les donn\'ees des matchs NBA. \begin{enumerate} -\item (15 points) \'Ecrire un code PL/SQL qui permet de saisir un +\item (20 points) Lister dans une table \code{TLIGNES} tous les + joueurs d'un \'equipe donn\'ee par l'utilisateur et d'une ann\'ee, + afficher leur nom, pr\'enom, poste et le nombres de match o\`u il a + fait 0, 1, 2, 3, 4 ou 5 fautes, durant cette ann\'ee civile : +\begin{center} + \begin{small} +\begin{verbatim} + EQUIPE XXX + Nom Prenom Poste + XXXXXX XXXXXXX XXXXXX + Fautes Nb Matchs + 0 YYY + 1 YYY + 2 YYY + 3 YYY + 4 YYY + 5 YYY + + XXXXXX XXXXXXX XXXXXX + Fautes Nb Matchs + 0 YYY + 1 YYY + 2 YYY + 3 YYY + 4 YYY + 5 YYY +\end{verbatim} + \end{small} +\end{center} + + +\begin{SaveVerbatim}{eqpts} +variable equipe char(4) +prompt Entrer une equipe +accept vequipe + +variable vannee number +prompt Entrer une annee +accept vannee + +DECLARE +dnom varchar2(20); +dprenom varchar2(20); +dposte char(2); +didjoueur NUMNER; +dnbfautes number; +dcpt number; + +CURSOR Cnom IS SELECT j.idjoueur, j.Nom, j.Prenom, j.Poste FROM JOUEUR j, +JOUE e, MATCH m WHERE j.id_joueur = e.id_joueur and id +AND ( m.Date_Match > TO_DATE('01/01/'||'&vannee',DD/MM/YYYY) AND +m.Date_Match < TO_DATE('12/31/'||'&vannee',DD/MM/YYYY) ); + +CURSOR Cfaute IS SELECT COUNT(ID_match) FROM JOUE +WHERE id_joueur = didjoueur +GROUP BY FAUTES; + +BEGIN +INSERT INTO tligne VALUES (EQUIPE'||'&vequipe'); +INSERT INTO tligne VALUES ('Nom Prenom Poste'); +OPEN Cnom; +FETCH Cnom INTO didjoueur, dnom, dprenom, dposte; +WHILE Cnom%found LOOP + INSERT INTO tligne VALUES (dnom||' '||dprenom||' '||dposte); + OPEN Cfaute; + + dcpt:=0; + INSERT INTO tligne VALUES (Faute Nn Matchs); + FETCH Cfaute INTO dnbfaute; + WHILE Couest%found LOOP + INSERT INTO tligne VALUES (dcpt||' '||dnbfaute); + dcpt:=dcpt+1; + FETCH Cfaute INTO dnbfaute; + END LOOP; + CLOSE Cfaute; + + FETCH Cnom INTO didjoueur, dnom, dprenom, dposte; +END LOOP; +CLOSE Cnom; + +END; +. +/ +SELECT * FROM tligne ; +\end{SaveVerbatim} + + + \cache{\begin{footnotesize} + \BUseVerbatim{eqpts} + \end{footnotesize} + } + + + + + \newpage + +\item (10 points) \'Ecrire un code PL/SQL qui permet de saisir un nouveau joueur en entrant les six champs n\'ecessaires. Lever une exception la clef primaire saisie n'est pas valide. @@ -557,13 +689,11 @@ set echo on; %% \BUseVerbatim{Allstar} %% \end{footnotesize} %% } + \end{enumerate} \end{exercice} - - - \end{document}