|
|
@ -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
|
|
|
|
type \verb+tproduit.noproduit %type+ permet de prendre le m\^eme type
|
|
|
|
que le champs \code{noproduit} de la table \code{tproduit}.
|
|
|
|
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{exemple} Exemple simple d'utilisation de variable.
|
|
|
|
\begin{verbatim}
|
|
|
|
\begin{verbatim}
|
|
|
|
dnoproduit := '&vnoproduit';
|
|
|
|
dnoproduit := '&vnoproduit';
|
|
|
@ -648,37 +639,62 @@ select designation into ddesignation
|
|
|
|
from tproduit
|
|
|
|
from tproduit
|
|
|
|
where noproduit = dnoproduit;
|
|
|
|
where noproduit = dnoproduit;
|
|
|
|
\end{verbatim}
|
|
|
|
\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}
|
|
|
|
\begin{verbatim}
|
|
|
|
|
|
|
|
DECLARE
|
|
|
|
|
|
|
|
TYPE tchar4 IS TABLE OF CHAR(4) INDEX BY BINARY_INTEGER;
|
|
|
|
|
|
|
|
table_noprod tchar4;
|
|
|
|
|
|
|
|
p BINARY_INTEGER;
|
|
|
|
|
|
|
|
|
|
|
|
BEGIN
|
|
|
|
BEGIN
|
|
|
|
...
|
|
|
|
|
|
|
|
p := 1 ;
|
|
|
|
p := 1 ;
|
|
|
|
table_noprod(p) := ‘p001’ ;
|
|
|
|
table_noprod(p) := ‘p001’ ;
|
|
|
|
|
|
|
|
END;
|
|
|
|
|
|
|
|
.
|
|
|
|
|
|
|
|
/
|
|
|
|
\end{verbatim}
|
|
|
|
\end{verbatim}
|
|
|
|
\end{exemple}
|
|
|
|
\end{exemple}
|
|
|
|
|
|
|
|
|
|
|
|
\section{Les traitements du bloc \code{BEGIN}}
|
|
|
|
\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}
|
|
|
|
\begin{itemize}
|
|
|
|
\item Syntaxe :
|
|
|
|
\item Syntaxe :
|
|
|
|
\begin{verbatim}
|
|
|
|
\begin{verbatim}
|
|
|
|
SELECT coll, col2
|
|
|
|
SELECT coll, col2 INTO var1, var2
|
|
|
|
INTO var1, var2
|
|
|
|
|
|
|
|
FROM table
|
|
|
|
FROM table
|
|
|
|
[WHERE condition];
|
|
|
|
[WHERE condition];
|
|
|
|
\end{verbatim}
|
|
|
|
\end{verbatim}
|
|
|
@ -692,7 +708,7 @@ table_noprod(p) := ‘p001’ ;
|
|
|
|
utiliser un curseur.
|
|
|
|
utiliser un curseur.
|
|
|
|
\end{itemize}
|
|
|
|
\end{itemize}
|
|
|
|
\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 :
|
|
|
|
variables peuvent être utilisées :
|
|
|
|
\begin{verbatim}
|
|
|
|
\begin{verbatim}
|
|
|
|
INSERT INTO table VALUES(var1, ‘chaine’, 123, var2);
|
|
|
|
INSERT INTO table VALUES(var1, ‘chaine’, 123, var2);
|
|
|
@ -700,31 +716,102 @@ UPDATE table SET col2 = var1 WHERE col1 = var2;
|
|
|
|
\end{verbatim}
|
|
|
|
\end{verbatim}
|
|
|
|
|
|
|
|
|
|
|
|
\begin{exercice}
|
|
|
|
\begin{exercice}
|
|
|
|
Nombre de fournisseurs d’un produit donné : le résultat sera écrit
|
|
|
|
Calculer le nombre de fournisseurs d’un produit entr\'e par
|
|
|
|
dans une table \code{ligne}. Les tables utilis\'ees sont donn\'ees
|
|
|
|
l'utilisateur. Le résultat sera écrit dans une table
|
|
|
|
dans la Figure~\ref{fig:bd}.
|
|
|
|
\code{Tlignes}. Les tables utilis\'ees sont donn\'ees dans la
|
|
|
|
|
|
|
|
Figure~\ref{fig:bd}.
|
|
|
|
\end{exercice}
|
|
|
|
\end{exercice}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
\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;}}
|
|
|
|
\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}
|
|
|
|
\begin{verbatim}
|
|
|
|
IF condition1 THEN traitement1;
|
|
|
|
IF condition1 THEN traitement1;
|
|
|
|
ELSE traitement2;
|
|
|
|
ELSE traitement2;
|
|
|
|
END IF;
|
|
|
|
END IF;
|
|
|
|
\end{verbatim}
|
|
|
|
\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}
|
|
|
|
\begin{exercice}
|
|
|
|
Nombre de fournisseurs d’un produit donné : s’il n’y a pas de
|
|
|
|
Calculer le nombre de fournisseurs d’un produit donné. S’il n’y a pas
|
|
|
|
fournisseur, compter le nombre de produits : il doit être $\geq 1$ ou
|
|
|
|
de fournisseur, compter le nombre de produits : il doit être $\geq 1$
|
|
|
|
0. \'Ecrire dans une table de lignes soit le nombre de fournisseurs
|
|
|
|
ou 0. \'Ecrire dans une table de \code{Tlignes} soit le nombre de
|
|
|
|
soit le message ‘\code{le produit n’existe pas}’.
|
|
|
|
fournisseurs soit le message ‘\code{le produit n’existe pas}’.
|
|
|
|
\end{exercice}
|
|
|
|
\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;}}
|
|
|
|
\subsection{Traitements répétitifs \code{WHILE ...LOOP ...END LOOP;}}
|
|
|
|
|
|
|
|
|
|
|
|
La boucle \code{WHILE}: L'exécution de la boucle se fait tant
|
|
|
|
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}
|
|
|
|
\end{exercice}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
\section{Les curseurs}
|
|
|
|
\section{Les curseurs}\label{sec:curseur}
|
|
|
|
\subsection{\code{DECLARE, OPEN, FETCH, CLOSE}}
|
|
|
|
\subsection{\code{DECLARE, OPEN, FETCH, CLOSE}}
|
|
|
|
|
|
|
|
|
|
|
|
Lorsqu’une requête \code{SELECT} est susceptible de délivrer plusieurs
|
|
|
|
Lorsqu’une requête \code{SELECT} est susceptible de délivrer plusieurs
|
|
|
|