Pascal LAFOURCADE 4 years ago
parent de12fe0c5c
commit ae3221c775

@ -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
%% lenvironnement 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
%% lenvironnement 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 dun produit donné : le résultat sera écrit Calculer le nombre de fournisseurs dun 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 dun produit donné : sil ny a pas de Calculer le nombre de fournisseurs dun produit donné. Sil ny 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 nexiste pas}. fournisseurs soit le message \code{le produit nexiste 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}}
Lorsquune requête \code{SELECT} est susceptible de délivrer plusieurs Lorsquune requête \code{SELECT} est susceptible de délivrer plusieurs

Loading…
Cancel
Save