Vous êtes sur la page 1sur 6

Ressource PL/SQL(Sous Oracle)

Objectifs :
 Syntaxe de création de bloc PL/SQL
 Syntaxe de déclaration de variables dans un programme PL/SQL.
 Syntaxe des structures de contrôles en PL/SQL.
 Syntaxe d’affichage en PL/SQL.
 Syntaxe de création des curseurs explicites.

1. Présentation
Le langage PL/SQL est une extension procédurale du langage SQL afin de permettre :
 L’utilisation des variables pour enchaîner l'exécution des commandes SQL
 L’exécution des commandes conditionnelles et itératives
 la programmation d'actions qui seront exécutées suite à la réalisation d'un
événement (programmation événementielle)
2. Syntaxe de création d’un Bloc PL/SQL:
/* section de déclaration */
BEGIN
/* corps du bloc de programme. Il s’agit de la seule zone dont la présence est obligatoire */
[EXCEPTION]
/* gestion des exceptions */
END;
/

3. Déclaration de variables:
a. Déclaration de variables de type simple :

L’utilisation des variables est diverse; elles peuvent servir à stocker des données récupérées
dans les colonnes de tables, ou à conserver des résultats de calculs internes au programme.
Les variables peuvent être scalaires (une valeur simple) ou composées (de valeurs ou
composants divers).

 La déclaration d’une variable se fait par association du nom de la variable à un type


sous la forme :
nom_variable type;

 Il est aussi possible de déclarer une variable par référence à une colonne d’une table,
par la notation %TYPE :
nom_variable nom_table.nom_colonne%type;

 Déclaration de constantes :
Nom_constatnt CONSTANT type :=expression;

Ing Base de Données A.U.21/22 Page 1 sur 6


Exemple: DECLARE
v_nompilote pilote.nom%TYPE ; -- type implicite
ancien_vol NUMBER ; -- type explicite
autre_vol NUMBER DEFAULT 0 ; -- initialisation à 0
x constant NUMBER:=3 ; -- déclaration de constantes

b. Déclaration de variables de type composé :

 Déclaration de variable composée qui fait référence à une table : en utilisant la


notion %ROWTYPE, cette variable représente une ligne dans la table spécifiée.

Nom_varibale nom_table%ROWTYPE;

Exemple: info_pilote pilote%ROWTYPE;

Et les deux types composés TABLE et RECORD qui doivent tout d’abord faire l’objet d’une
déclaration préalable de type de données. Ensuite seulement, une table ou un record PL/SQL
peuvent être déclarés comme correspondant au type en question.

 Déclaration du type enregistrement (RECORD) :


TYPE nom_type IS RECORD (nom_champ type_champ…) ;
nom_variable nom_type ;

Exemple : TYPE t_pilote IS RECORD(nom_pilote pilote.nom%type , revenu_pilote


number(8,2)) ;
Employe t_pilote ; -- Déclaration de la variable de type
enregistrement
 Déclaration du type table (TABLE) :
C’est la déclaration d’une table qui ne comporte qu’une seule colonne :

TYPE nom_type IS TABLE OF TYPE [NOT NULL] INDEX BY BINARY_INTEGER;

Exemple : TYPE t_nom IS TABLE OF CHAR(35) INDEX BY BINARY_INTEGER ;


Table_nom t_nom ; -- Déclaration de la variable de type table

4. La syntaxe SELECT sous PLSQL :


Il existe deux façons d’affecter des valeurs à des variables. La première utilise l’opérateur
d’assignation, le signe « := ». La deuxième façon d’attribuer des valeurs à des variables
consiste à effectuer un SELECT de valeurs en provenance de la base de données :

SELECT Val1 [, Val2,…] INTO Var1 [,Var2,…] FROM Nom_Table [Where PREDICAT];
Attention : L’ordre SELECT doit rapporter une seule ligne, sans quoi une erreur est générée.

Ing Base de Données A.U.21/22 Page 2 sur 6


Exemple :
Declare
U_Nom pilote.Nom%type ;
U_sal pilote.sal%type ;
Begin Select nom, sal INTO U_Nom, U_sal FROM Pilote WHERE
nopilot=7100;
End;
/
5. Structures de contrôle PL/SQL
Comme n’importe quel langage procédural, PL/SQL possède un certain nombre de structures
de contrôles évoluées comme les branchements conditionnels et les boucles.

 Les branchements conditionnels

IF <condition> THEN Exemples :


--bloc ALORS IF nom nopilot=17600 then
[ELSIF <condition2> THEN salaire := sal;
-- bloc DANS CE CAS ALORS 2 Elsif nom like ’PIC%’ then
[ELSIF <condition3> THEN salaire := sal*4;
-- bloc DANS CE CAS ALORS 3 Else
... ]] salaire := sal*2;
[ELSE -- bloc SINON] End if;
END IF;

 Boucles PL/SQL : admet trois sortes de boucles.


 LOOP Exemple:
instructions;  I :=0 ;
EXIT WHEN <condition>; /*instruction de sortie*/ loop
END LOOP; i := i + 1;
Au moins une des instructions du corps de la boucle exit when i=1000;
doit être une instruction de sortie end loop;

Exemple:
 FOR <compteur> IN [REVERSE] <Borne_inf> ..  for i in reverse 1 .. 1000
<Borne_sup> loop
instructions; j := j + 2*i;
END LOOP; end loop;
 WHILE <condition> LOOP  i := 0;
instructions; while i < 1000 loop
END LOOP; i := i + 1;
end loop;

Ing Base de Données A.U.21/22 Page 3 sur 6


6. Sortie à l’écran
 Pour afficher un message à l’écran : DBMS_OUTPUT.PUT_LINE(‘texte_mess’);

 Pour afficher le contenu d’une variable on utilise:

DBMS_OUTPUT.PUT_LINE(nom_var);

 L’affichage d’un message suivi de l’affichage du contenu d’une variable:


DBMS_OUTPUT.PUT_LINE(‘texte_mess’ || nom_var);
 L’affichage ne sera visualisé que lorsque l’ordre SQL suivant est exécuté dans
l’environnement SQL+:

SQL> SET SERVEROUTPUT ON;

Exemple:
SET SERVEROUTPUT ON;
Declare
U_Nom pilote.Nom%type ;
U_sal pilote.sal%type ;
Begin Select nom, sal INTO U_Nom, U_sal FROM Pilote WHERE nopilot=7100;
DBMS_OUTPUT.PUT_LINE(‘Nom du pilote’ || U_Nom||’, salaire’|| U_sal);
End;
/
7. Curseur
a) Définition :
Les curseurs sont des zones tampon utilisées pour tout SELECT multi-ligne.
A chaque ordre SELECT on associe un curseur nommé et on y fait référence dans la suite du
programme pour traiter les lignes les unes après les autres jusqu'à la fin de la table. Chaque
accès à un curseur incrémente un pointeur dans l'ensemble des lignes résultats.

On a deux types de curseurs :


 curseur implicite : créé et géré par Oracle à chaque ordre SQL
 curseur explicite : créé et géré par l'utilisateur afin de pouvoir traiter un
ordre SELECT qui retourne plusieurs lignes.
b) Curseur implicite :

Un curseur implicite est créé pour toute opération de LMD, et toute requête SQL retournant
une seule ligne, dont le résultat sera affecté à des variables.

Attributs d’un curseurs implicite

• SQL%ROWCOUNT (type entier) : renvoie le nombre de lignes affectées par le


dernier ordre SQL

Ing Base de Données A.U.21/22 Page 4 sur 6


• SQL%FOUND (type Booléen) : renvoie TRUE si le dernier ordre SQL affecte au moins
une ligne

• SQL%NOTFOUND (type Booléen ): renvoie TRUE si le dernier ordre SQL n’affecte


aucune ligne

• SQL%ISOPEN Toujours FALSE pour les curseurs implicites.

Exemple:
DECLARE
V_Rows_Updated NUMBER;
BEGIN
UPDATE EMP SET sal = sal*1.1 WHERE deptno = 10;
V_Rows_Updated := SQL%ROWCOUNT; -- SQL%ISOPEN est FALSE
INSERT INTO History_Tab Values (‘Dept 10’, V_Rows_Updated, SYSDATE);
END ;
/

c) Curseur explicite :

Un curseur explicite est créé par le programmeur pour gérer le résultat d’une requête
SELECT retournant plusieurs lignes

Syntaxe :

DECLARE
CURSOR <Nom_Curseur> IS
SELECT . . . From;
Var1 type ;
Var2 Type ;
BEGIN
OPEN <Nom_Curseur>;
LOOP
FETCH <Nom_Curseur> INTO var1, var2, . . .;
EXIT WHEN <Nom_Curseur>%NOTFOUND;
<traitement>
END LOOP;
CLOSE <Nom_Curseur>;
END;
/

Utilisation du curseur :

L'utilisation d'un curseur explicite nécessite 4 étapes : déclaration du curseur, ouverture du


curseur, traitement des lignes et fermeture du curseur.

Ing Base de Données A.U.21/22 Page 5 sur 6


 Déclaration du curseur :
CURSOR nom_curseur IS instruction_select ;

 Ouverture du curseur :

Après avoir déclaré le curseur, il faut l'ouvrir dans la section exécutable (BEGIN) afin de faire
exécuter l'ordre SELECT :
OPEN nom_curseur ;

 Traitement des lignes :

Après l'exécution du SELECT, les lignes ramenées sont traitées une par une, la valeur de
chaque colonne du SELECT doit être stockée dans une variable réceptrice.

FETCH nom_curseur INTO liste_variables ;

FETCH ramène une seule ligne ; pour traiter n lignes, prévoir une boucle.

 Fermeture du curseur :

Après le traitement des lignes, pour libérer la place mémoire. CLOSE nom_curseur ;

Les attributs d’un curseur explicite:

Chaque curseur possède quatre attributs :

 %FOUND Génère un booléen VRAI lorsque le FETCH réussi (données lues)


 %NOTFOUND Inverse de %FOUND (généralement plus utilisé que %FOUND)
 %ISOPEN Génère un booléen VRAI lorsque le curseur spécifié en argument est
ouvert.
 %ROWCOUNT Renvoie le nombre de lignes contenues.

Chaque attribut s’utilise en étant préfixé par le nom du curseur :

nom_curseur%ATTRIBUT

Ing Base de Données A.U.21/22 Page 6 sur 6

Vous aimerez peut-être aussi