0% ont trouvé ce document utile (0 vote)
1 vues64 pages

PLSQLchap2

Télécharger au format pdf ou txt
Télécharger au format pdf ou txt
Télécharger au format pdf ou txt
Vous êtes sur la page 1/ 64

Base de données avancée:

PL/SQL

CHAPITRE2: PL/SQL
PROCEDURAL LANGUAGE/SQL

Asma ELADEL
[email protected]

A.U: 2021/2022
PL/SQL
2

 PL/SQL(ProceduralLanguage/SQL) est un langage


procédural d’ORACLE structuré en BLOCS.
 Extension du SQL: des requêtes SQL intégrées avec
les structures de contrôle habituelles (alternatives,
répétitives )
 Un programme PL/SQL est composé de fonctions, de
procédures, de triggers..
 Peut s’exécuter comme bloc anonyme, procédure ou
une fonction
Asma ELADEL
PL/SQL: Intérêt
3

 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.
 Dans l’environnement PL/SQL, les ordres SQL et
PL/SQL sont regroupés en blocs; un bloc ne demande
qu’un seul transfert pour l'exécution de l’ensemble des
commandes contenues dans le bloc.
 Construction de procédures ou fonctions stockées qui
améliorent le mode client-serveur par stockage des
procédures ou fonctions souvent utilisées au niveau
serveur.

Asma ELADEL
PL/SQL
4

1. PL/SQL: un langage de programmation


Il contient un ensemble d'instructions permettant de
mettre en oeuvre les principes de l'algorithmique:
 Déclaration de variables, de types, de fonctions,
de procédures
 Instructions d'affectation, conditionnelles,
itératives
 Fonctions numériques et de manipulations de
chaînes de caractères, de dates

Asma ELADEL
PL/SQL
5

2. Intégration du langage SQL


 Commande SELECT
 Commande INSERT, UPDATE, DELETE
 Commande de gestion de transaction COMMIT,
ROLLBACK, SAVEPOINT
 Utilisation de fonctions SQL : TO_CHAR,
TO_NUMBER, SUBSTR, ...

Asma ELADEL
PL/SQL
6

3. Gestion de curseurs
Instructions DECLARE, OPEN, FETCH, CLOSE
4. Gestion des erreurs
Gestion standard des erreurs par ORACLE
Définition et gestion de traitements d'erreurs propres
au développeur
5. PL/SQL dans le monde ORACLE
Disponible dans les outils de développement
ORACLE*FORMS, SQL*plus, ...
Définition de Curseurs, de triggers, de procédures
stockées.

Asma ELADEL
Les blocs PL/SQL
7

 Le bloc est l'unité de programmation PL/SQL.


 Un programme ou une procédure PL/SQL est un
ensemble de un ou plusieurs blocs. Chaque bloc
comporte trois sections :
1. Section déclaration (optionnelle)
2. Section corps du bloc ou d’exécution (obligatoire)
3. Section Gestion des exceptions e traitement des
erreurs (optionnelle)

 Les blocs peuvent être imbriqués.

Asma ELADEL
Structure d'un bloc PL/SQL
8

DECLARE
/* Déclaration des variables, des types, des curseurs,
fonctions et procédures */
BEGIN
/* Instructions PL/SQL ; tout instruction est terminée
par ; */
EXCEPTION
/* Traitement des erreurs */
END;

Asma ELADEL
Structure d'un bloc PL/SQL
9

 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

Asma ELADEL
Bloc PL/SQL: Déclaration
10

1. Section déclaration
 Dans cette section, on déclare toutes les variables
nécessaires à l’exécution du programme PL/SQL.
 Section facultative
 Commence par le mot clé DECLARE

Asma ELADEL
Bloc PL/SQL: Déclaration
11

Identificateurs Oracle : 30 caractères au plus,


Commence par une lettre,
Peut contenir lettres, chiffres, _, $ et #
Doivent être déclarées avant d’être utilisées
Déclarations multiples interdites.

Asma ELADEL
Bloc PL/SQL: Déclaration
12

 La partie déclarative dans un bloc PL/SQL, peut


comporter les déclarations suivantes:
Déclarations des variables scalaires, constantes
Déclaration des variables curseurs
Déclarations des types composés
Enregistrement(Record),
Table

Asma ELADEL
Bloc PL/SQL: Déclaration
13

Type de variables
 Scalaires : reçoivent une seule valeur
 Composées: permettent de définir des groupes de champs et de les
manipuler dans des blocs PL/SQL (tels que les records) et Table.

Types de données scalaires


 Nombres: X Number(7,5);
Y Number;
 Caractères: S Char(20); -- Chaîne de taille fixe
T Varchar2(30); -- Chaîne de taille variable
 Dates: D Date NOT NULL := SYSDATE;
 Booléens: B Boolean : = True;

Asma ELADEL
Bloc PL/SQL: Types de variables
14

Asma ELADEL
Bloc PL/SQL: Types de variables
15

Asma ELADEL
Bloc PL/SQL: Déclaration
16

 Types issus de SQL


CHAR, NUMBER, DATE, VARCHAR2

 Types PL/SQL
BOOLEAN, SMALLINT, BINARY_INTEGER,
DECIMAL, FLOAT, INTEGER, REAL, ROWID

Asma ELADEL
Bloc PL/SQL: Déclaration des variables scalaires
17

 Variables ou constantes

Nom-de-variable [CONSTANT ]Type [NOT NULL ][ := DEFAULT


|Expr ];

Expr : une constante ou un calcul faisant éventuellement référence à une


variable précédemment déclarée. L'initialisation est obligatoire si
CONSTANT ou NOT NULL sont utilisés.

Exemple: DECLARE
Nom_duclient char (30);
X number:=12;
Y number:=X*X;
x VARCHAR2(10);
PI constant number(7,5):=3.14159 ;

Asma ELADEL
Bloc PL/SQL: Déclaration des variables scalaires
18

 Variables ou constantes

Nom-variable nom-table.nom-attribut%TYPE;
Exemple :
film exemplaire.numFilm%TYPE;

Asma ELADEL
Bloc PL/SQL: Déclaration %TYPE
19

Variables %TYPE

Syntaxe
Nom_var [CONSTANT] Identifiant%TYPE [NOT NULL]
[ :=expr_pl/sql] ;

Exemples
V_COMPT COMPTEUR%TYPE;
V_NOMP PRIX.NOMP%TYPE;

Asma ELADEL
Bloc PL/SQL: Déclaration %TYPE
20

Variables %TYPE: Avantages


• Le type de données de la colonne peut être inconnu.
• Le type de données de la colonne peut changer en exécution.

Exemple
DECLARE
v_last_name s_emp.last_name%TYPE;
v_first_name s_emp.first_name%TYPE;
v_balance NUMBER( 7, 2 );
v_minimum_balance v_balance%TYPE := 10;

Asma ELADEL
Bloc PL/SQL: Déclaration pour un
enregistrement %ROWTYPE
21

Variables %ROWTYPE
Syntaxe
Nom_var [CONSTANT] Identifiant%ROWTYPE [NOT NULL] [ :=expr_pl/sql] ;

La déclaration pour un enregistrement se fait:


Soit par référence à une structure de table
nom-variable nom-table%ROWTYPE;

de curseur en utilisant ROWTYPE


nom-variable nom-curseur%ROWTYPE;

Asma ELADEL
Bloc PL/SQL: Déclaration %ROWTYPE
22

Variables %ROWTYPE: Avantages

• Le nombre de colonnes, ainsi que les types de données des colonnes de la


table de référence peuvent être inconnus.
• Le nombre de colonnes, ainsi que le type des colonnes de la table de
référence peuvent changer en exécution
• Utile lorsqu'on recherche
– Une ligne avec l'ordre SELECT.
– Plusieurs lignes avec un curseur explicite.
Exemple

DECLARE
dept_record s_dept%ROWTYPE;
emp_record s_emp%ROWTYPE;

Asma ELADEL
Bloc PL/SQL: Déclaration %ROWTYPE
23

Exemples
DECLARE
agent employe%ROWTYPE -- employe est la table employe de la base.

Au niveau traitement, on pourra écrire :


BEGIN
SELECT * -- Sélection de tous les champs
INTO agent BEGIN
SELECT nom,dt_entree
FROM employe
INTO agent.nom, agent.dt_entree
WHERE nom=‘DUMAS’; OU FROM employe
END; WHERE nom=‘DUMAS';
-- Sélection de certains champs
Asma ELADEL
Bloc PL/SQL: Déclaration pour une Table
24

 Structure composée d’éléments d’un même type


scalaire
 L’accès à un élément de la table s’effectue grâce à un
indice, ou clé primaire
 Cet index est déclaré de type BINARY_INTEGER

Asma ELADEL
Bloc PL/SQL: Déclaration pour une Table
25

Deux étapes :
• Déclaration du type de l’élément de la table
• Déclaration de la variable de type table

Asma ELADEL
Bloc PL/SQL: Déclaration pour une Table
26

 Déclaration du type de l’élément de la table :


TYPE nom-du-type-table
IS TABLE OF type-argument
INDEX BY BINARY_INTEGER;

 Déclaration de la variable de type table:


nom-variable nom-du-type-table;

Asma ELADEL
Exemple de déclaration pour une Table
27

DECLARE
TYPE tabNom IS TABLE OF VARCHAR2(20)
INDEX BY BINARY_INTEGER;
tableNom tabNom;
i BINARY_INTEGER;
BEGIN
tableNom(5) := 'Dupont';
i := 10;
tableNom(i) := 'Dupond';
END;
/

Asma ELADEL
Bloc PL/SQL: Déclaration des Curseurs
28

Variables Curseur

Le programmeur ne déclare dans la section DECLARE que les curseurs dits


explicites c'est à dire une zone mémoire associée à une requête select qui
permet de récupérer les n-uplets de la requête.
Syntaxe
CURSOR nom_curseur [(nom_paramètre type_paramètre)] IS
requête_select [FOR UPDATE OF nom_attribut]
Exemples :
CURSOR CURSEUR1 IS
Select nomp,ct
From Prix
Where nomf='SAMACO';
CURSOR Bonclient(V_solde number(8)) IS
Select nomc,adresc
From client
Where solde>V_solde;
Asma ELADEL
Exemple de déclaration
29

DECLARE
NumeroNUMBER(4);
nom VARCHAR2(30);
Salaire NUMBER(8,2);
Date_naissanceDATE;
// assignation de valeur
AugmentatationNUMBER (4) := 5;
Groupe VARCHAR2(10) := ‘groupe1’;
// utilisation du %TYPE. Permet de déclarer des variable de même
type que des variables déjà déclarée.
Numero_Client yacoubsa.clients.numclient%type
permet de déclarer le numéro du client du même type que le
numclient de la table clients de l’usager yacoubsa.

Asma ELADEL
Exemple de déclaration
30

Suite Exemple de déclarations:

Salaire_MIN NUMBER(7,2);
Salaire_MAX Salaire_Min%TYPE;
Acteur VARCHAR2(30);
Realisateur Acteur%TYPE:=‘Spielberg’;
// on peut donner le type ROWTYPE lorsqu’il s’agit
de déclarer un enregistrement (une ligne).
Enregistrement etudiant%ROWTYPE

Asma ELADEL
Bloc PL/SQL: Affectation
31

Assignation (Suite)
 Par l’opérateur d’affectation : :=
Nom_variable := expression ;
Exemple
X := 0 ;
Y := ( X+5) * Y ;
 Par la clause SELECT….INTO

Exemple: DECLARE
Nom Dept.Dname%type ;
BEGIN
SELECT Dname INTO Nom
FROM Dept WHERE DeptNo=20
END;

 Instruction FETCH avec un curseur

Asma ELADEL
Bloc PL/SQL: Corps du bloc
32

2. Section corps du bloc


Contient les instructions du programme et
éventuellement, à la fin, la section de traitement des
erreurs
Obligatoire
Introduite par le mot clé BEGIN
Se termine par le mot clé END

Asma ELADEL
Bloc PL/SQL: Structures de contrôle
33

Structure alternative
Structure répétitives

Asma ELADEL
Structures alternatives
34

Asma ELADEL
Structures alternatives
35

 Condition
< Opérande > < Opérateur > < Opérande >

 Opérateurs utilisables
= ; ! = ; <> ; < ; <= ;>; >=
IS [NOT] NULL
[NOT] BETWEEN …. AND
[NOT] IN
[NOT] LIKE
AND,OR,NOT

Avec plusieurs instructions dans THEN, il faut utiliser un bloc


(Begin).

Asma ELADEL
Structures alternatives: Exemple 1
36

Asma ELADEL
Structures alternatives: Exemple 2
37

Asma ELADEL
IF –END IF
38

Dans une alternative, les mot réservés IF, THEN et


END IF sont obligatoires. Les autres (ELSIF et ELSE)
sont optionnels
•Exercice: écrire un bloc PL/SQL qui permet de
déclarer deux variable de type NUMBER(vente et
bonus) et qui met à jour le salaire de l’employé
comme suit: (salaire = salaire+bonus)
–Si vente est > 1000 alors bonus = vente*50%
–Sinon bonus = vente *20%

Asma ELADEL
CASE ---WHEN
39

•L’instruction CASE: permet d’exécuter un bloc PL/SQL selon la valeur d’une


variable
•Exemple:
CREATE OR REPLACE PROCEDURE CASE1(CHOIX IN NUMBER) AS
BEGIN

CASE CHOIX
WHEN 1 THEN INSERT INTO employes(salaire )VALUES (44,28000);
WHEN 2 THEN UPDATE employes SET salaire = salaire +10
where numemp=10;
ELSE dbms_output.put_line('pas bon choix');
END CASE;

END;

Asma ELADEL
CASE ---WHEN
40

Asma ELADEL
Structures répétitives
41

Asma ELADEL
Structures répétitives
42

Asma ELADEL
Structures répétitives
43

Asma ELADEL
Structures répétitives: LOOP–EXIT WHEN–END LOOP
44

LOOP
…..
EXIT WHEN CONDITION ou EXIT
…..
END LOOP;

Exemple: Afficher les entiers de 1 à 10.


i:= 1 ;
LOOP
….
i:= i +1 ;
EXIT WHEN i >10 ;
…. if i>10 then EXIT; end if;
END LOOP;

Asma ELADEL
Structures répétitives: Exemple
45

CREATE OR REPLACE FUNCTION COMPTER


RETURN NUMBER AS
Compteur NUMBER :=0;
BEGIN
LOOP
compteur:=compteur+1; Obligation d'utiliser la commande EXIT
EXIT WHEN compteur=10; pour éviter une boucle infinie,
facultativement quand une condition est
END LOOP ; vraie.
RETURN compteur;
END;

Asma ELADEL
Loop avec EXIT
46

Lors de l’exécution d’un loop, on peut décider de sortir immédiatement de la


boucle avec la clause EXIT

Exemple

DECLARE
Credit NUMBER := 0;
BEGIN
LOOP
Credit:= Credit+ 1;
IF Credit> 3 THEN
EXIT; --on sort du loop
END IF;
END LOOP;
--pour afficher le résultat du looptout de suite
DBMS_OUTPUT.PUT_LINE ('Credit: ' || TO_CHAR(Credit));
END;
Asma ELADEL
Structures répétitives: FOR-IN-LOOP-END
47

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 );
J:= J* 3 ;
INSERT INTO T VALUES ( I, J );
END LOOP;

Asma ELADEL
Structures répétitives: FOR-IN-LOOP-END
48

BEGIN
FOR i IN 1..3 LOOP
DBMS_OUTPUT.PUT_LINE (TO_CHAR(i));
END LOOP;
END;

Asma ELADEL
Structures répétitives: While-LOOP
49

DECLARE
I NUMBER:=1;
BEGIN
WHILE I < 10 LOOP
I:= I+1;
DBMS_OUTPUT.PUT_LINE (TO_CHAR(I));
END LOOP;
END;

Asma ELADEL
NULL
50

Signifie "ne rien faire " , passer à l’instruction suivante

Exemple:
IF I>=10 THEN
NULL
ELSE
INSERT INTO Dept VALUES ( 50, 'Marketing', 'Casa');
END IF ;

Asma ELADEL
Affichage
51

Activer le retour écran :


set serveroutput on

Asma ELADEL
Affichage: Exemple
52

set serveroutput on
DECLARE
i NUMBER;
BEGIN
FOR i IN 1..5 LOOP
dbms output.put line('Nombre : ' || i) ;
END LOOP ;
END ;
/
Si '/' seul sur une ligne : n d'une définition (déclenche
l‘évaluation).

Asma ELADEL
Affichage: Exemple
53

DECLARE
emp1 Employes%ROWTYPE; -- record basé sur la
structure d'une ligne de la table Eemployes;
BEGIN
SELECT * INTO emp1 FROM Employes WHERE Id=3;

-- afficher les données du record


dbms_output.put_line('Nom : '|| emp1.Nom);
dbms_output.put_line('Salaire : '|| emp1.Salaire);
dbms_output.put_line('Age : '|| emp1.Age);
END;

Asma ELADEL
Les Exceptions
54

3. Section traitement des erreurs

Facultative
Introduite par le mot clé EXCEPTION

Asma ELADEL
Les exceptions: Syntaxe
55

BEGIN
...
EXCEPTION
WHEN exception1 THEN
...
WHEN exception2 THEN
...
WHEN OTHERS THEN --optionnel
...
END;

Asma ELADEL
Les exceptions: Déclaration
56

DECLARE
Nom-exception EXCEPTION ;
...
BEGIN
...
Declenchement d'exceptions :
RAISE Nom-exception;

Asma ELADEL
Les Exceptions: Définition
57

 Une erreur ou avertissement PL+SQL peut survenir en


cours d'exécution et soulever une exception.
 Une exception ne provoque pas nécessairement l'arrêt du
programme si elle est saisie par un bloc (dans la partie
EXCEPTION ).
 Une exception non saisie remonte dans la procédure
appelante (ou elle peut être saisie).

 Deux types d’exceptions:


 Prédéfinie par le système ou
 Déclarée/ définie par l'utilisateur (programmeur).

Asma ELADEL
Les Exceptions: Traitement
58

 Le traitement d'une exception se fait par la règle


when
when<nomd'exception> then <sequence d'instructions>;
où la séquence d'instructions est exécuté quand
l'exception donnée est soulevée.

Asma ELADEL
Exceptions prédéfinies
59

Exemples d'exceptions système


 CURSOR_ALREADY_OPEN: tentative d'ouverture de curseur déjà
ouvert
 INVALID_CURSOR: par exemple fetch sur un curseur déjà fermé
 NO_DATA_FOUND: aucune ligne retournée (select into ou fetch)
 TOO_MANY_ROWS: select into retourne plusieurs lignes
 ...
 ZERO_DIVIDE: tentative de division par zéro

Exemple d'usage

when NO DATA FOUND then rollback;

Asma ELADEL
Exceptions utilisateur
60
 Elles doivent être déclarées avec le type EXCEPTION.
 On les lève avec l'instruction RAISE.

DECLARE
salaire NUMBER(8,2) ;
salaire trop bas EXCEPTION ;
BEGIN
select sal into salaire from emp where matr = 50 ;
IF salaire < 300 THEN
RAISE salaire trop bas ;
END IF ;
EXCEPTION
WHEN salaire trop bas THEN
dbms output.put line(`Salaire trop bas') ;
WHEN OTHERS THEN
dbms output.put line(SQLERRM) ;
END ;
Asma ELADEL
Exception: Exemple 1
61

Augmenter de 5% les salaires des employés du


département '123' sans toutefois dépasser 4000

Asma ELADEL
Les exceptions: Exemple1
62

 Les traitements d'exceptions sont définis à la fin du


bloc instructions par la clause Exception.
 La variable tropGrand est déclarée de type
exception, pour être utilisée dans raise.

Asma ELADEL
Les exceptions: Exemple 2
63

DECLARE EXCEPTION
WHEN NO_DATA_FOUND THEN
erreurEx EXCEPTION; DBMS_OUTPUT.PUT_LINE('numero
num exemplaire.numExemplaire inconnu');
%TYPE; WHEN erreurEx THEN
DBMS_OUTPUT.PUT_LINE(num || '
film exemplaire.numFilm%TYPE; probleme');
pb exemplaire.probleme%TYPE; END;
BEGIN /

SELECT numExemplaire, numFilm, probleme


INTO num, film, pb
FROM exemplaire WHERE numExemplaire = 1;
IF probleme IS NOT NULL
THEN RAISE erreurEx; END IF;
DBMS_OUTPUT.PUT_LINE(num || ' OK');
Asma ELADEL
Les exceptions: Exemple 3
64

Asma ELADEL

Vous aimerez peut-être aussi