Cours - 3 - PLSQL - ESTSB2
Cours - 3 - PLSQL - ESTSB2
Cours - 3 - PLSQL - ESTSB2
LANGAGE PL/SQL
Niveau:
DUT GI S3
Bases de données avancées
2
INTRODUCTION
PL/SQL 25/11/2020
Généralités
3
PL/SQL 25/11/2020
Pourquoi PL/SQL
4
PL/SQL 25/11/2020
Pourquoi PL/SQL (2)
5
PL/SQL 25/11/2020
Caractéristiques du PL/SQL
6
PL/SQL 25/11/2020
Utilisation de PL/SQL
7
PL/SQL 25/11/2020
PL/SQL
8
PL/SQL 25/11/2020
Comparaison avec SQL
9
SQL:
Langage assertionnel et non procédural.
Pl/Sql:
Langage procédural qui intègre des ordres sql:
Select, insert, update, delete
PL/SQL 25/11/2020
Avantages du PL/SQL
10
PL/SQL 25/11/2020
Objectifs du chapitre
11
PL/SQL 25/11/2020
Bases de données avancées
12
STRUCTURE D’UN
PROGRAMME PL/SQL
PL/SQL 25/11/2020
Blocs
13
fonctions nommées
PL/SQL 25/11/2020
Structure des blocs
14
PL/SQL 25/11/2020
Structure des blocs (2)
15
DECLARE
-- définitions de variables
BEGIN
-- Les instructions à exécuter
EXCEPTION
-- La récupération des erreurs
END;
PL/SQL 25/11/2020
Structure des blocs (3)
16
DECLARE
…
BEGIN
DECLARE
…..
BEGIN
……
BEGIN
………
END ;
………
END ;
……..
END ;
PL/SQL 25/11/2020
Structure des blocs (4)
17
PL/SQL 25/11/2020
Bases de données avancées
18
LES VARIABLES
PL/SQL 25/11/2020
Les variables
19
Identificateurs Oracle :
30 caractères au plus
commence par une lettre
peut contenir lettres, chiffres, _, $ et #
PL/SQL 25/11/2020
Les variables (2)
20
Déclaration :
Nom_variable type_variable;
Initialisation:
Nom_variable := valeur;
Déclaration et initialisation :
Nom_variable type_variable := valeur;
PL/SQL 25/11/2020
Les variables
21
PL/SQL 25/11/2020
Commentaires
22
PL/SQL 25/11/2020
Les types de variables
23
VARCHAR2
Longueur maximale : 32767 octets
Syntaxe:
Nom_variable VARCHAR2(30);
Exemple: name VARCHAR2(30);
name VARCHAR2(30) := ‘toto’;
NUMBER
Nom_variable NUMBER(long,dec);
avec Long : longueur maximale
Dec : longueur de la partie décimale
Exemple: num_tel number(10);
toto number(5,2)=142.12;
PL/SQL 25/11/2020
Les types de variables (2)
24
DATE
Nom_variable DATE;
BOOLEAN
TRUE, FALSE ou NULL
PL/SQL 25/11/2020
Les types de variables (3)
25
Exemples :
age integer;
nom varchar(30);
dateNaissance date;
ok boolean := true;
PL/SQL 25/11/2020
Exemples
26
c CHAR( 1 );
name VARCHAR2(10) := 'Scott';
cpt BINARY_INTEGER := 0;
total NUMBER( 9, 2 ) := 0;
order DATE := SYSDATE + 7;
Ship DATE;
pi CONSTANT NUMBER ( 3, 2 ) := 3.14;
done BOOLEAN NOT NULL := TRUE;
ID NUMBER(3) NOT NULL := 201;
PRODUIT NUMBER(4) := 2*100;
V_date DATE := TO_DATE('17-OCT-01','DD-MON-YY');
V1 NUMBER := 10;
V2 NUMBER := 20;
V3 BOOLEAN := (v1>v2);
Ok BOOLEAN := (z IS NOT NULL);
PL/SQL 25/11/2020
Quelques conventions en PL/SQL
27
g_deptno (globale)
c_emp (CURSOR)
PL/SQL 25/11/2020
Utilisation des variables
28
PL/SQL 25/11/2020
Bloc PL/SQL Anonyme accédant à la base
29
PL/SQL 25/11/2020
Cas à plusieurs variables hôtes
30
SET SERVEROUTPUT ON
SQL> DECLARE
v_ename VARCHAR2(12);
v_sal NUMBER(7,2);
BEGIN
SELECT ename, sal INTO v_ename, v_sal
FROM emp WHERE ROWNUM = 1;
DBMS_OUTPUT.PUT_LINE(v_ename);
DBMS_OUTPUT.PUT_LINE(v_sal);
EXCEPTION
WHEN OTHERS Optionnel à ce stade
THEN NULL;
END;
/
PL/SQL 25/11/2020
31
PL/SQL 25/11/2020
Les types de variables (4)
32
%TYPE
%ROWTYPE
PL/SQL 25/11/2020
Typage dynamique %TYPE
33
nom emp.name%TYPE;
PL/SQL 25/11/2020
L'Attribut %TYPE - Exemple
35
DECLARE
ename scott.emp.ename%TYPE;
job emp.job%TYPE;
balance NUMBER(7, 2);
mini_balance balance%TYPE := 10;
rec emp%ROWTYPE;
PL/SQL 25/11/2020
Variable typée dynamiquement
36
employe emp%ROWTYPE;
PL/SQL 25/11/2020
Exemple d’utilisation
38
employe emp%ROWTYPE;
nom emp.name%TYPE;
select * INTO employe
from emp
where matr = 900;
nom := employe.name;
employe.dept := 20;
----------
insert into emp
values employe;
PL/SQL 25/11/2020
Attribut %TYPE & %ROWTYPE
39
SMITH
9600
17/12/1980
PL/SQL 25/11/2020
Affectation
40
Exemples :
dateNaissance := ’10/10/2004’;
PL/SQL 25/11/2020
Les opérateurs
41
Arithmétique : +, -, *, /
Concaténation : ||
Parenthèses (contrôle des priorités entre opérations): ()
Comparaison : =, !=, <, >, <=, >=, IS NULL, LIKE,
BETWEEN, IN
Logique : AND, OR, NOT
Affectation: :=
PL/SQL 25/11/2020
Portée
42
PL/SQL 25/11/2020
Règles générales
44
Commenter le code
Adopter une convention de casse
Développer une convention d’appel pour les
identifiants et autres objets
Indenter le code
Instruction SQL en majuscules
Mots-clés en majuscules
Type de données en majuscules
Identifiant et paramètres en minuscules
Tables & colonnes en minuscules
PL/SQL 25/11/2020
Conventions d’appel possible
45
LES CURSEURS
PL/SQL 25/11/2020
Introduction
47
PL/SQL 25/11/2020
Fonctionnalités
49
PL/SQL 25/11/2020
Attributs des curseurs
50
PL/SQL 25/11/2020
Curseur implicite
51
Exemple:
CURSOR emp_cur IS
SELECT * FROM EMP ;
PL/SQL 25/11/2020
Ouverture
54
OPEN / nomcurseur / ;
Exemple:
DECLARE
CURSOR emp_cur IS
SELECT * FROM emp ;
BEGIN
OPEN emp_cur ;
/ Utilisation du curseur /
END;
PL/SQL 25/11/2020
Lecture d'une ligne
55
PL/SQL 25/11/2020
Lecture d'une ligne (2)
56
DECLARE
CURSOR emp_cur IS
SELECT * FROM emp ;
ligne emp_cur%rowtype ;
BEGIN
OPEN emp_cur ;
LOOP
FETCH emp_cur INTO ligne ;
EXIT WHEN emp_cur%NOTFOUND ;
DBMS_OUTPUT . PUT_LINE ( ligne . ename ) ;
END LOOP ;
/.../
END;
PL/SQL 25/11/2020
Fermeture du curseur
57
PL/SQL 25/11/2020
Boucle For: exemple
59
DECLARE
CURSOR emp_cur IS
SELECT * FROM emp ;
ligne emp_cur%ROWTYPE ;
BEGIN
FOR ligne IN emp_cur LOOP
DBMS_OUTPUT . PUT_LINE (ligne.ename) ;
END LOOP ;
END;
/
PL/SQL 25/11/2020
Curseurs paramétrés
60
PL/SQL 25/11/2020
Curseurs paramétrés: Exemple
61
Créons une requête qui, pour une personne donnée, nous donne la
liste des noms et prénoms de ses enfants :
PL/SQL 25/11/2020
Curseurs paramétrés: Ouverture
62
Exemple:
OPEN enfants ( 1 ) ;
PL/SQL 25/11/2020
Curseurs paramétrés: Boucle for
63
Exemple:
PL/SQL 25/11/2020
Exemple récapitulatif
64
DECLARE
CURSOR parent IS
SELECT *
FROM personne WHERE pere is null OR mere is null ;
p parent%rowtype ;
CURSOR enfants (numparent NUMBER) IS
SELECT *
FROM personne WHERE pere = numparent OR mere = numparent ;
e enfants%rowtype ;
BEGIN
FOR p IN parent LOOP
DBMS_OUTPUT.PUT_LINE (' Les enfants de ' || p.prenom ||' '||p.nom ||' sont : ') ;
FOR e IN enfants (p.numpers) LOOP
DBMS_OUTPUT.PUT_LINE (' * ' || e.prenom || ' ' ||e.nom) ;
END LOOP ;
END LOOP ;
END;
PL/SQL 25/11/2020
Bases de données avancées
65
LES PROCÉDURES ET
LES FONCTIONS
STOCKÉES
PL/SQL 25/11/2020
Fonctions et procédures stockées
66
Pourquoi?
Comme une table ou une vue, elles peuvent être utilisées par
d'autres utilisateurs, s'ils ont les droits voulus.
PL/SQL 25/11/2020
Déclaration procédure stockée
67
PL/SQL 25/11/2020
Déclaration procédure stockée: paramètres
68
PL/SQL 25/11/2020
Exemple de procédure stockée
69
PL/SQL 25/11/2020
Exemple de fonction stockée
71
PL/SQL 25/11/2020
Récursivité
73
PL/SQL 25/11/2020
Compilation et suppression
74
PL/SQL 25/11/2020
Exemple
75
PL/SQL 25/11/2020
Exemple (suite)
76
...
BEGIN
DBMS_OUTPUT.PUT_LINE('Les acteurs ayant joué dans plus de
'||nbFilms||' films sont : ') ;
OPEN lesActeurs ;
LOOP
FETCH lesActeurs INTO sonNomPre ;
EXIT WHEN lesActeurs%NOTFOUND ;
DBMS_OUTPUT.PUT_LINE(' '||sonNomPre.nomIndividu||'
'||sonNomPre.prenomIndividu) ;
END LOOP ;
DBMS_OUTPUT.PUT_LINE(chr(10)||'Le nombre d''acteurs ayant joué
dans plus de '||nbFilms||' films est: '|| lesActeurs%rowCount);
CLOSE lesActeurs;
END;
PL/SQL 25/11/2020
Bases de données avancées
77
TRIGGERS
PL/SQL 25/11/2020
Déclencheur (Trigger)
78
PL/SQL 25/11/2020
Caractéristiques d'un Trigger
79
PL/SQL 25/11/2020
Description d'un trigger
80
À l'ordre
Le trigger ne s'applique qu'une fois
PL/SQL 25/11/2020
Structure d'un déclencheur
81
Événement
Ordre
BEFORE
ROW
INSERT
UPDATE Table
AFTER DELETE
PL/SQL 25/11/2020
Eléments constitutifs
82
PL/SQL 25/11/2020
Résolution multi-événements
84
CREATE OR REPLACE TRIGGER myFirstTrigger
AFTER UPDATE OR INSERT ON emp
FOR EACH ROW
BEGIN
DBMS_OUTPUT.ENABLE(20000);
IF INSERTING THEN
DBMS_OUTPUT.PUT_LINE(' INSERT ');
END IF;
IF UPDATING('ENAME') THEN
DBMS_OUTPUT.PUT_LINE(' UPDATED ' || :NEW.ENAME);
END IF;
END;
/
SQL> UPDATE emp SET ename = 'TOTO' WHERE empno = 7839;
UPDATED TOTO
1 row updated.
PL/SQL 25/11/2020
Typologie d'un Trigger
85
BEFORE AFTER
BEFORE UPDATE ligne AFTER UPDATE ligne
BEFORE DELETE ligne AFTER DELETE ligne
BEFORE INSERT ligne AFTER INSERT ligne
BEFORE UPDATE ordre AFTER UPDATE ordre
BEFORE DELETE ordre AFTER DELETE ordre
BEFORE INSERT ordre AFTER INSERT ordre
PL/SQL 25/11/2020
Mise hors-service d'un Trigger
86
PL/SQL 25/11/2020