diff --git a/COURS/PLSQL.tex b/COURS/PLSQL.tex index 2272440..57fae05 100644 --- a/COURS/PLSQL.tex +++ b/COURS/PLSQL.tex @@ -626,17 +626,8 @@ La dereni\`ere d\'eclaration de la variable \verb+dnoproduit+ avec le type \verb+tproduit.noproduit %type+ permet de prendre le m\^eme type que le champs \code{noproduit} de la table \code{tproduit}. -Il est possible de cr\'eer des tableaux en \plsql{}. % -%% Variables de l'environnement extérieur à \plsql{}: -%% \begin{itemize} -%% \item champs d'écran en SQL*Forms, -%% \item variables définies en langage hôte dans PRO*. Les variables de -%% l’environnement sont toujours préfixées. -%\item -% \end{itemize} - \begin{exemple} Exemple simple d'utilisation de variable. \begin{verbatim} dnoproduit := '&vnoproduit'; @@ -648,37 +639,62 @@ select designation into ddesignation from tproduit where noproduit = dnoproduit; \end{verbatim} +\end{exemple} -Tableaux \plsql{}. -Déclaration : +%% Variables de l'environnement extérieur à \plsql{}: +%% \begin{itemize} +%% \item champs d'écran en SQL*Forms, +%% \item variables définies en langage hôte dans PRO*. Les variables de +%% l’environnement sont toujours préfixées. +%\item -\begin{verbatim} -DECLARE -... -TYPE tchar4 IS TABLE OF CHAR(4) -INDEX BY BINARY_INTEGER ; -table_noprod tchar4 ; -p BINARY_INTEGER ; -\end{verbatim} -Utilisation : +% \end{itemize} + + +\paragraph{Tableaux \plsql{}.} + +Il est possible de cr\'eer des tableaux en \plsql{}. Pour cela il faut +d\'efinir un type avec la commande \verb+IS TABLE OF+ et +\verb+INDEX BY BINARY_INTEGER+. Ensuite il faut utiliser la syntaxe +adapt\'ee pour acc\'eder aux \'el\'ements du tableau ainsi cr\'e\'e. + +\begin{exemple} Exemple de cr\'eation et d'utilisation d'un tableau. \begin{verbatim} +DECLARE +TYPE tchar4 IS TABLE OF CHAR(4) INDEX BY BINARY_INTEGER; +table_noprod tchar4; +p BINARY_INTEGER; + BEGIN -... p := 1 ; table_noprod(p) := ‘p001’ ; +END; +. +/ \end{verbatim} \end{exemple} \section{Les traitements du bloc \code{BEGIN}} -\subsection{L'ordre SELECT :} + +Dans le bloc \plsql{}, il est possible de d'affecter les r\'esultats +de \code{SELECT} dans des varaibles, de faire des tests et de boucles. + +\subsection{SELECT ... INTO ...} + +Les r\'esultats monolignes des commandes \code{SELECT} peuvent \^etre +strock\'es dans des variables du m\^emes types gr\^ace au mot cl\'e +\code{INTO}. Par contre si un \code{SELECT} retourne plusieurs lignes +alors il n'est pas possible de stocker ce r\'esultat dans une +variable. Pour cela il faut utiliser un \emph{curseur} comme indiqu\'e +dans la section~\ref{sec:curseur}. + \begin{itemize} \item Syntaxe : \begin{verbatim} - SELECT coll, col2 - INTO var1, var2 + SELECT coll, col2 INTO var1, var2 FROM table [WHERE condition]; \end{verbatim} @@ -692,7 +708,7 @@ table_noprod(p) := ‘p001’ ; utiliser un curseur. \end{itemize} \end{itemize} - Les autres ordres de manipulation sont inchangés; des + Les autres ordres \sql{} de manipulation sont inchangés et des variables peuvent être utilisées : \begin{verbatim} INSERT INTO table VALUES(var1, ‘chaine’, 123, var2); @@ -700,31 +716,102 @@ UPDATE table SET col2 = var1 WHERE col1 = var2; \end{verbatim} \begin{exercice} - Nombre de fournisseurs d’un produit donné : le résultat sera écrit - dans une table \code{ligne}. Les tables utilis\'ees sont donn\'ees - dans la Figure~\ref{fig:bd}. +Calculer le nombre de fournisseurs d’un produit entr\'e par +l'utilisateur. Le résultat sera écrit dans une table +\code{Tlignes}. Les tables utilis\'ees sont donn\'ees dans la +Figure~\ref{fig:bd}. \end{exercice} -\subsection{Traitements conditionnels \code{IF...THEN...END IF;}} +\cache{ +variable vnoproduit char(4) + +PROMPT Saisir un numero de produit + +ACCEPT vnoproduit + +DECLARE + +dnbfournisseurs number; + +BEGIN + +SELECT COUNT(*) INTO dbfournisseurs FROM WHERE noproduit = \&vnoproduit; + +INSERT INTO Tlignes VALUES('Le nombre de fournisseur du produit' +||\&vnoproduit||' est '|| dnbfournisseurs); + +END; + +. + +/ +SELECT * FROM Tlignes; +} + +\subsection{Traitements conditionnels \code{IF ... THEN ... END IF;}} + + +Les opérateurs utilisés dans les conditions en \plsql{} sont les mêmes que dans \sql{} : + +\verb+ =, <, >, !=, >=, <=, IS NULL, IS NOT NULL, BETWEEN, LIKE, AND, OR, ...+ + +La syntaxe pour \'ecrire une condition est la suivante : + \begin{verbatim} IF condition1 THEN traitement1; ELSE traitement2; END IF; \end{verbatim} -Les opérateurs utilisés dans les conditions sont les même que dans SQL -: - -\verb+ =, <, >, !=, >=, <=, IS NULL, IS NOT NULL, BETWEEN, LIKE, AND, OR, ...+ - \begin{exercice} -Nombre de fournisseurs d’un produit donné : s’il n’y a pas de -fournisseur, compter le nombre de produits : il doit être $\geq 1$ ou -0. \'Ecrire dans une table de lignes soit le nombre de fournisseurs -soit le message ‘\code{le produit n’existe pas}’. +Calculer le nombre de fournisseurs d’un produit donné. S’il n’y a pas +de fournisseur, compter le nombre de produits : il doit être $\geq 1$ +ou 0. \'Ecrire dans une table de \code{Tlignes} soit le nombre de +fournisseurs soit le message ‘\code{le produit n’existe pas}’. \end{exercice} +\cache{ + +variable vnoproduit char(4) + +PROMPT Saisir un numero de produit + +ACCEPT vnoproduit + +DECLARE + +dnbfournisseur number; + +dnbproduit number; + +BEGIN + +SELECT COUNT(*) INTO dnbfournisseur FROM PRODUITFOURN WHERE noproduit = '\&vnoproduit'; + +IF dnbfournisseurs = 0 THEN + + SELECT COUNT(*) INTO dnbproduit FROM TPRODUIT WHERE noproduit = '\&vnoproduit'; + + END IF; + + IF dnbproduit = 0 THEN INSERT INTO Tlignes VALUES('Pas de produit'||'\&vnoproduit'); + +ELSE + +INSERT INTO Tlignes VALUES('Le nombre de fournisseur du produit' +||'\&vnoproduit'||' est '|| dnbfournisseur); + +END IF; + +END; + +. + +/ +SELECT * FROM Tlignes; +} + \subsection{Traitements répétitifs \code{WHILE ...LOOP ...END LOOP;}} La boucle \code{WHILE}: L'exécution de la boucle se fait tant @@ -937,7 +1024,7 @@ Modifiez le programme en remplaçant une des deux exceptions par \code{OTHERS}. \end{exercice} -\section{Les curseurs} +\section{Les curseurs}\label{sec:curseur} \subsection{\code{DECLARE, OPEN, FETCH, CLOSE}} Lorsqu’une requête \code{SELECT} est susceptible de délivrer plusieurs