PL/SQL (Procedural Language / Structured Query Language) est un
\plsql{} (Procedural Language / Structured Query Language) est un
langage fondé sur les paradigmes de programmation procédurale et
langage fondé sur les paradigmes de programmation procédurale et
structurée. C'est un langage propriétaire, créé par Oracle et utilisé
structurée. C'est un langage propriétaire, créé par Oracle et utilisé
dans le cadre de bases de données relationnelles. Il permet de
dans le cadre de bases de données relationnelles. Il permet de
combiner des requêtes SQL et des instructions procédurales (boucles,
combiner des requêtes \sql{} et des instructions procédurales (boucles,
conditions...), dans le but de créer des traitements complexes
conditions...), dans le but de créer des traitements complexes
destinés à être stockés sur le serveur de base de données (objets
destinés à être stockés sur le serveur de base de données (objets
serveur), comme des procédures stockées ou des déclencheurs.
serveur), comme des procédures stockées ou des déclencheurs.
\section{Fichier de commandes SQL/PLUS}
\section{Fichier de commandes SQL}
SQL/Plus est un utilitaire en ligne de commande d'Oracle qui permet
\sql{} est un utilitaire en ligne de commande d'Oracle qui permet
aux utilisateurs d'exécuter interactivement des commandes SQL et
aux utilisateurs d'exécuter interactivement des commandes \sql{} et
PL/SQL. Il est ainsi possible de paramètrer les fichiers de commandes
\plsql{}. Il est ainsi possible de paramètrer les fichiers de commandes
SQL pour avoir plus d'interaction avec l'utilisateur.
\sql{} pour avoir plus d'interaction avec l'utilisateur.
\paragraph{Variables.}
\paragraph{Variables.}
Il possible de stocker des donn\'ees dans des variables. La commande
Il possible de stocker des donn\'ees dans des variables. La commande
\code{variable vnoproduit CHAR(6)} d\'eclare une variable appell\'ee
\code{variable vnoproduit CHAR(6)} d\'eclare une variable appell\'ee
\code{vnoproduit} de type cha\^ine de caract\`eres de longueur
\code{vnoproduit} de type cha\^ine de caract\`eres de longueur
$6$. Afin de se souvenir qu'une variable est d\'eclar\'ee par le mot
$6$. Afin de se souvenir qu'une variable est d\'eclar\'ee par le mot
cl\'e \code{variable}\`a l'ext\'erieur d'un bloc PL/SQL, il est
cl\'e \code{variable}\`a l'ext\'erieur d'un bloc \plsql{}, il est
conseill\'e de pr\'efixer les noms de ces variables par la lettre
conseill\'e de pr\'efixer les noms de ces variables par la lettre
\code{v}. Cette commande déclare une «bind variable» utilisable dans
\code{v}. Cette commande déclare une «bind variable» utilisable dans
une commande SQL. Les diff\'erents formats autorisés sont :
une commande SQL. Les diff\'erents formats autorisés sont :
@ -342,7 +343,7 @@ Afin d'interagir avec l'utilisateur, il existe deux types de commandes.
\section{Exécution du code PL/SQL}
\section{Exécution du code \plsql{}}
En SQL, les commandes sont transmises les unes après les autres et
En SQL, les commandes sont transmises les unes après les autres et
traitées séparément par le moteur SQL, comme le montre la
traitées séparément par le moteur SQL, comme le montre la
@ -377,7 +378,7 @@ Fichier de commandes SQL\\
\caption{}\label{fig:plsql1}
\caption{}\label{fig:plsql1}
\end{figure}
\end{figure}
En extension procédurale de SQL (\plsql{}), les blocs de commandes
En extension procédurale de \sql{} (\plsql{}), les blocs de commandes
sont transmis globalement au moteur SQL, comme le montre la
sont transmis globalement au moteur SQL, comme le montre la
Figure~\ref{fig:plsql2}.
Figure~\ref{fig:plsql2}.
@ -385,7 +386,7 @@ Figure~\ref{fig:plsql2}.
\begin{center}
\begin{center}
\begin{tikzpicture}
\begin{tikzpicture}
\node[draw] (a) at (0,1) {\begin{minipage}[h][3.25cm][t]{5cm}
\node[draw] (a) at (0,1) {\begin{minipage}[h][3.25cm][t]{5cm}
Bloc PL/SQL\\
Bloc \plsql{}\\
\code{BEGIN}\\
\code{BEGIN}\\
~~~~~~\code{SELECT} ...\\
~~~~~~\code{SELECT} ...\\
~\quad\code{IF} ... \code{THEN}\\
~\quad\code{IF} ... \code{THEN}\\
@ -418,7 +419,7 @@ Bloc PL/SQL\\
\end{tikzpicture}
\end{tikzpicture}
%\includegraphics[width=12cm]{plsql1.png}
%\includegraphics[width=12cm]{plsql1.png}
\end{center}
\end{center}
\caption{Interaction entre PL/SQL et SQL.}\label{fig:plsql2}
\caption{Interaction entre \plsql{} et SQL.}\label{fig:plsql2}
\end{figure}
\end{figure}
@ -474,9 +475,9 @@ set echo on
\faWarning{} Apr\`es la fin du bloc il faut imp\'erativement mettre :
\faWarning{} Apr\`es la fin du bloc il faut imp\'erativement mettre :
\begin{itemize}
\begin{itemize}
\item\code{.} : ce point indique la fin du mode PL/SQL,
\item\code{.} : ce point indique la fin du mode \plsql{},
\item\code{/} (seul sur une ligne) : cela déclenche l’exécution du
\item\code{/} (seul sur une ligne) : cela déclenche l’exécution du
bloc PL/SQL ou de l’ ordre SQL stocké dans le buffer.
bloc \plsql{} ou de l’ ordre \sql{} stocké dans le buffer.
\end{itemize}
\end{itemize}
@ -486,7 +487,7 @@ pour éviter que le système n’affiche des informations «polluant» le
résultat :
résultat :
\begin{itemize}
\begin{itemize}
\item\code{set echo off} évite que le système n’affiche la commande
\item\code{set echo off} évite que le système n’affiche la commande
du bloc PL/SQL au moment où il l’exécute,
du bloc \plsql{} au moment où il l’exécute,
\item\code{set verify off} évite que le système n’affiche l’opération
\item\code{set verify off} évite que le système n’affiche l’opération
de substitution au moment où il la fait,
de substitution au moment où il la fait,
\item\code{set feed off} évite que le système n’affiche le nombre de
\item\code{set feed off} évite que le système n’affiche le nombre de
@ -496,7 +497,7 @@ résultat :
\faWarning{}\plsql{} ne comprend pas d’instruction de saisie ou d’affichage.
\faWarning{}\plsql{} ne comprend pas d’instruction de saisie ou d’affichage.
\begin{exercice}
\begin{exercice}
\'Ecrire un fichier SQL qui permet d'afficher le message ``Entrer
\'Ecrire un fichier \sql{} qui permet d'afficher le message ``Entrer
votre age :'', de saisir l'\^age de l'utilisateur dans la variable
votre age :'', de saisir l'\^age de l'utilisateur dans la variable
\code{vage}, d'ajouter un \`a cette valeur et d'afficher ``Votre age
\code{vage}, d'ajouter un \`a cette valeur et d'afficher ``Votre age
plus un est 20 ans'' si $19$ est la valeur saisie par l'utilisateur
plus un est 20 ans'' si $19$ est la valeur saisie par l'utilisateur
@ -567,7 +568,7 @@ num\'ero de ligne attendant la suite de commande SQL.
\begin{minipage}[h][3cm][t]{10cm}
\begin{minipage}[h][3cm][t]{10cm}
\code{BEGIN}\\
\code{BEGIN}\\
\ \\
\ \\
Instructions PL/SQL et SQL\\
Instructions \plsql{} et \sql{}\\
Possibilit\'es de blocs imbriqu\'es\\
Possibilit\'es de blocs imbriqu\'es\\
\ \\
\ \\
(obligatoire)
(obligatoire)
@ -595,13 +596,15 @@ Traitements des erreurs, des cas particuliers\\
\section{Types de variables utilisés en \plsql{}}
\section{Types de variables utilisés en \plsql{}}
En \plsql{} les diff\'erents types possibles sont : \code{CHAR, NUMBER, DATE,
VARCHAR2}.
Variables locales déclarées dans \code{DECLARE} et il est important de
Variables locales déclarées dans \code{DECLARE} et il est important de
mettre le type adapt\'e en suivant la syntaxe suivante :
mettre le type adapt\'e en suivant la syntaxe suivante :
\verb+nom_variable type := valeur;+
\verb+nom_variable type := valeur;+
Les diff\'erents types possibles sont : \code{CHAR, NUMBER, DATE,
VARCHAR2}.
Il est n\'ecessaire de choisir le type \`a l'initialisation lors de la
Il est n\'ecessaire de choisir le type \`a l'initialisation lors de la
déclaration et aussi sa valeur intiale comme le montre les deux
déclaration et aussi sa valeur intiale comme le montre les deux
@ -625,7 +628,7 @@ Il est possible de cr\'eer des tableaux en \plsql{}. %
%%\item variables définies en langage hôte dans PRO*. Les variables de
%%\item variables définies en langage hôte dans PRO*. Les variables de
%% l’environnement sont toujours préfixées.
%% l’environnement sont toujours préfixées.
%\item
%\item
Les variables définies dans SQL*Plus par \code{VARIABLE} ou
Les variables définies dans \sql{} par \code{VARIABLE} ou
\code{ACCEPT} sont préfixées de : pour affectation, de "\verb+&+" pour
\code{ACCEPT} sont préfixées de : pour affectation, de "\verb+&+" pour
substitution.
substitution.
@ -643,7 +646,7 @@ from tproduit
where noproduit = dnoproduit;
where noproduit = dnoproduit;
\end{verbatim}
\end{verbatim}
Tableaux PL/SQL.
Tableaux \plsql{}.
Déclaration :
Déclaration :
@ -807,7 +810,7 @@ drop table tligne;
\end{verbatim}
\end{verbatim}
\end{exemple}
\end{exemple}
\begin{remarque} Le message d'erreur est initialisé juste avant la requête SQL qui risque de provoquer l'erreur; la méthode est à utiliser quand plusieurs requêtes SQL sont susceptibles de déclencher la même exception.
\begin{remarque} Le message d'erreur est initialisé juste avant la requête \sql{} qui risque de provoquer l'erreur; la méthode est à utiliser quand plusieurs requêtes \sql{} sont susceptibles de déclencher la même exception.
\end{remarque}
\end{remarque}
\begin{exercice}
\begin{exercice}
@ -918,7 +921,7 @@ END;
\begin{exercice} Mise en évidence des exceptions \verb+TOO_MANY_ROWS, OTHERS+
\begin{exercice} Mise en évidence des exceptions \verb+TOO_MANY_ROWS, OTHERS+
Pour mettre en évidence l’exception \verb+TOO_MANY_ROWS+, créez un
Pour mettre en évidence l’exception \verb+TOO_MANY_ROWS+, créez un
fichier de commandes SQL qui: demande un numéro de fournisseur, accède
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
aux N° des produits de ce fournisseur (par \code{select into}) retourne le
message ‘\code{le fournisseur n’a pas de produit}’ ou ‘\code{le fournisseur a plusieurs
message ‘\code{le fournisseur n’a pas de produit}’ ou ‘\code{le fournisseur a plusieurs
produits}’, ou le N° du produit s’il n’en a qu’un.
produits}’, ou le N° du produit s’il n’en a qu’un.
@ -1075,7 +1078,7 @@ permet d'avoir l'historique.
Lors de la première connexion modifier le mot de passe avec la
Lors de la première connexion modifier le mot de passe avec la
commande SQL : \verb+PASSWORD;+
commande \sql{} : \verb+PASSWORD;+
Ce qui est équivalent à :
Ce qui est équivalent à :
\verb+ALTER USER dupond IDENTIFIED BY password;+
\verb+ALTER USER dupond IDENTIFIED BY password;+
@ -1092,7 +1095,7 @@ Pour quitter sqlplus, il suffit de taper : \verb+quit;+
\paragraph{Mise en forme : }
\paragraph{Mise en forme : }
Sous SQL/PLUS :
Sous \sql{} :
\begin{verbatim}
\begin{verbatim}
Set linesize 150 -- positionne la taille d'une ligne
Set linesize 150 -- positionne la taille d'une ligne
Set pagesize 300 -- positionne le nombre de lignes avant de réafficher les entêtes
Set pagesize 300 -- positionne le nombre de lignes avant de réafficher les entêtes