1. Université Constantine 2
Raida ElMansouri
Faculté des NTIC
Raida.elmansouri@univ-constantine2.dz
Bases de données multimedia
Semestre 1
Le langage PL/ SQL
2. Université Constantine 2
Comparaison avec SQL
• Le PL de PL/SQL signifie Procedural Language.
• Il s’agit d’une extension procédurale du SQL permettant d’effectuer
des traitements complexes sur une base de données.
• Un script écrit en PL/SQL se termine obligatoirement par un /, sinon
SQL+ ne l’interprète pas.
• S’il contient des erreurs de compilation, il est possible d’afficher les
messages d’erreur avec la commande SQL+ : SHOW ERRORS.
2
3. Université Constantine 2
Blocs
Un programme PL/SQL ou bloc simple PL/SQL est composé de trois
sections.
•Une section de déclaration de variables optionnelle.
•Une section exécutable obligatoire qui doit commencer par
Begin et se terminer par END
•Une section Exception optionnelle pour la gestion des erreurs.
[ DECLARE] -
déclaration de variables, constantes, curseurs,…
BEGIN
instructions à executer
[ EXCEPTION ]
- Traitements à effectuer lors d'erreurs
END ;
3
4. Université Constantine 2
Affichage
Pour afficher le contenu d’une variable, on utilise les procédures
DBMS OUTPUT.PUT() et DBMS OUTPUT.PUT LINE().
Par défaut, les fonctions d’affichage sont désactivées. On les
active avec la commande SET SERVEROUTPUT ON.
Les Variables
Une variable se déclare de la sorte :
nom type [:= initialisation ] ; L’initiation est optionnelle
SET SERVEROUTPUT ON
DECLARE
c varchar2 (15) := ’ free Palestine’ ;
BEGIN
DBMS_OUTPUT.PUT_LINE ( c ) ;
END;
/
4
5. Université Constantine 2
Types de Variables
• Variables locales:
• De type simple: type de base ou booléen
• Faisant référence à la métabase
• De type composé: Tableau, Record
• Variables Extérieures:
• Variables d’un langage hote (ex: C) (préfixés par :)
• Paramètres (ex: SQL interactif par &)
• Champs d’écrans (Forms)
5
6. Université Constantine 2
Variables de type Simple
Declare
nom char(15);
salaire number(7,2);
embauche DATE ;
réponse boolean;
Déclarations multiples interdites :
i, j integer;
6
7. Université Constantine 2
Variables
• Identificateurs Oracle : 30 caractères au plus
• Commence par une lettre
• Peut contenir lettres, chiffres, _, $ et #
• Pas sensible à la casse
•Si une variable porte le même nom qu’une colonne d’une table,
c’est la colonne qui l’emporte.
Pour éviter ça, le plus simple est de ne pas donner de nom de
colonne à une variable !
7
8. Université Constantine 2
Variables sur la métabase
• Reprend
• Soit le même type qu’une colonne dans une table
nom_var1 table.colonne%TYPE
• Soit la même structure qu’une ligne dans une table
nom_var2 table%ROWTYPE
• Soit le même type qu’une variable précédemment définie
nom_vars3 nom_var1%TYPE
• Exemples:
nom F.Fnom%TYPE;
enreg F%ROWTYPE;
commi number(7,2);
Salaire commi%TYPE;
8
9. Université Constantine 2
Affectation
Il ya plusieurs façons d’assigner une valeur à une variable :
• Par la directive INTO d’une requête SELECT ne renvoyant
qu’une seule ligne de résultat.
•Par le symbole :=
Exemples :
• n char(20) := ’Mouad’;
•select nomF INTO nom from F where id_f = ‘F1’;
9
10. Université Constantine 2
Modification de données
• Les requêtes SQL (insert, update, delete,…) peuvent
utiliser les variables PL/SQL
• Les commit et rollback doivent être explicites ; aucun
n’est effectué automatiquement à la sortie d’un bloc
10
11. Université Constantine 2
Modification de données
DECLARE
v_F F%ROWTYPE
v_nom F.Fnom%TYPE;
BEGIN
v_nom := ‘Omar';
insert into F (id_f, Fnom) values(‘F50’ ; v_nom);
v_F.id_F := ‘F51’;
v_F.nomF := 'Dounia';
insert into F (d_f, nomF) values(v_F.id_f, v_F.nomF);
commit;
END;
11
12. Université Constantine 2
Traitements conditionnels
• Le IF et le CASE fonctionnent de la même façon que dans les autres langages impératifs :
IF /∗ c o n d i t i o n 1 ∗/ THEN
/∗ i n s t r u c t i o n s 1 ∗/
ELSE
/∗ i n s t r u c t i o n s 2 ∗/
END IF ;
IF /∗ c o n d i t i o n 1 ∗/ THEN
/∗ i n s t r u c t i o n s 1 ∗/
ELSIF /∗ c o n d i t i o n 2 ∗/
/∗ i n s t r u c t i o n s 2 ∗/
ELSE
/∗ i n s t r u c t i o n s 3 ∗/
CASE /∗ v a r i a b l e ∗/
WHEN /∗ v a l e u r 1 ∗/ THEN
/∗ i n s t r u c t i o n s 1 ∗/
WHEN /∗ v a l e u r 2 ∗/ THEN
/∗ i n s t r u c t i o n s 2 ∗/
. . .
WHEN /∗ v a l e u r n ∗/ THEN
/∗ i n s t r u c t i o n s n ∗/
ELSE
/∗ i n s t r u c t i o n s par d´e f a u t ∗/
END CASE;
12
13. Université Constantine 2
Traitements répétitifs
LOOP ... END LOOP ; permet d’implémenter les boucles
LOOP
/ i n s t r u c t i o n s /
END LOOP ;
L’instruction EXIT WHEN permet de quitter une boucle.
LOOP
/ i n s t r u c t i o n s /
EXIT WHEN / c o n d i t i o n / ;
END LOOP ;
La boucle FOR existe aussi en PL/SQL, ainsi que la boucle WHILE :
FOR / v a r i a b l e / IN / i n f / . . /
sup / LOOP
/ i n s t r u c t i o n s /
END LOOP ;
WHILE / c o n d i t i o n / LOOP
/ i n s t r u c t i o n s /
END LOOP ;
13
14. Université Constantine 2
Tableaux
• Création D’un tableau
Les types tableau doivent être définis explicitement par une déclaration de la forme:
TYPE / type / IS VARRAY ( / t a i l l e / ) OF / typeElements / ;
• type est le nom du type tableau crée par cette instruction
• taille est le nombre maximal d’eléments qu’il est possible de placer dans le
tableau.
• typeElements est le type des éléments qui vont être stockés dans le tableau, il
peut s’agir de n’importe quel type. Par exemple:
TYPE numberTab IS VARRAY (10) OF NUMBER;
14
15. Université Constantine 2
Tableaux
• Déclaration d’un tableau
le type d’un tableau peut être utilisé au même titre que NUMBER ou
VARCHAR2. Par exemple, un tableau appelé t de type numberTab,
DECLARE
TYPE numberTab IS VARRAY (10) OF
NUMBER;
t numberTab ;
BEGIN
/ i n s t r u c t i o n s /
END;
/
15
16. Université Constantine 2
Allocation d’un tableau
DECLARE
TYPE numberTab IS VARRAY (10) OF NUMBER;
t numberTab ;
BEGIN
t := numberTab ( ) ;
/∗ u t i l i s a t i o n du t a b l e a u ∗/
END;
/
Le tableau retourne par le constructeur est vide. Il faut réserver de l’espace pour stocker
les éléments qu’il va contenir. On utilise la méthode EXTEND().
Exemple:
DECLARE
TYPE numberTab IS VARRAY (10) OF NUMBER;
t numberTab ;
BEGIN
t := numberTab ( ) ;
t . EXTEND ( 4 ) ;
/∗ u t i l i s a t i o n du t a b l e a u ∗/
END;
/
16
17. Université Constantine 2
Utilisation d’un tableau
• On accède, en lecture et en écriture, au i-eme élément d’un tableau nommé T avec
l’instruction T(i). Les éléments sont indices à partir de 1.
Exemple: Une permutation circulaire vers la droite des éléments du tableau t.
DECLARE
TYPE numberTab IS VARRAY (10) OF NUMBER;
t numberTab ;
i number;
k number;
BEGIN
t := numberTab ( ) ;
t . EXTEND ( 1 0 ) ;
FOR i IN 1 . . 1 0 LOOP
t( i) := i ;
END LOOP ;
k := t ( 1 0 ) ;
FOR i in REVERSE 2 . . 1 0 LOOP
t( i) := t( i − 1 ) ;
END LOOP ;
t (1) := k ;
FOR i IN 1 . . 1 0 LOOP
DBMS_OUTPUT . PUT_LINE ( t( i ) ) ;
END LOOP ;
END;
/
17
18. Université Constantine 2
Structures
Un structure est un type regroupant plusieurs types. Une variable de type structuré
contient plusieurs variables, ces variables s’appellent aussi des champs.
On définit un type structure de la sorte :
TYPE / nomType / IS RECORD
(
/ l i s t e des champs /
) ;
TYPE point IS RECORD
(
abscisse NUMBER,
ordonnee NUMBER
) ;
Exemple:
Pour déclarer une variable p de type point.
p point ;
18
19. Université Constantine 2
Structures
• Pour accéder a un champ d’une variable de type structuré, en lecture
ou en écriture, on utilise la notation pointée. Par exemple:
DECLARE
TYPE point IS RECORD
(
abscisse NUMBER,
ordonnee NUMBER
) ;
p point ;
BEGIN
p . abscisse := 1 ;
p . ordonnee := 3 ;
DBMS_OUTPUT . PUT_LINE ( ’p . abscisse = ’ | | p . abscisse | |
’ and p . ordonnee =’ | | p . ordonnee ) ;
END;
/
19
20. Université Constantine 2
Procédures
CREATE OR REPLACE PROCEDURE / nom / ( / parametres / ) IS
/ d e c l a r a t i o n des v a r i a b l e s l o c a l e s /
BEGIN
/ i n s t r u c t i o n s /
END;
On définit une procédure de la sorte:
Par exemple, la procédure suivante affiche un compte à rebours.
CREATE OR REPLACE PROCEDURE compteARebours ( n NUMBER) IS
BEGIN
IF n >= 0 THEN
DBMS_OUTPUT. PUT_LINE (n) ;
compteARebours (n -1) ;
END IF ;
END;
/
Pour invoquer une procdure, on utlise Call:
Call compteARebours(10);
20
21. Université Constantine 2
Fonctions
CREATE OR REPLACE FUNCTION / nom / ( / parametres / ) RETURN / type / IS
/ d e c l a r a t i o n des v a r i a b l e s l o c a l e s /
BEGIN
/ i n s t r u c t i o n s /
END;
• On crée une fonction de la façon suivante :
• L’instruction RETURN sert à retourner une valeur. Par exemple:
CREATE OR REPLACE FUNCTION module ( a NUMBER, b NUMBER) RETURN NUMBER IS
BEGIN
IF a < b THEN
RETURN a ;
ELSE
RETURN module( a−b , b );
END IF ;
END;
/
21
Pour invoquer une fonction, on passe par une pseudo-table nommée DUAL de la façon
suivante : SELECT module(21 , 12) FROM DUAL ;
22. Université Constantine 2
Recherche de données avec un curseur
• Les instructions de type SELECT ... INTO ... manquent de souplesse, elles ne
fonctionnent que sur des requêtes retournant une et une seule valeur.
• Définition
• Un curseur est un mécanisme permettant de rechercher un nombre
arbitraire de lignes avec une instruction SELECT.
• Déclaration
Un curseur se déclare dans une section DECLARE :
CURSOR / nomcurseur / IS / r e q uˆe t e / ;
Par exemple, si on veut récupérer tous les produits de la table Prod, on déclare le
curseur suivant:
CURSOR Prod_cur IS
SELECT FROM Prod ;
22
23. Université Constantine 2
Ouverture
On ouvre un curseur dans une section BEGIN :
OPEN / nomcurseur / ;
Par exemple:
DECLARE
CURSOR prod_cur IS
SELECT FROM Prod ;
BEGIN
OPEN prod_cur ;
/ U t i l i s a t i o n du curseur /
END;
Lecture d’une ligne
Une fois ouvert, le curseur contient toutes les lignes du résultat de la requête On les
récupère une par une en utilisant le mot-clé FETCH :
FETCH / nom curseur / INTO / l i s t e v a r i a b l e s / ;
23
24. Université Constantine 2
Lecture d’une ligne
• La liste de variables peut être remplacée par une structure de type nom
curseur%ROWTYPE. Si la lecture de la ligne échoue, parce qu’il n’y a plus de
lignes à lire, l’attribut %NOTFOUND prend la valeur vrai.
DECLARE
CURSOR prod_cur IS
SELECT FROM prod ;
ligne prod_cur%rowtype;
BEGIN
OPEN prod_cur ;
LOOP
FETCH prod_cur INTO ligne ;
EXIT WHEN prod_cur%NOTFOUND ;
DBMS_OUTPUT . PUT_LINE ( ligne.pnom) ;
END LOOP ;
/ . . . /
END;
24
25. Université Constantine 2
Fermeture
Après utilisation, il convient de fermer le curseur.
CLOSE / nomcurseur / ;
DECLARE
CURSOR prod_cur IS
SELECT FROM prod ;
ligne prod_cur%rowtype;
BEGIN
OPEN prod_cur ;
LOOP
FETCH prod_cur INTO ligne ;
EXIT WHEN prod_cur%NOTFOUND ;
DBMS_OUTPUT. PUT_LINE ( ligne.pnom) ;
END LOOP ;
CLOSE Prod_cur ;
END;
/
25
26. Université Constantine 2
Le programme ci-dessus peut aussi s'écrire
• DECLARE
CURSOR prod_cur IS
SELECT FROM prod ;
ligne prod_cur%rowtype ;
BEGIN
OPEN prod_cur ;
FETCH prod_cur INTO ligne ;
WHILE prod_cur%FOUND LOOP
DBMS_OUTPUT . PUT_LINE ( ligne . pnom) ;
FETCH prod_cur INTO ligne ;
END LOOP ;
CLOSE prod_cur ;
END;
26
27. Université Constantine 2
Boucle FOR
• Il existe une boucle FOR se chargeant de l’ouverture, de la lecture des
lignes du curseur et de sa fermeture,
FOR ligne IN emp_cur LOOP
/ Traitement /
END LOOP ;
• Par exemple:
DECLARE
CURSOR prod_cur IS
SELECT FROM prod ;
ligne prod_cur%rowtype ;
BEGIN
FOR ligne IN prod_cur LOOP
DBMS_OUTPUT.PUT_LINE ( ligne.pnom ) ;
END LOOP ;
END;
/
27
28. Université Constantine 2
Curseurs paramétrés
• Définition
Un curseur paramétré est un curseur dont la requête contient des variables
dont les valeurs ne seront fixées qu’à l’ouverture.
• Déclaration
On précise la liste des noms et des type des paramètres entre parenthèses
après le nom du curseur :
CURSOR / nom / ( / l i s t e des paramètres / ) IS / requête /
Par exemple, créerons une requête qui, pour un produit donné, nous donne
son nom et sa couleur :
CURSOR prod_cur ( id prod.id_p%type) IS
SELECT pnom, couleur
FROM prod
WHERE id_p = id;
28
29. Université Constantine 2
Ouvèrture
• On ouvre un curseur paramétré en passant en paramètre les valeurs des variables
OPEN / nom / ( / l i s t e des paramètres / )
OPEN prod_cur( ‘p1’ ) ;
Lecture d’une ligne, fermeture
• la lecture d’une ligne suit les mêmes règles qu’avec un curseur non paramétré.
• La boucle FOR se charge de l’ouverture, les paramètres sont placés dans l’entête de la
boucle,
FOR / v a r i a b l e / IN / nom / ( / l i s t e param`etres / ) LOOP
/ i n s t r u c t i o n s /
END LOOP ;
Par exemple: FOR / v a r i a b l e / IN / nom / ( / l i s t e parametres / )
LOOP
/ i n s t r u c t i o n s /
END LOOP ;
29
30. Université Constantine 2
Exemple
-Nombre de livraisons faites pour un produit donné :
create or replace procedure compteurDeLivraisons(ID Prod.ID_P%type) is
CURSOR prod_cur2(id prod.id_p%type) IS
SELECT * FROM puf
where id_p=id;
ligne prod_cur2%rowtype ;
co number;
BEGIN
co:=0;
FOR ligne IN prod_cur2(id) LOOP
co:=co+1;
END LOOP ;
DBMS_OUTPUT.PUT_LINE (co) ;
END;
/
call compteurDeLivraisons('P1');
30
31. Université Constantine 2
Exceptions
• Une exception est une “erreur type”. Elle porte un nom
EXCEPTION
WHEN E1 THEN
/ t r a i t e m e n t /
WHEN E2 THEN
/ t r a i t e m e n t /
WHEN E3 THEN
/ t r a i t e m e n t /
WHEN OTHERS THEN
/ t r a i t e m e n t /
END;
31
32. Université Constantine 2
Exceptions Prédéfinies
• DUP_VAL_ON_INDEX
• Lorsqu’une instruction SQL tente de créer une valeur dupliquée dans une
colonne sur laquelle un index unique a été défini
• INVALID_NUMBER
• Lorsqu’une instruction SQL spécifie un nombre invalide
• NO_DATA_FOUND
• Lorsqu’une instruction Select ne retourne aucune ligne
• TOO_MANY_ROWS
• Une instruction Select ne peut pas renvoyer plus d’une ligne sans provoquer
l’exception TOO_MANY_ROWS
• VALUE_ERROR
• Provoquée dans des situations d’erreur résultant de valeurs tronquées ou
converties
32
33. Université Constantine 2
Exemple
DECLARE
num Char(4);
nom VARCHAR2(30) := ’ Rose ’ ;
BEGIN
SELECT id_p INTO num
FROM PROD WHERE pnom = nom ;
DBMS_OUTPUT . PUT_LINE ( ’L’ ’ a rticle ’ | |nom | | ’ a pour id’ | | num ) ;
EXCEPTION
WHEN NO_DATA_FOUND THEN
DBMS_OUTPUT . PUT_LINE ( ’Aucun arti cle ne porte le nom ’| | nom ) ;
WHEN TOO_MANY_ROWS THEN
DBMS_OUTPUT . PUT_LINE ( ’ Plusieurs articles portent l e nom ’ | | nom ) ;
WHEN OTHERS THEN
DBMS_OUTPUT . PUT_LINE ( ’ I l y a un problème . . . ’ ) ;
END;
/
33