\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]{../COURS/BD.png}
    \end{center}

\end{document}
