Vous êtes sur la page 1sur 40

Cours: Systèmes de Gestion de Bases de Données :

Procedural Language /
Structured Query
Language
(PL/SQL)

Structure d’un bloc PL/SQL

Présenté par: Mme Olfa DRIDI


olfa.dridi@gmail.com

1 © Olfa DRIDI
PL/SQL

Plan
• Exploitation des requêtes SQL
• Curseurs
• Exceptions
• Procédures & fonctions
• Triggers

©
Le langage PL/SQL
Exploitation des
requêtes SQL

© Olfa DRIDI
PL/SQL

Le langage PL/SQL

Un langage de programmation de quatrième génération


propriétaire (Oracle) inspiré de ADA.

Ce langage est fortement inspiré de la norme SQL3 car il


est bien adapté à la manipulation d'une base de données
relationnelle.

Il offre :
Des extensions procédurales du langage SQL (il utilise les blocs SQL,
exécute les procédures stockées, gère des erreurs, optimise l’exécution
des requêtes, etc.).
Une portabilité entre les plateformes et les produits.
La prise en charge de la programmation orientée objet.

©
PL/SQL

Objets PL/SQL
• Il existe de nombreux types d'objet de base de données
PL/SQL :
• Package
• Corps du package
• Procédure
• Fonction
• Déclencheur
• La définition de ces objets se base sur la notion de bloc
PL/SQL

5 ©
PL/SQL

Structure d’un bloc PL/SQL


[DECLARE
… déclarations et initialisation]
BEGIN
… instructions exécutables
[EXCEPTION
… interception des erreurs]
END;

6 ©
PL/SQL

Les types de bloc PL/SQL

7 ©
PL/SQL

Les types de variables


• Les variables non PL/SQL
Champs d’écran en SQL*Forms
Variables définies dans SQL*Plus (préfixées de « & »)
• Les variables PL/SQL
• Scalaire
• Composite

• Identificateurs : commence par une lettre suivie de symboles


(lettres, chiffres, $,_, #).
• Les déclarations multiples ne sont pas permises.
8 ©
PL/SQL

Les variables scalaires


• Number, Boolean, Date, Time, Varchar2, etc.

• Affectation:
• Variable := Expression
• Par le directive DEFAULT
• Par la directive INTO d’une requête
9 ©
PL/SQL

Les variables scalaires


• Déclaration de variables %type
• Déclarer une variable selon la définition d’une colonne d’une table
ou d’une vue existante ou une autre variable précédemment
déclarée.

10 ©
PL/SQL

Les variables composites


• Record (Struct en C)
• Table (tableaux)

11 ©
PL/SQL

Les variables composites: Record


• Syntaxe 1

• Exemple 1

12 ©
PL/SQL

Les variables composites: Record


• Syntaxe 2 :
Soit par référence à une structure de table ou de curseur, en
utilisant la notion %ROWTYPE
Nom_varibale nom_table%rowtype;
Nom_varibale nom_curseur%rowtype;
• Exemple 2:

13 ©
PL/SQL

Les variables composites: Table


• Définir et de manipuler des tableaux dynamiques. Un tableau
est composé d’une clé primaire et d’une colonne de type
scalaire, TYPE, ROWTYPE ou RECORD.
• Syntaxe:

• Exemple:

14 ©
PL/SQL

Les variables composites: Table (exemple)

15 ©
PL/SQL

Les variables composites: Table


• Méthodes

16 ©
PL/SQL

Porté des variables

17 ©
PL/SQL

Porté des variables

• La valeur de V_message, V_Comm à la position 1 et 2

18 ©
PL/SQL

Traitements itératifs : la boucle de base

Ensemble d’instructions écrites une seule fois et exécutées à


plusieurs reprises.

PL/SQL permet d’effectuer des traitements répétitifs grâce à


la clause LOOP.

Quatre types de boucles:


La boucle de base
La boucle FOR
La boucle WHILE
La boucle CURSOR … FOR

©
PL/SQL

Traitements conditionnels
Exécution d’instructions en fonction du résultat d’une
condition

IF condition1 THEN traitement1;


{ELSIF condition2 THEN traitement2;}
[ELSE traitement3;]
END IF ;

Règles
Dès que l’une des conditions est vraie, exécution du
traitement qui suit le THEN
Si aucune condition n’est vraie, exécution du traitement
ELSE
Seules les clauses IF, THEN, END IF sont obligatoires
©
PL/SQL

Structure alternative : CASE

• Choix selon la valeur d’une variable

CASE variable

WHEN valeur1 THEN action1;


WHEN valeur2 THEN action2;
………
ELSE action;

END CASE;

Michel Tuffery 21

©
PL/SQL

Structure itérative

LOOP
• LOOP instructions;
EXIT WHEN (condition);
END LOOP;

FOR (indice IN [REVERSE] borne1..borne2) LOOP


instructions;
• FOR END LOOP;

WHILE (condition) LOOP


instructions;
• WHILE END LOOP;

Michel Tuffery 22

©
PL/SQL

L’ordre Select dans PL/SQL

23 ©
PL/SQL

La boucle ROR: Exemple

Exemple: Calcul de la Factorielle 9


DECLARE
fact NUMBER := 1;
BEGIN
FOR i IN 1..9
LOOP
Fact:= Fact*i;
END LOOP ;
INSERT INTO Resultat
VALUES (Fact, ‘factorielle9’);
END;

©
PL/SQL

La boucle While: Exemple

Exemple: Calcul du reste de la division 7324 par 9


DECLARE
Reste NUMBER := 7324;
BEGIN
WHILE reste >= 9
LOOP
reste:= reste-9;
END LOOP ;
INSERT INTO Resultat
VALUES (reste, ‘reste division de 7324 par 9’);
END;

©
PL/SQL

Package DBMS_OUTPUT
• Le package DBMS_OUTPUT permet d’afficher des messages à
partir des blocs PL/SQL. Il assure la gestion des
entrées/sorties de blocs ou sous-programmes PL/SQL.
• PUT: permet d'ajouter des informations dans la ligne en cours du
tampon.
• NEW_LINE: écriture du caractère fin de ligne.
• PUT_LINE: PUT + NEW_LINE.
• GET_LINE: récupérer la dernière ligne qui existe dans le buffer
pour l’utiliser dans le bloc PL/SQL.
• GET_LINES: récupérer plusieurs lignes du buffer.
• DISABLE/ ENABLE: activer ou désactiver l’utilisation du package

26 ©
Les curseurs

27 © Olfa DRIDI
PL/SQL

Les curseurs: Définitions

Un curseur est une variable dynamique qui prend


pour valeur le résultat d’une requête.
On utilise un curseur pour parcourir le résultat
d'une requête SQL dans un programme PL/SQL.
Une structure de données séquentielle avec une
position courante.
On déclare un curseur en associant un nom à une
requête.

CURSOR nom_curseur IS ordre_select;

©
PL/SQL

Les curseurs : Exemple

Exemple
DECLARE
CURSOR dept_10 IS
SELECT NomEmp, Sal
FROM employe
WHERE Numdept=10
ORDER BY Sal;
BEGIN
...;
...;
END;

©
PL/SQL

Les curseurs: Les étapes d’utilisation


• Dans le cas ou l’ordre SELECT renvoie plusieurs lignes, on est
amené à définir des curseurs
• L’utilisation d’un curseur pour traiter un ordre SELECT
renvoyant plusieurs lignes nécessite les 4 étapes suivantes :
Déclaration du curseur, ouverture du curseur, traitement des
lignes, fermeture du curseur

30 ©
PL/SQL

Les curseurs: Ouverture


Après avoir déclaré le curseur, il s’agit de l’ouvrir pour faire
exécuter l’ordre SELECT:
Allocation mémoire du curseur
Analyse syntaxique et sémantique de l’ordre SELECT
Positionnement de verrous éventuels (si SELECT … FOR
UPDATE)
L’ouverture du curseur se fait dans la section BEGIN du bloc

Syntaxe
OPEN nom_curseur;

©
PL/SQL

Curseur explicite: 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.

Syntaxe
FETCH nom_curseur INTO liste_variables;

Le FETCH ramène une seule ligne à la fois


Pour traiter n lignes: prévoir une boucle

©
PL/SQL

Les curseurs: Exemple


DECLARE
CURSOR dept_10 IS
SELECT NomEmp, Sal FROM employe
WHERE Numdept=10 ORDER BY Sal;
....;
BEGIN
OPEN dept_10;
LOOP
FETCH dept_10 INTO nom, salaire;
IF Salaire>2500
THEN INSERT INTO Resultat
VALUES (nom, Salaire);
END IF;
EXIT WHEN Salaire=5000;
END LOOP;
END;
©
PL/SQL

Curseur explicite: Fermeture

Après le traitement des lignes, pour libérer la


place mémoire, on ferme le curseur.

Syntaxe
CLOSE nom_curseur;

©
PL/SQL

Les curseurs: forme condensée


• Il existe une autre façon qui permet d’ouvrir un curseur, traiter
les lignes renvoyées par ce curseur, ainsi que le fermer. Cette
façon s’appelle la forme condensée et utilise la structure FOR.
Cependant, la déclaration se fait de la même façon que
précédemment.

35 ©
PL/SQL

Simplification d’écriture
Déclaration :
nom_ligne nom_curseur%ROWTYPE

Elément de la ligne identifié par :


nom_ligne.nom_colonne

L’utilisation avec le FETCH


FETCH nom_curseur INTO nom_ligne;
Facilite la programmation des curseurs dans les boucles
BEGIN
FOR nom_ligne IN nom_curseur
LOOP
END LOOP;
END;
©
PL/SQL

Les curseurs: Statuts


Attributs du curseur :
Type Booléen
o %FOUND vrai si le dernier fetch a ramené une
ligne
o %NOTFOUND vrai si le dernier fetch n'a pas
ramené de ligne
o %ISOPEN vrai ssi le curseur est ouvert

Type Numérique
o %ROWCOUNT le nombre de lignes déjà ramenées

©
PL/SQL

Curseurs paramétrés
Un curseur paramétré peut servir plusieurs fois avec des
valeurs des paramètres différentes
On doit fermer le curseur entre chaque utilisation de
paramètres différents (sauf si on utilise « for » qui ferme
automatiquement le curseur)
Permet de paramétrer la requête sur laquelle porte le
curseur

Syntaxe :
DECLARE
CURSOR nom_curseur (p1 type, p2 type,…) IS requête

BEGIN
nom_curseur(valeur1, valeur2 ,…);
©
PL/SQL

Les curseurs paramétrés: exemple


DECLARE
CURSOR depart(p_dept integer) IS
SELECT Numdept, NomEmp FROM Employe
WHERE Numdept = p_dept;
employe depart%ROWTYPE;
BEGIN
FOR employe IN depart(10)
LOOP
DBMS_OUTPUT.PUT_LINE(employe.NomEmp);
END LOOP;
FOR employe IN depart (20)
LOOP
DBMS_OUTPUT.PUT_LINE(employe.NomEmp);
END LOOP;
END;
©
Questions ????????

© Olfa DRIDI

Vous aimerez peut-être aussi