Vous êtes sur la page 1sur 22

SQL AVANCE

PL /SQL

© Base de données Avancees / M.MOURCHID, 2022-2023

PL /SQL

 Introduction
 Bloc PL/SQL
 Déclaration des variables
 Structures de contrôle
 Curseurs
 Exceptions
 Procédures et fonctions
 Les packages
 Triggers

© Base de données Avancees / M.MOURCHID, 2022-2023

Page 1
Introduction

 Le PL/SQL est un langage procédural d’ORACLE.

 L’intérêt du PL/SQL est de pouvoir dans un même traitement


combiner la puissance des instructions SQL et la souplesse d’un
langage procédural.
 Le fonctionnement de PL/SQL est basé sur l’interprétation d’un bloc
de commandes. Ce mode de fonctionnement permet d’obtenir des
gains de transmissions et des gains de performances.
 Dans l’environnement SQL, les ordres du langage sont transmis et
exécutés les uns à la suite des autres.
 Dans l’environnement PL/SQL, les ordres SQL et PL/SQL sont
regroupés en blocs; un bloc ne demande qu’un seul transfert exécution
de l’ensemble des commandes contenues dans le bloc.

© Base de données Avancees / M.MOURCHID, 2022-2023

Bloc PL/SQL

 Un programme PL/SQL est constitué d’un ou plusieurs blocs qui


constituent le module d’éxécution. Il y a trois parties ou sections
distinctes dans un bloc: DECLARE, BEGIN ET EXCEPTION.
DECLARE
Déclarartion des variables locales au bloc, constantes,
execptions, curseurs, modules locaux
BEGIN
Commandes exécutables: Instructions SQL et PL/SQL.
Possibilité de blocs imbriqués.
EXECPTION
Traitement des erreurs
END ;

© Base de données Avancees / M.MOURCHID, 2022-2023

Page 2
Bloc PL/SQL

 Un bloc PL/SQL peut contenir:


 Toute instruction du LMD ( SELECT, INSERT, UPDATE, DELETE)
 Les commandes de gestion des transactions ( COMMIT, ROLLBACK,
SAVEPOINT )
 Les sections DECLARE et EXCEPTION sont optionnelles.
 Chaque instruction se termine par ;
 Les blocs peuvent être imbriqués.
 Les sous blocs ont la même structure que les blocs.

 Une variable est visible dans le bloc où elle est déclarée et dans tous ses
sous-blocs.
 Si une variable est déclarée dans un premier bloc et aussi dans un sous
bloc, la variable du bloc supérieur n’est plus visible dans le sous-bloc.

© Base de données Avancees / M.MOURCHID, 2022-2023

Types de blocs PL/SQL


Bloc PL/SQL

[ DECLARE ] PROCEDURE name IS FUNCTION name IS


RETURN datatype;

BEGIN BEGIN BEGIN


-- phrases -- phrases -- phrases

RETURN (valeur);
[ EXCEPTION ] [ EXCEPTION ] [ EXCEPTION ]

END END END

Bloc anonyme Procédure Fonction


Imbriqué dans un programme Effectue un traitement Effectue un calcul et donne un résultat
Emis interactivement (SQL*PLUS) Peut recevoir des paramètres Peut recevoir des paramètres

© Base de données Avancees / M.MOURCHID, 2022-2023

Page 3
DECLARATION DES VARIABLES

PL/SQL supporte des données composites Table ORACLE

Scalaires

Enregistrements
Variables Zone subdivisée

Table ORACLE

Composites

Table PL/SQL
Table à une dimension (1 colonne)

Aussi appelée COLLECTION

© Base de données Avancees / M.MOURCHID, 2022-2023

Déclaration des variables scalaires

 La partie déclarative dans un bloc PL/SQL, peut comporter 3 types de


déclarations:
 Déclarations des variables, constantes
 Déclaration des curseurs
 Déclaration des exceptions
1. Variables ou constantes
Syntaxe:
Nom-de-variable [CONSTANT ] TYPE [ NOT NULL ]:= expression ;
Expression: peut être une constante ou un calcul faisant éventuellement
référence à une variable précédemment déclarée.
Exemple: DECLARE
Nom_duclient char (30);
X number DEFAULT 10 ;
PI CONSTANT number(7,5):=3.14159;

© Base de données Avancees / M.MOURCHID, 2022-2023

Page 4
Déclaration des variables scalaires
2. Déclaration par copie du type de donnée:
PL/ SQL permet de déclarer un type de variable par copie. La variable fait
référence au même type qu’une colonne d’une table ou même type qu’une autre
variable.
Syntaxe:
Nom-de-variable nom_table.nom-colonne%type ;
ou
Nom-de-variable1 Nom-de-variable2%type ;
Exemple: DECLARE
Nom_client client.nom%type ;
X number (10,3) ;
Y X%type ;
3. Valorisation des variables: 3 possibilités:
 Par l’opérateur d’affectation : :=
 Par la clause Select….Into
 Par le traitement d’un curseur dans la section BEGIN.
© Base de données Avancees / M.MOURCHID, 2022-2023

Déclaration des variables scalaires

3. Valorisation des variables ( suite )


 Par l’opérateur d’affectation : :=
Nom_variable := expression ;
Exemple : X := 0;
Y := ( X+5) * Y ;
 Par la clause Select….Into
Exemple: DECLARE
Vref varchar2(10);
Vprix produit.PU%type ;
BEGIN
SELECT REF, PU INTO Vref, Vprix
FROM Produit WHERE REF= 1 ;
END;

© Base de données Avancees / M.MOURCHID, 2022-2023

Page 5
Types de variables

PL/SQL supporte plusieurs types de variables

Variable élémentaire

scalaire Types de données correspondant


à un type de colonne

Variable décomposée
en plusieurs informations

composite Table PL/SQL ou enregistrement

Large Object Block


LOB Adresse d’un objet volumineux ( Vidéo, son, image, …)

Pointeur

référence Pointeur sur une donnée d’un autre programme

© Base de données Avancees / M.MOURCHID, 2022-2023

Opérateurs PL/SQL
PL/SQL supporte les mêmes opérateurs que SQL

Opérateurs logiques NOT, AND, OR

Opérateurs arithmétiques + - * / ** Elévation au carré

Opérateurs de comparaison = != < > >= IS NULL LIKE BETWEEN IN

Opérateurs de chaîne de caractères || Concaténation

Utiliser des parenthèses pour simplifier l’écriture et la lecture des expressions

© Base de données Avancees / M.MOURCHID, 2022-2023

Page 6
Structures de contrôles
 Structure alternative
 IF …. THEN…. END IF
 IF …. THEN…. ELSE … END IF

 Itérations
 LOOP ..
 FOR i…….
 WHILE
 Branchement séquentiels
 GOTO
 NULL

© Base de données Avancees / M.MOURCHID, 2022-2023

Structure alternative

 IF THEN
IF condition THEN
sequence_insts;
END IF
 IF THEN ELSE
IF condition THEN
sequence_insts1;
ELSE
sequence_insts2;
END IF

 IF THEN ELSIF
IF condition1 THEN
sequence_insts1;
ELSIF condition2 THEN
sequence_insts2;
ELSE
sequence_insts3;
END IF

© Base de données Avancees / M.MOURCHID, 2022-2023

Page 7
Structure alternative

Exemple:
if var1>10 then
var2:= var1+20;
elsif var1 between 7 and 8 then
var2:= 2* var1;
else
var2:=var1*var1;
end if

© Base de données Avancees / M.MOURCHID, 2022-2023

Itérations

 LOOP-EXIT-WHEN-END
LOOP
…..
EXIT WHEN CONDITION ou EXIT
…..
END LOOP
Exemple:
i:= 1 ;
LOOP
i:= i +1 ;
EXIT WHEN i >= 10 ;
….
END LOOP

© Base de données Avancees / M.MOURCHID, 2022-2023

Page 8
Itérations

 WHILE-LOOP-END
WHILE condition LOOP
…..

END LOOP
Exemple:
WHILE total<= 10000 LOOP
……..
SELECT salaire INTO S FROM employe WHERE……..
….
total:= total + S ;
END LOOP

© Base de données Avancees / M.MOURCHID, 2022-2023

Itérations

 FOR-IN-LOOP-END
FOR compteur IN [ REVERSE] inf..sup LOOP
…..
END LOOP
Exemple:
FOR I IN 1..10 LOOP
J:= J* 3 ;
INSERT INTO T VALUES ( I, J );
END LOOP

© Base de données Avancees / M.MOURCHID, 2022-2023

Page 9
NULL

 Signifie « ne rien faire « , passer à l’instruction suivante


Exemple:
IF I>=10 THEN
NULL ;
ELSE
INSERT INTO T VALUES ( ‘inférieur à 10‘,I );
END IF ;

© Base de données Avancees / M.MOURCHID, 2022-2023

Résumé
Structures conditionnelles Structures conditionnelles
IF condition1 LOOP
--- ---
ELSIF condition2
EXIT [ WHEN condition(s) ]
---
---
ELSE EXIT ne peut être codé que dans une boucle
--- END LOOP
END IF

Boucle simple Boucle avec - comptage


LOOP FOR compteur IN [ REVERSE ] borne_inférieure borne_supérieure
EXIT ne peut être codé
--- que dans une boucle LOOP
Peuvent être définies par littéraux, variables, expressions
EXIT [ WHEN condition(s) ] ---

--- END LOOP

END LOOP
Boucles imbriquées Boucle avec - comptage

« nom 1 » LOOP WHILE condition


--- Nom de la boucle - meilleure lisibilité
LOOP La boucle peut ne pas être exécutée
« nom 2 » LOOP
---  TANT QUE condition FAIRE
- - - EXIT [ nom ] [ WHEN - - -]
END LOOP nom 2 END LOOP
---
END LOOP nom 1 Facultatif - rappelle le nom de la boucle

© Base de données Avancees / M.MOURCHID, 2022-2023

Page 10
Resume

DECLARE Partie déclarative (optionnelle) - déclaration de ressources pour le bloc • Variables, constantes, curseurs,

v_id client.numcli%TYPE; • Exceptions utilisateurs

BEGIN Partie exécutable (obligatoire) - description du traitement • Ordres SQL


SELECT numcli INTO v_id • Instructions PL/SQL
FROM client
WHERE numcli = &numero;

EXCEPTION Partie exception (optionnelle) - traitements à effectuer en cas d’erreur

/* gestion des anomalies */


WHEN NO_DATA_FOUND THEN
dbms_output.put_line ( &numero||
‘ invalide.’);
WHEN OTHERS THEN
dbms_output.put_line ( ‘Autre erreur’);
END; Fin du bloc (obligatoire) - clôt le bloc

© Base de données Avancees / M.MOURCHID, 2022-2023

Les curseurs

 Définition d’un curseur.


 Déclaration d’un curseur.
 Utilisation d’un cureseur.

© Base de données Avancees / M.MOURCHID, 2022-2023

Page 11
Curseur: définition

 Lorsque on execute un ordre SQL à partir de PL/SQL, Oracle alloue


une zone de travail privee pour cet ordre. Cette zone de travail
contient des informations relatives à l’ordre SQL ainsi que les
statuts d’execution de l’ordre. Les curseurs PL/SQL sont un
mecanisme permettant de nommer cette zone de travail et de
manipuler les donnees qu’elle contient.
 Deux types de curseurs:
 Implicite: créés automatiquement par Oracle pour chaque ordre SQL
(select, update, delete, insert) .
 Explicite: crée par le programmeur pour pouvoir traiter le résultat de
requêtes retournant plus d’un tuple.

© Base de données Avancees / M.MOURCHID, 2022-2023

Etapes de gestion d’un curseur


La manipulation d’un curseur se fait en plusieurs étapes
déclarative

1x La déclaration du curseur
lie le curseur et une requête SQL CURSOR …

exécution Tables Oracle

Ouverture du curseur
1x Exécution de la requête SQL
Chargement en mémoire + OPEN ...
contexte
FETCH ...
Accès séquentiel aux lignes
nx via des variables
Gestion d ’une boucle

1x Fermeture du curseur
Libération de la zone mémoire Curseur
CLOSE ...
acquise
Variables programme

© Base de données Avancees / M.MOURCHID, 2022-2023

Page 12
Curseur: définition

 Lorsque on execute un ordre SQL à partir de PL/SQL, Oracle alloue


une zone de travail privee pour cet ordre. Cette zone de travail
contient des informations relatives à l’ordre SQL ainsi que les
statuts d’execution de l’ordre. Les curseurs PL/SQL sont un
mecanisme permettant de nommer cette zone de travail et de
manipuler les donnees qu’elle contient.
 Deux types de curseurs:
 Implicite: créés automatiquement par Oracle pour chaque ordre SQL
(select, update, delete, insert) .
 Explicite: crée par le programmeur pour pouvoir traiter le résultat de
requêtes retournant plus d’un tuple.
 L’utilisation d’un curseur explicite nécessite les étapes suivantes
1. Déclaration du curseur : Section DECLARE
2. Ouverture du curseur: Section BEGIN
© Base de3. Traitement
données des lignes: Section
Avancees / M.MOURCHID, 2022-2023 BEGIN
4. Fermeture du curseur: Section BEGIN ou EXCEPTION

Curseur: déclaration

 Déclaration du curseur sans parametres:


DECLARE CURSOR <nom_curseur> IS Requete_SELECT

Exemple: Declarer un curseur qui permet de lister les employes de rabat

DECLARE
v_ville employe.ville%type :=‘Rabat’
CURSOR employe_rabat IS
SELECT numemp, nomemp FROM employe WHERE ville= v_ville;

© Base de données Avancees / M.MOURCHID, 2022-2023

Page 13
Curseur: déclaration

 Déclaration du curseur avec parametres:


DECLARE CURSOR <nom_curseur> ( para1, para2,……)
IS Requete_SELECT
Exemple:
DECLARE
CURSOR employe_rabat ( v IN VARCHAR2(20))
IS
SELECT numemp, nomemp FROM employe WHERE ville= v;

© Base de données Avancees / M.MOURCHID, 2022-2023

Curseur: déclaration

 Déclaration du curseur avec clause RETURN:


DECLARE CURSOR <nom_curseur> ( para1, para2,……)
RETURN specification_valeur_retour
IS Requete_SELECT
Exemple:
DECLARE
CURSOR employe_rabat ( v IN VARCHAR2(20))
RETURN employe%ROWTYPE
IS
SELECT numemp, nomemp FROM employe WHERE ville= v;

© Base de données Avancees / M.MOURCHID, 2022-2023

Page 14
Curseur: Ouverture

 L’ouverture du curseur se fait dans la section BEGIN du bloc par:


OPEN nom_curseur
Exemple:
DECLARE
CURSOR employe_rabat IS
SELECT numemp, nomemp FROM employe WHERE ville= ‘ Rabat’;

BEGIN
OPEN employe_rabat ;
………….
……………….. Si aucune ligne n’est lue
END ;  OPEN ne déclenche pas d’exception
 Le programme teste l’état du curseur
après le FETCH

© Base de données Avancees / M.MOURCHID, 2022-2023

Curseur: accès aux données


 L’accès aux données se fait par la clause: FETCH INTO
syntaxe: FETCH nom_curseur INTO < var1, var2,……..>
 Le FETCH permet de récupérer un tuple de l’ensemble réponse
associé au curseur et stocker les valeurs dans des variables.
 Pour traiter n lignes, il faut une boucle.
Exemple:
DECLARE
CURSOR employe_rabat IS
SELECT numemp, nomemp FROM employe WHERE ville= ‘ Rabat’
BEGIN
OPEN employe_rabat
………….
………………..
END ;

© Base de données Avancees / M.MOURCHID, 2022-2023

Page 15
Curseur: accès aux données
Exemple: CREATE TABLE resultat ( nom varchar2(10), sal number (7,2))
DECLARE
CURSOR employe_rabat IS
SELECT nomemp, sal FROM employe WHERE ville= ‘ Rabat’ ;
nom employe.nomempl%TYPE ; Définition des variables réceptrices
salaire employe.sal %TYPE ; (FETCH)
BEGIN
OPEN employe_rabat;
FETCH employe_rabat INTO nom, salaire ;
WHILE employe_rabat%found LOOP
IF salaire >3000 THEN
INSERT INTO resultat VALUES ( nom, salaire) ;
END IF ;
FETCH employe_rabat INTO nom, salaire ; Lecture séquentielle

END LOOP;
CLOSE employe_rabat ;
END ;
© Base de données Avancees / M.MOURCHID, 2022-2023

Curseur: Fermeture du curseur

 La fermeture du curseur se fait dans la section BEGIN du bloc par:


CLOSE nom_curseur
Exemple:
DECLARE
CURSOR employe_rabat IS
SELECT numemp, nomemp FROM employe WHERE ville= ‘ Rabat’ ;
BEGIN
OPEN employe_rabat ;
………….
………………..
CLOSE employe_rabat ;
END ;

© Base de données Avancees / M.MOURCHID, 2022-2023

Page 16
Curseur pour lire toute une ligne: L’attribut
%ROWTYPE

 L’attribut %ROWTYPE permet de déclarer une variable de même type que


l’enregistrement ( la ligne ) de la table.
Syntaxe: Nom_de_variable nom_table%ROWTYPE ;
Exemple:
DECLARE
enrg_empl employe%ROWTYPE;
 Avec un curseur:
CURSOR nom_curseur IS Requete_SELECT ;
nom_structure nom_curseur%ROWTYPE ;
 Les éléments de la structure sont identifiés par: nom_structure.nomcolonne
 La structure est renseignée par le FETCH :
FETCH nom_curseur INTO nom_structure
© Base de données Avancees / M.MOURCHID, 2022-2023

Curseur pour lire toute une ligne: L’attribut


%ROWTYPE

CREATE TABLE resultat ( nom varchar2(10), sal number (7,2))


DECLARE
CURSOR employe_rabat IS
SELECT nome, salaire FROM employe WHERE ville= ‘ Rabat’ ;
V_empl employe_rabat %ROWTYPE ; Définition de l’enregistrement
%ROWTYPE garantit la compatibilité
BEGIN entre les champs de l’enregistrements
et les colonnes de la table
OPEN employe_rabat;
FETCH employe_rabat INTO V_empl ;
WHILE employe_rabat%found LOOP
IF V_empl .salaire >3000 THEN
INSERT INTO resultat VALUES (V_empl .nome, V_empl .salaire) ;
END IF ;
FETCH employe_rabat INTO V_empl ;
END LOOP;
CLOSE employe_rabat ;
END
© Base ;
de données Avancees / M.MOURCHID, 2022-2023

Page 17
Les attributs de curseur explicite
Les attributs d ’un curseur permettent de connaître l’état du curseur après exécution de la requête

attributs Informations obtenues

%ROWCOUNT Nombre de lignes concernées par la dernière requête

%FOUND TRUE si la dernière requête concernait une ou plusieurs lignes

%NOTFOUND TRUE si la dernière requête ne concernait aucune ligne

TRUE si le curseur est ouvert


%ISOPEN

Format d’utilisation

Nom_curseur% ATTRIBUT

© Base de données Avancees / M.MOURCHID, 2022-2023

Curseur implicite

 A chaque exécution d’une requête SQL, PL/SQL crée un curseur


implicite.

 les mêmes attributs aux colonnes sont disponibles à condition de les


préfixer par SQL ( nom du curseur implicite). Ces attributs réfèrent
au dernier curseur implicite utilisé par l’application.
Exemple: Declare
nb_lignes number(5);
Begin
delete from employe where ville=`kenitra` ;
nb_lignes:=SQL%ROWCOUNT; /*nombre de lignes
supprimees */
End;
© Base de données Avancees / M.MOURCHID, 2022-2023

Page 18
Utilisation simplifiée des curseurs
 Curseur FOR LOOP remplace OPEN, FETCH et CLOSE.
 Lorsque le curseur est invoqué, un enregistrement est
automatiquement créé avec les mêmes éléments de données que
ceux définies dans l’instruction select.
Exemple:
CREATE TABLE resultat ( nom varchar2(10), sal number (7,2))
DECLARE
CURSOR employe_rabat IS
SELECT nome, salaire FROM employe WHERE ville= ‘ Rabat’ ;
BEGIN
FOR enrg_e IN employe_rabat enrg_e :enregistrement décrit automatiquement
LOOP
IF enrg_e.salaire >3000 THEN
INSERT INTO resultat VALUES (enrg_e.nome, enrg_e.salaire) ;
END IF ; Ne pas coder les ordres
END LOOP; OPEN
FETCH
END ; CLOSE
© Base de données Avancees / M.MOURCHID, 2022-2023

Utilisation d’une variable de type Record

 Un record permet de définir des types composites


Syntaxe :
TYPE nom_record IS RECORD
( nom_ch1 type ,
nom_ch2 type,
………..);
 Déclaration d’une variable de ce type: nom_variable nom_record
DECLARE
TYPE enrg_empl IS RECORD
( nom employe.nomemp %TYPE,
salaire employe.sal %TYPE);
déclaration d’une variable: empl enrg_empl ;

© Base de données Avancees / M.MOURCHID, 2022-2023

Page 19
Curseur paramétré
 Un curseur paramétré peuvent 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)
Exemple:
DECLARE
CURSOR cur_employe( v_ville varchar2(20)) IS
SELECT nomemp, sal FROM employe WHERE ville= v_ville ;
BEGIN
FOR enrg_e IN cur_employe(´rabat´)
/* traitement*/
END LOOP;
FOR enrg_e IN cur_employe(´kenitra´)
/* traitement*/
END LOOP;
END ;
© Base de données Avancees / M.MOURCHID, 2022-2023

Curseur modifiable

 Le langage PL/SQL fournit une méthode permettant de modifier les


lignes extraites par le curseur. Cette méthode se compose de deux
parties : la clause FOR UPDATE dans la déclaration du curseur et la
clause WHERE CURRENT OF dans une instruction UPDATE ou
DELETE.
 Un curseur qui comprend plus d’une table dans sa définition ne
permet pas la modification des tables de BD.
 Seuls les curseurs définis sur une seule table sans fonction
d’agrégation et de regroupement peuvent utilisés dans
une MAJ : delete, update,.
 Pour désigner la ligne courante à modifier on utilise la clause
CURRENT OF nom_curseur.

© Base de données Avancees / M.MOURCHID, 2022-2023

Page 20
Curseur modifiable
Exemple:
DECLARE
Cursor C1 is
select nomemp, sal from employe for update of sal;
resC1 C1%rowtype;
BEGIN
Open C1;
Fetch C1 into resC1;
While C1%found Loop
If resC1.sal > 1500 then
update employe
set sal = sal * 1.1
where current of c1;
end if;
Fetch C1 into resC1;
end loop;
close C1 ;
END; /
© Base de données Avancees / M.MOURCHID, 2022-2023

Curseur modifiable
Exemple: ( suite )
Explications :
 ( ... For update of nom_colonne )
Il faut se réserver la ligne lors de la déclaration du curseur par le positionnement d'un
verrou d'intention .
 ( ... where current of c1 ; )
Il faut spécifier que l'on veut traiter la ligne courante au Fetch par la clause.

© Base de données Avancees / M.MOURCHID, 2022-2023

Page 21
Exceptions

 Définition
 Fonctionnement
 Exemples

© Base de données Avancees / M.MOURCHID, 2022-2023

Page 22

Vous aimerez peut-être aussi