master
Pascal LAFOURCADE 4 years ago
parent d820b77ef3
commit 6b08803462

@ -855,6 +855,11 @@ DROP TABLEl Tligne;
\end{exemple} \end{exemple}
\section{Gestion des erreurs : \code{EXCEPTION ... WHEN ... THEN}} \section{Gestion des erreurs : \code{EXCEPTION ... WHEN ... THEN}}
Lorsqu'une instruction se passe mal en \plsql, une \emph{exception}
est lev\'ee. Il est possible de sp\'ecifier une comportement adpat\'e
dans ce cas dans la section \code{EXCEPTION}.
\subsection{La section \code{EXCEPTION}} \subsection{La section \code{EXCEPTION}}
La section \code{EXCEPTION} permet d'affecter un traitement approprié La section \code{EXCEPTION} permet d'affecter un traitement approprié
@ -868,9 +873,11 @@ Les types d'erreurs sont les suivants :
\begin{exemple} Les résultats à afficher sont placés dans \begin{exemple} Les résultats à afficher sont placés dans
une table \code{Tligne}. une table \code{Tligne}. Lorsque la requ\^ete \sql{} ne produit pas de
r\'esultats alors une exception est lev\'ee.
\begin{verbatim} \begin{verbatim}
drop table Tligne;
create table Tligne (Tligne varchar2(150)); create table Tligne (Tligne varchar2(150));
variable vnoproduit char(4) variable vnoproduit char(4)
prompt taper la référence du produit à rechercher : prompt taper la référence du produit à rechercher :
@ -896,7 +903,6 @@ end ;
. .
/ /
select * from Tligne; select * from Tligne;
drop table Tligne;
\end{verbatim} \end{verbatim}
\end{exemple} \end{exemple}
@ -904,25 +910,33 @@ drop table Tligne;
\end{remarque} \end{remarque}
\begin{exercice} \begin{exercice}
Enregistrer une livraison pour un produit donné : Enregistrer une livraison pour un produit donné :
\begin{itemize} \begin{itemize}
\item saisie du numéro de produit et de la quantité livrée, \item saisie du numéro de produit et de la quantité livrée,
\item accès au stock du produit : exception \code{référence inconnue}, \item accès au stock du produit : exception si \code{référence inconnue},
\item calcul du nouveau stock et mise à jour du stock. \item calcul du nouveau stock et mise à jour du stock.
\end{itemize} \end{itemize}
\end{exercice} \end{exercice}
%% \cache{
%% TODO
%% }
\begin{exercice} Enregistrer un nouveau produit dun fournisseur : \begin{exercice} Enregistrer un nouveau produit dun fournisseur :
\begin{itemize} \begin{itemize}
\item saisie des références du produit et du fournisseur, du prix \item saisie des références du produit et du fournisseur, du prix
fournisseur, fournisseur,
\item accès au produit pour vérifier quil existe, \item accès au produit pour vérifier quil existe,
\item accès au fournisseur pour vérifier quil existe, \item accès au fournisseur pour vérifier quil existe,
\item accès à la liaison produit-fournisseur pour vérifier quelle nest pas déjà enregistrée, \item accès à la liaison produit-fournisseur pour vérifier quelle nest pas déjà enregistrée (Exception \`a g\'erer),
\item enregistrement de la liaison. \item enregistrement de la liaison.
\end{itemize} \end{itemize}
\end{exercice} \end{exercice}
%% \cache{
%% TODO
%% }
\subsection{Erreur Oracle} \subsection{Erreur Oracle}
@ -1008,29 +1022,87 @@ END;
\end{verbatim} \end{verbatim}
\end{exemple} \end{exemple}
\begin{exercice} Mise en évidence des exceptions \verb+TOO_MANY_ROWS, OTHERS+ \begin{exercice} Pour mettre en évidence lexception \verb+TOO_MANY_ROWS+, créez un fichier de commandes \sql{} qui:
\begin{itemize}
\item demande un numéro de fournisseur,
\item accède aux N° des produits de ce fournisseur (par \code{select into})
\item retourne le message \code{le fournisseur na pas de produit} ou
\code{le fournisseur a plusieurs produits}, ou le N° du produit sil
nen a quun.
\end{itemize}
Le résultat sera placé dans une table \code{TLIGNE (LIGNE
varchar2(200))}. Placez aussi dans cette table le \code{SQLCODE} et
le message Oracle obtenus à lissue de \code{SELECT}. Modifiez le
programme en remplaçant une des deux exceptions par \code{OTHERS}.
\end{exercice}
Pour mettre en évidence lexception \verb+TOO_MANY_ROWS+, créez un
fichier de commandes \sql{} qui: demande un numéro de fournisseur, accède
aux N° des produits de ce fournisseur (par \code{select into}) retourne le
message \code{le fournisseur na pas de produit} ou \code{le fournisseur a plusieurs
produits}, ou le N° du produit sil nen a quun.
Le résultat sera placé dans une table \code{TLIGNE (LIGNE
varchar2(200))} Placez aussi dans cette table le \code{SQLCODE} et
le message Oracle obtenus à lissue de \code{SELECT}.
Modifiez le programme en remplaçant une des deux exceptions par \code{OTHERS}. \subsection{Erreur utilisateur : \code{EXCEPTION, RAISE}}
Le traitement de lanomalie doit être déclenché en passant dans la
partie \code{EXCEPTION} par \code{RAISE}.
\begin{verbatim}
DECLARE
...
nom_erreur EXCEPTION;
...
BEGIN
...
IF anomalie
THEN RAISE nom_erreur;
...
EXCEPTION
WHEN nom_erreur THEN
traitement à effectuer en cas danomalie;
END;
\end{verbatim}
Sortie du bloc après exécution du traitement.
\begin{exemple}
Accèder au stock dun produit de Numéro donné avec Erreur Oracle quand
le produit nexiste pas et Erreur utilisateur quand le stock est
nul. Les anomalies sont placées dans une table \code{terreur(z1
varchar2(30), z2 varchar2(30))}
\begin{verbatim}
DECLARE
...
stock_nul EXCEPTION;
dstock number;
...
BEGIN
SELECT stock INTO dstock FROM tproduit WHERE noproduit = &vnoproduit;
IF stock = 0
THEN RAISE stock_nul;
traitement quand le stock nest pas nul...
EXCEPTION
WHEN NO_DATA_FOUND THEN
INSERT INTO terreur VALUES (&vnoproduit, produit inconnu);
WHEN stock_nul THEN
INSERT INTO terreur VALUES (&vnoproduit, stock nul);
END;
\end{verbatim}
\end{exemple}
\begin{exercice} Pour remplacer lerreur Oracle par une erreur utilisateur, compter le nombre de produits ayant le numéro donné et déclencher une exception si ce nombre est nul.
\end{exercice} \end{exercice}
\section{Les curseurs}\label{sec:curseur} \section{Les curseurs}\label{sec:curseur}
\subsection{\code{DECLARE, OPEN, FETCH, CLOSE}}
Lorsquune requête \code{SELECT} est susceptible de délivrer plusieurs Lorsquune requête \code{SELECT} est susceptible de délivrer plusieurs
lignes, on associe à celle ci un «curseur explicite» qui va lignes, on associe à celle ci un «curseur explicite» qui va permettre
permettre daccéder aux lignes du résultat. Lalgorithme est analogue daccéder aux lignes du résultat. Lalgorithme est analogue au
au traitement dun fichier séquentiel. traitement dun fichier séquentiel.
\subsection{\code{DECLARE, OPEN, FETCH, CLOSE}}
Il faut d'abord d\'eclarer le curseur dans le bloc \code{DECLARE},
ensuite ouvrir le curseur avec la commande \code{OPEN} et penser \`a
le ferm\'e une fois celui-ci utilis\'e. Pour acc\'eter aux donn\'ees
les unes apr\`es les autres il faut utiliser la commande \code{FETCH}.
\begin{exemple} Traitement des rayons dun étage donné. \begin{exemple} Traitement des rayons dun étage donné.
@ -1057,21 +1129,21 @@ END;
\end{verbatim} \end{verbatim}
\end{exemple} \end{exemple}
\begin{exercice} Pourcentage de produits ayant un stock nul (une solution avec curseur et une sans). \begin{exercice} Caculer le pourcentage de produits ayant un stock nul. Proposer une solution avec curseur et une sans.
\end{exercice} \end{exercice}
\begin{exercice} Créer une table des produits classés par valeur du stock : No de produit, désignation, valeur du stock, classement. \begin{exercice} Créer une table des produits classés par valeur du stock : No de produit, désignation, valeur du stock, classement.
\end{exercice} \end{exercice}
\begin{exercice} Créer une table des produits qui nont pas de fournisseur et une table des produits qui en ont avec les noms de leurs fournisseurs. \begin{exercice} Créer une table des produits qui nont pas de fournisseur et une table des produits qui en ont avec les noms de leurs fournisseurs.
\end{exercice} \end{exercice}
\subsection{\code{UPDATE, DELETE ... WHERE CURRENT OF curseur}} \subsection{\code{UPDATE, DELETE ... WHERE CURRENT OF curseur}}
Lors du parcours d'une table (ou une vue modifiable) par Lors du parcours d'une table (ou une vue modifiable) par \code{FETCH}
\code{FETCH} à laide dun curseur, il est possible de demander à mettre à jour à laide dun curseur, il est possible de demander à mettre à jour ou
ou supprimer la ligne courante par la condition \code{WHERE CURRENT supprimer la ligne courante par la condition \code{WHERE CURRENT OF}
OF} nom du curseur. Le curseur doit avoir été déclaré \code{FOR nom du curseur. Le curseur doit avoir été déclaré \code{FOR UPDATE}
UPDATE}
\begin{verbatim} \begin{verbatim}
CURSOR r IS CURSOR r IS
@ -1088,61 +1160,10 @@ COMMIT;
entre deux exécutions qui voudraient écrire dans la même table. entre deux exécutions qui voudraient écrire dans la même table.
\begin{exercice} \begin{exercice}
augmenter de 10\% les produits de plus de 1000\euro{}, et de 5\% les autres. \'Ecrire un code \plsql{} qui augmenter de 10\% les produits de plus
de 1000\euro{}, et de 5\% les autres.
\end{exercice} \end{exercice}
Erreur utilisateur : \code{EXCEPTION, RAISE}
Le traitement de lanomalie doit être déclenché en passant dans la
partie \code{EXCEPTION} par \code{RAISE}.
\begin{verbatim}
DECLARE
...
nom_erreur EXCEPTION;
...
BEGIN
...
IF anomalie
THEN RAISE nom_erreur;
...
EXCEPTION
WHEN nom_erreur THEN
traitement à effectuer en cas danomalie;
END;
\end{verbatim}
Sortie du bloc après exécution du traitement.
\begin{exemple}
Accèder au stock dun produit de Numéro donné avec Erreur Oracle quand
le produit nexiste pas et Erreur utilisateur quand le stock est
nul. Les anomalies sont placées dans une table \code{terreur(z1
varchar2(30), z2 varchar2(30))}
\begin{verbatim}
DECLARE
...
stock_nul EXCEPTION;
dstock number;
...
BEGIN
SELECT stock INTO dstock FROM tproduit WHERE noproduit = &vnoproduit;
IF stock = 0
THEN RAISE stock_nul;
traitement quand le stock nest pas nul...
EXCEPTION
WHEN NO_DATA_FOUND THEN
INSERT INTO terreur VALUES (&vnoproduit, produit inconnu);
WHEN stock_nul THEN
INSERT INTO terreur VALUES (&vnoproduit, stock nul);
END;
\end{verbatim}
\end{exemple}
\begin{exercice} Pour remplacer lerreur Oracle par une erreur utilisateur, compter le nombre de produits ayant le numéro donné et déclencher une exception si ce nombre est nul.
\end{exercice}
\newpage \newpage
\begin{figure}[htb] \begin{figure}[htb]

Loading…
Cancel
Save