\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{adjustbox} \usepackage{slashbox} %\usepackage{times} \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 2018-2019 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}} \usepackage{boxedminipage} \usepackage{setspace} \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 \begin{document} \begin{center} NOM : \hfill Partiel \hfill~\\ PRENOM : \hfill 90 minutes, 75 points \hfill ~\\ GROUPE : \hfill Aucun document autoris\'e \hfill~\\ \end{center} \begin{exercice}D\'efinitions (15 points) \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.} \item (4 points) Donner un exemple d'utilisation de l'exception \verb+NO_DATA_FOUND+. \newsavebox\avecalter \begin{lrbox}{\avecalter} \begin{minipage}{\textwidth} \begin{verbatim} Declare begin Select nom into dnom FROM ELEVE Where age < 0; EXCEPTION when no_data_found then INSERT INTO tligne VALUES(TO_CHAR(SQLCODE)||' '||SQLERRM||'Age negatif') ; End; . / \end{verbatim} \end{minipage} \end{lrbox} \cache{\usebox\avecalter} \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 créer un curseur et comment l'utiliser dans ce cas là. \begin{SaveVerbatim}{VerbEnv} Declare dnom Etudaint.nom%TYPE ; Cursor r is Select nom from Etudiant FOR UPDATE; BEGIN OPEN r ; FETCH r INTO dnom ; WHILE r%FOUND LOOP UPDATE Etudiant SET nom=dnom||'old' WHERE CURRENT of r ; FETCH r INTO dnom ; END LOOP ; COMMIT; CLOSE R ; END ; \end{SaveVerbatim} \cache{\code{Select nom into dnom from Etudiant ;} ici la liste des noms ne va pas pouvoir rentrer dans dnom. Il faut donc utiliser un cureur : \BUseVerbatim{VerbEnv} } \end{enumerate} \end{exercice} \newpage \begin{exercice}[Soldes] (20 points) Afin de préparer les soldes d’hiver, écrivez un fichier de commandes SQL qui, pour un produit saisi par l’utilisateur, si le stock est plus grand que 100 alors le prix est diminué de 10\% et si le stock plus grand que 200 alors le prix est diminué de 20\%. Enfin si le stock est vide alors ajouter dans la table \code{Tligne} une phrase pour indiquer qu’il faut recommander ce produit en donnant son numéro de produit. \end{exercice} \begin{SaveVerbatim}{VerbSolde} DROP TABLE tligne ; CREATE TABLE tligne (ligne varchar2(100)) ; set echo off ; set verify off ; set feed off; variable vnoproduit char(4) prompt Entrer la reference du fournisseur : accept vnoproduit DECLARE dstock number; BEGIN SELECT count(stock) INTO dstock FROM Tproduit Where noproduit=’&vnoproduit’; If dstock = 0 then INSERT INTO tligne VLAUES (‘Stock Null pour ce produit ’||’&vnoporduit’||’Recommander ’) ; End if; If dstock >200 then UPDATE Tproduit SET prixv=dprix*1.2 WHERE noproduit=’&vnoproduit’; Else If dstock > 100 then UPDATE Tproduit SET prixv=dprix*1.1 WHERE noproduit=’&vnoproduit’; End if; End; . / SELECT * FROM tligne ; set verify on ; set feed on ; set echo on ; \end{SaveVerbatim} \cache{%\begin{small} \BUseVerbatim{VerbSolde} % \end{small} } \newpage \begin{exercice}[Fournisseur] (20 points) Ecrire un fichier de commandes SQL qui demande un numéro de produit et qui retourne le message ‘le produit n’a pas de fournisseur’ ou ‘le produit a plusieurs fournisseurs’, ou le 'Nom' du fournisseur s’il n’en a qu’un. Le résultat sera placé dans une table \code{Tligne (LIGNE varchar2(200))} et contiendra le message et le code d’erreur produit par Oracle. \end{exercice} \begin{SaveVerbatim}{Verbfour} DROP TABLE tligne ; CREATE TABLE tligne (ligne varchar2(100)) ; set echo off ; set verify off ; set feed off ; variable vreffourn char(4) prompt Entrer la reference du produit : accept vnoproduit DECLARE dnomfour char(20) ; dreffour char(4) BEGIN SELECT refourn INTO dreffour FROM Tproduitfourn WHERE nopoduit ='&vnoproduit' ; SELECT Nom INTO dnomfour FROM TFounisseur Where ref-fourn='dreffour; INSERT INTO tligne VALUES (dnomfour) ; EXCEPTION when no_data_found then INSERT INTO tligne VALUES(TO_CHAR(SQLCODE)||' '||SQLERRM||' Le produit n''a pas de fournisseur' ) ; when too_many_rows then INSERT INTO tligne VALUES(O_CHAR(SQLCODE)||' '||SQLERRM||' Le produit a plusieurs fournieeurs) ; End ; . / SELECT * FROM tligne ; set verify on ; set feed on ; set echo on ; \end{SaveVerbatim} \cache{%\begin{small} \BUseVerbatim{Verbfour} % \end{small} } \newpage \begin{exercice}[Curseur] (20 points) Ecrivez un fichier de commandes SQL qui diminue de 10\% les prix des produits qui ont un stock de plus de 500. \end{exercice} \begin{SaveVerbatim}{Verbcinq} set echo off ; set verify off ; set feed off ; Declare dprix Tproduit.prix%TYPE ; CURSOR r IS SELECT prixv FROM Tproduit WHERE Tproduit.stock >500 FOR UPDATE ; BEGIN OPEN r ; FETCH r INTO dprix ; WHILE r%FOUND LOOP UPDATE Tproduit SET prixv=dprix*1.1 WHERE CURRENT of r ; FETCH r INTO dprix ; END LOOP ; COMMIT ; CLOSE R ; END ; . / set verify on ; set feed on ; set echo on ; \end{SaveVerbatim} \cache{%\begin{small} \BUseVerbatim{Verbcinq} % \end{small} } %\newpage \section*{Rappel} \begin{center} \includegraphics[width=14cm]{BD.png} \end{center} \end{document}