Professional Documents
Culture Documents
cours
Partie
I:
Lang
age
PL/SQ
L
Bases de
donnes
avances
CYCLE INGNIEUR 2ME ANNE
INFORMATIQUE
M
o
h
a
m
e
d
A
l
Prse
ntatio
n du
langa
ge
Struct
ure
dun
bloc
Types
scalai
res et
comp
oss
Curse
urs
implic
ites et
explic
ites et
excep
tions
Sous
progr
amme
s
stock
s
i
B
E
N
H
A
S
S
I
N
E
F
a
c
u
l
t
d
e
e 2016
(SESAME)
mohamedali.benhassine
utm.tn
S
c
i
e
n
c
e
s
20
16
20
17
d
e
T
u
n
i
s
Med Ali Ben Hassine 2016
(SESAME)
mohamedali.benhassine@fst.utm.tn
2016-2017
Chapitre
1 : Le
langage
PL/SQL
Mohamed
Ali
BEN
HASSINE
Facult
des
Sciences
de Tunis
M
e
d
A
l
i
B
e
n
H
a
s
s
i
n
Package
Dclencheurs
s
e
u
r
s
2
Les
es avances
Pro
cd
ure
Gnralits
s,
fon
L'architectu
ctio
ses e
Plan
re
PL/SQL
ns
dans Oracle
et
lments
pac
de
syntaxe
kag
PL/SQL
es
Les dclarations
%type,
%rowtype,
Les
Table
imbrique,
dcl
enc
erreurs
heu
Les instructions
rs
Record,
Affectatio
n,
IF,
WHILE,
LOOP
Les
propos
(depui
s
sa
versio
n 6)
une
extens
ion
SQL:
PL/SQL
Introduction:
Pourquoi
PL/SQL ?
SQL est un langage dclaratif
non procdural
Il
n'intgre
aucune
structure de
contrle
permettant
par exemple
d'excuter
une
boucle
itrative.
Les
traitements
complexes
sont
parfois
difficiles
crire si on ne
peut
pas
utiliser
des
variables
et
des structures
de contrle de
la
programmation classique
comme les boucles et les
alternatives
On ressent
vite le besoin
dun
langage
procdural
pour
lier
plusieurs
requtes
SQL
avec
des
variables
et
dans
les
structures de
programmation habituelles
Pour
ces
raisons,
le
SGBD Oracle a
IG
n
ral
it
s
(s
uit
e)
I
n
s
t
r
u
c
t
i
o
n
s
S
Q
L
s
s
d
a
x
/
S
Q
L
P
r
a
la partie interrogation
: SELECT
la partie manipulation
: INSERT, UPDATE,
DELETE
la partie gestion des
transactions : COMMIT,
ROLLBACK,
SAVEPOINT, ...
Instructions
spcifiques au PL/SQL
t
i
q
u
e
m
e
n
l
a
g
e
s
t
i
o
n
t
a
d
e
s
v
e
c
v
a
r
iable
s
(dcl
arati
on,
valori
satio
n,
utilis
ation
)
les
struc
tures
de
contr
les
(squ
ence,
condi
tionn
elle,
itrat
ion)
la gestion des
curseurs
(traitement
des
rsultats
dune
requte ligne par
ligne)
le
traitement
des
erreurs
(exceptions)
I- Gnralits sur
PL/SQL
PL/SQL Procedural Language/SQL
Initialement propritaire Oracle
NB: PL/pgSQL de PostgresSQL est trs
similaire au PL/SQL Oracle
Apparat dans la
norme SQL3 en tant
que
SQL/PSM
(Persistent Stored
Modules)
PL/SQL est un
langage
L4G
(langage
de
quatrime
gnration)
Interface
procdurale au SGBD
Oracle.
intgre parfaitement
le langage SQL en lui
apportant
une
dimension
procdurale.
6
I- Gnralits
(suite)
PL/SQL permet de
manipuler de faon
complexe les donnes
contenues dans une
BD Oracle
Transmet un bloc de
commandes au SGBD
au lieu d'envoyer une
requte SQL.
Les traitements sont
donc directement
U
ti
li
s
a
ti
o
n
IGnrali
ts
(suite)
PL/SQL est utilis pour
crire des mthodes
(fonctions et
procdures) de type,
triggers, packages,
procdures et fonctions
stockes dans Oracle.
D'autre part
le
langage
PL/SQL permet
de faire appel
des
procdures
externes, crites
dans un autre
langage
(gnralement le
langage C, rcemment Java).
Principe du langage PL/SQL
PL/SQL
permet
de
dfinir
un
ensemble
de
commandes
contenues dans
un "bloc"
PL/SQL.
Un bloc
PL/SQL peut
lui-mme
contenir des
sous blocs et
ainsi
de
suite. La
syntaxe
PL/SQL
est
simple
et
lisible
S
e
r
v
e
u
r
:
D
fi
ni
r
d
e
s
o
bj
e
ts
"
p
r
o
g
r
a
m
m
e
s"
persistan
ts
procdur
es
stockes
(package
s,
procdur
es
et
fonctions
)
triggers
Ct Client :
en
SQLPlus,
permet
dcrire
des
blocs
anonym
es
Outils de
dvelop
pement
dinterfa
ce
graphiqu
e
Develop
er
Environnement
PL/SQL
Le schma suivant
montre le moteur PL/SQL
traitant un bloc. Le moteur
excute des instructions
procdurales mais envoie
des commandes SQL
l'excuteur de commandes SQL dans
le serveur d'Oracle.
10
Avantages de
PL/SQL
PL/SQL
est
langage
portable
performant
dans
traitement
de
transactions.
un
et
le
12
ses e
es avances
o
m
m
II- lments de
syntaxe de
PL/SQL
e
S
Q
L
)
P
L
/
S
c
o
p
o
t
r
e
i
f
,
$
#
b
_
lettre (lettre | chiffre | $ | # | _ )*
Tous
les
programmes
PL/SQL
sont
structurs en un
ou
plusieurs
blocs
qui
peuvent tre
imbriqus
ou
spars.
Un
bloc
s
:
B
l
:
dcl
arati
ons
cont
rle
de
flux
Com
man
des
oc
c
o
n
s
t
a
n
t
e
s
dure
s,
Fonc
tion
s
Stru
ctur
e
d'un
bloc
(ou
prog
ram
me)
PL/S
QL
[
n
o
m
_
d
u
_
b
l
v
a
r
i
a
b
l
e
s
]
B
E
G
I
N
-
o
c
]
[
D
E
C
L
C
o
m
m
a
n
d
e
s
A
R
E
D
c
l
a
r
a
t
i
o
n
s
e
x
c
u
t
a
b
l
e
s
[
E
X
C
E
P
T
I
O
N
-- traitement des
exceptions]
END [nom_du_bloc] ;
13
Les trois
types de
blocs
[DECLARE]
BEGIN
RETURN type
-- instructions
PROCEDURE
nom
IS
FUNCTION nom
Dclaratio
ns
Sert dfinir
les variables et
les constantes
utiliss dans le
bloc Elle est
optionnelle
Elle est dlimite
par
DECLARE (qui
spcifie le dbut) et
BEGIN (qui signifie la
fin)
IS
B
E
G
I
N
[
E
X
C
E
P
T
I
O
N
]
i
n
s
t
r
u
c
t
i
o
n
s
La
partie
Commandes
excutables et
Gestion des exceptions
constituent le corps
du bloc PL/SQL.
La
partie
Command
es
excutable
s
est
obligatoire
La
partie
Gestion
exceptions
io
n
s
d
e
bl
o
cs
des
est
optionnelle.
Ces 2 parties sont dlimites par les mot
BEGIN, EXCEPTION et END14
IIlment
s
de
syntaxe
de
PL/SQL
DECLARE
Imbricat
END;
Anonym
e
[EXCEPTIO
N]
END;
Procdure
B
l
o
c
a
n
o
n
y
m
e
:
b
l
o
c
s
a
n
s
n
o
m
BEGIN
i
n
s
t
r
u
c
t
i
o
n
s
R
E
T
U
R
N
v
a
l
e
u
r
;
[
E
X
C
E
P
T
I
O
N
]
E
N
D
;
Fonction
dclarations ;
BEGIN
instruction_executable ;
DECLARE
d
c
l
a
r
a
t
i
o
n
s
-- un bloc imbriqu
u
c
;
B
E
G
I
N
c
l
a
r
d
a
n
s
u
n
e
a
p
p
l
i
c
a
t
i
o
n
l
a
r
e
e
x
c
u
t
o
n
p
e
u
t
l
i
n
c
l
u
r
e
d
a
n
s
i
l
u
n
d
o
i
t
p
r
c
o
m
p
i
l
a
t
e
u
r
p
r
o
g
r
a
m
m
e
s
o
u
d
a
n
s
a
y
a
n
t
u
n
u
n
t
r
i
g
g
e
r
n
o
m
,
d
e
s
P
r
o
c
d
u
r
e
s
p
a
r
a
m
t
r
e
s
e
t
f
o
n
c
t
i
o
n
s
:
d
e
s
s
o
u
s
-
v
e
n
t
u
e
l
l
e
m
e
n
t
s
t
o
g
e
s
t
i
o
n
_
d
_
e
x
c
e
p
t
i
o
n
c
k
a
b
l
e
s
d
a
n
s
;
E
N
D
l
e
;
..instruction_executable ;
s
e
r
v
e
u
r
EXCEPTION
gestion_d_exception ;
END
;
16
o
u
d
a
n
s
l
a
p
p
l
i
c
a
t
i
o
n
invocables partir dautres sousprogrammes et dclencheurs
15
ses e
es avances
I
I
m
e
n
t
s
d
e
s
y
n
t
a
x
e
d
e
P
L
/
S
Q
L
l
e
s
c
o
m
m
e
n
t
a
i
r
e
s
Une
ligne
de
comm
entair
e
comm
ence
par le
doubl
e
signe
- - et
se
termi
ne
la fin
de la
ligne.
Les
commentai
res
sur
plusieurs
lignes sont
dlimits
par
les
caractres
/*
*/
(comme
en C)
C
e
c
i
e
s
t
u
n
c
o
m
m
e
n
t
aire sur
une
ligne /*
Ceci
est un
comme
ntaire
qui
tient
sur
plusieu
rs
lignes comme dans
les langages C et
Java */
I
N
S
E
L
E
C
T
q
u
a
n
t
i
t
y
I
N
T
O
n
u
17
m
_
i
n
_
Exemple 2 de
programme
PL/SQL
s
t
o
c
k
DECLARE
_
i
r
y
(
5
E
R
E
G
r
o
u
c
u
m
'
c
k
>
A
C
Q
U
'
D
A
'
a
s
t
o
_
t
b
l
t
o
a
n
i
s
a
n
i
t
N
D
I
F
;
I
T
;
p
r
o
u
c
a
l
'
N
N
'
INSERT
i
o
INTO
purchase_rec
ord
VALUES
('TENNIS
RACQUET
PURCHASED.
',SYSDATE);
ELSE
--
signaler que
le stock est
insuffisant
INS
ERT INTO
purchase
_record
VALUES
('OUT. OF
TENNIS
RACQUET
.',SYSDAT
b
l
o
c
Exemple 1 de
Programme PL/SQL
19
SQL> DECLARE
2 laQuantitEnStock Article.quantitEnStock%TYPE;
3 BEGIN
4
FROM Article
IF laQuantitEnStock = 0 THEN
8
DBMS_OUTPUT.PUT_LINE('L article est en
rupture de stock');
9
ELSE
10
11
12
DBMS_OUTPUT.PUT_LINE(laQuantitEnStock);
END IF;
13 EXCEPTION
14
15
16
17
RAISE_APPLICATION_ERROR(-20001,'Erreur souleve par
le SELECT');
1
8
E
N
D
;
F
i
n
d
u
b
l
o
c
1
9
/
Quantit en stock :20
PL/SQL procedure successfully completed.
18
III- Les
dclarations
PL/SQL est un langage
typage fort (tout objet
de prog doit tre dclar)
Les variables peuvent
s
i
e
(
u
t
i
l
i
s
a
t
e
u
r
s
)
- Traitement ultrieur dans le flux de donnes
3. Possibilit de rutilisation
- Utilisation rpte par rfrence partir
dautres instructions dclaratives
4. Facilit de maintenance
d
e
d
o
n
n
e
s
V
a
l
i
d
a
t
i
o
n
d
u
n
e
s
a
i
ses e
es avances
e
O
III- Les
dclaration
s (suite)
r
a
c
l
e
e
t
V
a
r
i
a
b
l
e
s
t
y
p
e
B
o
o
l
P
L
/
S
Q
L
C
o
m
p
o
s
i
t
e
s
S
c
a
l
a
i
r
e
s
:
Reoivent une seule valeur
T
y
p
e
s
S
Q
L
d
(
%
R
O
W
T
Y
P
E
,
R
E
C
O
R
D
e
t
s
e
t
T
Y
P
E
)
Permettent
de dfinir et
de manipuler
des groupes
de champs
(analogues
au struct de
C
et
les
record
de
Pascal)
Rfrences (REF)
T
y
p
i
q
u
e
m
e
n
t
d
e
s
p
o
i
n
t
e
u
r
s
s
u
r
d
e
s
o
b
j
(
S
Q
L
3
)
N
o
n
c
o
u
v
e
r
t
e
s
d
a
n
s
c
e
c
o
u
r
s
Recoi
vent
des
pointe
urs
sur
des
objets
volum
ineux
(com
me
des
image
s)
stock
s
lextr
ieur
de la
table
n
o
m
Variables
attaches
et
Variables
htes
dclars dans des
pr-compilteurs (C,
COBOL, ),
les
champs dcran des
applications Forms
et
les
variables
hotes iSQL*plus.
u
n
21
III- Les
dclarati
ons
Dclaration de constantes
et variables
declaration_de_variable
nom_va
riable
[CONST
ANT]
{type |
table.at
tribut
%Type |
table
%Rowty
pe}
[NOT
NULL]
[{:=
|
DEFAUL
T}expre
ssion_P
L/SQL];
DECLARE
v
a
r
i
a
b
l
e
p
o
u
r
l
e
c
l
i
e
n
t
c
o
u
r
a
n
t
n
o
m
_
c
l
i
e
n
t
V
a
r
c
h
a
r
(
1
5
)
;
-- constante
rabais gale
0.1
rduction
CONSTANT
Number(3,2) :=
0.1;
23
n
o
m
V
A
R
C
H
A
R
2
(
3
0
)
;
22
radius REAL := 1;
a
r
e
a
R
E
A
L
:
=
p
i
*
r
a
d
i
u
s
*
*
2
;
ses e
es avances
b
l
o
o
d
_
t
y
p
e
C
H
A
R
D
E
F
A
U
L
T
num_client
VARCHAR2(
5)
NOT
NULL
DEFAULT
'AJ235'
v_dateNaiss
ance DATE;
/* quivaut
v_dateNaissance DATE:= NULL;
2. Dclaration de constantes
Analogue
la
dclaration de variables
avec ajout du mot-cl
CONSTANT
Pi
CONSTANT NUMBER :=
3.14159;
24
III- Les
III- Les dclarations: types
dclarat
dynamiques %type
ions
Porte et
1. Le type dynamique
visibilit des
%type permet d'associer
variables
une variable le type d'une
autre variable, d'une
constante
ou
d'une
colonne de table ou de
vue.
DECLARE
A CHAR;
B REAL;
Intrt: permet de ne
pas avoir modifier les
programmes si on modifie
le type d'une colonne.
BEGIN
/* A (CHAR) B (REAL) */
E
x
e
m
p
l
e
:
D
E
C
L
A
R
E
A
I
N
T
E
G
E
R
;
C
REAL
;
BEGI
N
.
END;
D
E
D
E
C
L
A
R
E
CLAR
E
D
C
H
A
R
;
BEGI
N
END;
A: INTEGER
B,C: REAL
A,D: CHAR
B: REAL
- si dans un
bloc,
une
variable
du
mme nom que
la variable
GLOBALE existe c'est la
variable LOCALE qui s'impose
c
r
e
d
i
t
d
e
b
i
t
R
E
A
L
(
7
,
2
)
;
c
r
e
d
i
t
%
t
y
p
e
;
2. Le type dynamique
%type permet de faire
rfrence une colonne
d'une table
Exemple: On a
dans la BD, la table
: EMPLOYE (empno
NUMBER, ) On
peut
crire
un
programme PL/SQL
dclarant:
DECLARE
numro Employ.empno%type
--- la variable numro comme domaine de
valeur NUMBER
END;
25
26
a
g
e
Le
type
dynamique
%rowtype permet
d'associer une
variable un type
composite
correspondant :
un tuple d'une table
ou au type composite d'un
curseur (voir plus loin)
Exemple: On a dans la BD un
type:
create
type
EMPLOYE_ty
p
(empno
NUMBER,
nom
VARCHAR2(
30), sal
NUMBER);
create
table
Employe
_tab
(employ
e
Employe
_typ,
N
U
M
B
E
R
)
C
o
d
e
P
L
S
Q
L
:
DECLARE
emp_rec Employe_tab
%ROWTYPE;
BEGIN
e
m
p
_
r
e
c
.
e
m
p
l
o
y
e
.
e
m
p
n
o
e
m
p
_
r
e
c
.
Le type de donnes
RECORD (disponible depuis
la version 7) dfinit des
types composites ou
encore
structures
de
donnes
(quivalent
struct en
C). Depuis la version 8,
les
types
RECORD
peuvent
inclure
des
LOB (BLOB, CLOB et
BFILE)
ou
des
extensions objets (REF,
TABLE ou VARRAY).
e
m
p
l
o
y
e
.
n
o
m
27
28
ses e
es avances
Les types RECORD ne peuvent pas tre stocks dans une table.
DECLAR
E
TYPE
avionAir
bus_rec
IS
RECOR
D
(nserie
CHAR(1
0),
nomAvi
on
CHAR(2
0),
usine
CHAR(1
0) :=
'Blagna
c',
nbHVol
NUMBER
(7,2));
r
_
u
n
A
3
2
0
a
v
i
o
n
A
i
r
b
u
s
_
r
e
c
;
r
_
F
G
L
F
S
a
v
i
o
n
A
i
r
b
u
s
_
r
e
c
;
BEG
IN
r_un
A32
0.ns
erie
:=
'A1';
r
_
u
n
A
3
2
0
.
n
o
m
A
v
i
o
n
:
=
'
A
320-200';
r_unA320.nbHVol :=
2500.60;
r_FGLFS :
=
r_unA320
;
Dclaration du
RECORD
contenant
quatre champs
; initialisation
du
champ
usine
par
dfaut
Dclaration
de
deux
variables de
type
RECORD.
Initialisation des champs dun
RECORD
29
Il
est
possibl
e
quun
champ
dun
RECOR
D soit
luimme
un
RECOR
D, ou
soit
dclar
avec
les
directi
ves
%TYPE
ou
%ROW
TYPE.
Lexe
mple
suivan
t
illustre
le
RECO
RD
r_vols
dclar
avec
ces
trois
possibi
lits :
DECLARE
T
Y
P
E
a
v
i
o
n
A
i
r
b
u
s
_
r
e
c
IS
R
E
C
O
R
D
(n
se
ri
e
C
H
A
R(
1
0)
,
n
o
m
A
vi
o
n
C
H
A
R(
2
0)
,
u
si
n
e
C
H
A
R(
1
0)
:
=
'B
la
g
n
a
c',
n
b
H
V
ol
N
U
M
B
E
R(
7,
2)
);
T
Y
P
E
I
S
v
o
l
s
_
r
e
c
R
E
C
O
R
D
permettent de dfinir et de
Code
PL/S
QL
TYPE brevets_tytab
IS
TABLE
OF
VARCHAR2(6)
INDEX
BY
BINARY_INTEGER;
TYPE nomPilotes_tytab IS
TABLE OF Pilote.nom
%TYPE
INDEX
BY
BINARY_INTEGER;
Syntaxe
tab_brevets brevets_tytab;
Commentaires
Type
de
table
aux
de
chan
es de
six
carac
tres.
Typ
e
de
tabl
eau
x
de
colo
nne
s de
typ
e
no
m
de
la
tabl
e
Pilo
te.
TYPE
pilotes_tytab IS TABLE OF Pilote
Type
%ROWTYPE
INDEX
BY
de
BINARY_INTEGER;
tablea
ux
denre
gistre
tab_nomPilotes nomPilotes_tytab;
ments
de
type
de la
table
Pilote.
Dclaration des tableaux.
BINARY_INTEGER];
es avances
ses e
type_lment
est le type des
lments
de
cette
table.
Peut tre tout
type autoris
par
PL/SQL
sauf:
REF
CURSOR
BEGIN
tab_brevets(-1) := 'PL-1';
tab_brevets(2) := 'PL-2';
Initialisations.
tab_nomPilotes
(7800)
:=
'Bidal';
t
a
b
_
p
i
l
o
t
e
s
(
0
)
.
b
r
e
v
e
t
:
=
'
P
L
0
'
;
E
N
D
;
31
32
6
)
O
F
III- Les
dclarations:
VARRAY
Dclaration :
TYPE
nom_type
IS
VARRAY
(
taille_limite) OF
type_lment
[NOT NULL];
nom_type est le
nom du type
varray
table
dfini
taille_limite est la taille max du
tableau
type_lm
ent est le
type
des
lments
de
cette
table. Peut
tre
tout
type
autoris
par PL/SQL
sauf: REF
CURSOR
Exemple
DECLARE
T
Y
P
E
C
a
l
e
n
d
a
r
I
S
V
A
R
R
A
Y
(
3
6
D
A
T
E
;
T
Y
P
E
E
m
p
F
i
l
e
I
S
V
A
R
R
A
Y
(
2
0
)
O
F
e
m
p
.
e
n
a
m
e
%
T
Y
P
E
;
T
Y
P
E
A
n
E
n
t
r
y
m
p
E
m
p
F
i
l
e
;
I
S
R
E
C
O
R
D
(
t
e
r
m
V
A
R
C
H
A
R
2
(
2
0
)
,
c
a
l
e
n
d
r
i
e
r
C
a
l
e
n
d
a
r
;
33
m
e
a
n
i
n
g
V
A
R
C
H
A
R
2
(
2
0
0
)
)
;
TYPE Glossary IS VARRAY(250) OF
AnEntry;
-l
e
s
_
e
IVTraite
ment
des
erreu
rs
PL/SQL
offre
un
moyen
d'identifie
r et de
traiter les
erreurs
l'aide du
mcanism
e
des
exception
s
(Analogue
au
mcanisme
Java).
de
Affichage
Pour
affic
her
PL/SQL dfinit
en standard un
grand
nombre
d'exceptions
(c'est-- dire des
types d'erreurs).
un
com
men
taire
:
DBM
De
plus, il
est
possibl
e
de
dfinir
ses
propre
s
except
ions
S_O
UTP
UT.P
UT_
LINE
(tex
te_
mes
s);
ce qui
offre
de
nombr
euses
possibil
its
Pour
affich
er
le
conte
nu
dune
variab
35
le
on
utilise
:
DBMS
_OUTP
UT.PU
T_LIN
E(no
m_var
);
Laffichage
dun
commentaire
suivi
de
laffichage du contenu dune
variable:
ses e
es avances
DBMS_OUTPUT.PUT_LINE(texte_mess ||
nom_var);
Laffichage ne sera visualis
que lorsque lordre SQL suivant
est excut dans
lenvironnement SQL+:
SQL> SET SERVEROUTPUT ON;
Fonctionnement:
Lorsqu'une exception est dtecte, il y
a:
Arrt de l'excution du
bloc et branchement sur
la section exception
Parcours des clauses
when jusqu' la bonne
excution des
instructions
associes
Une fois le traitement de l'erreur termin,
c'est le bloc suivant qui est effectu
de
bloc
36
s
p
a
r
o
r
1
.
E
x
c
e
p
t
i
o
n
s
d
f
i
n
i
e
s
p
a
r
o
r
a
c
l
e
N
o
m
m
a
c
l
e
e
x
:
T
O
O
_
M
A
N
Y
_
R
O
W
S
,
N
O
_
D
A
T
A
_
F
O
U
N
D
,
Z
E
R
O
_
D
I
V
IDE, ...
Se
dclenche
nt
automatiq
uement
Ncessit de prvoir la prise en
compte de l'erreur dans la section
EXCEPTION
2
.
D
f
i
n
i
t
i
o
n
d
u
t
r
a
i
t
e
m
e
n
t
a
s
s
o
c
i
W
H
E
N
n
o
m
_
e
x
c
eptio
n
THE
N
trait
eme
nt
3. Dclenchement:
Section dclarative
s
o
n
t
s
o
i
t
d
c
l
e
n
c
h
e
s
p
a
r
u
n
e
i
n
s
t
r
u
c
t
i
o
n
d
u
p
r
o
g
r
a
m
m
e
s
o
i
t
a
u
t
o
m
a
t
i
q
u
e
m
e
n
t
(
P
R
A
G
M
A
E
X
C
E
P
T
I
N
T
O
O
N
_
I
N
I
T
)
Ncessit de prvoir la prise en
compte de l'erreur dans la section
EXCEPTION
s
t
a
t
s
37
(
s
y
m
b
o
l
,
r
a
t
i
o
)
V
A
L
U
E
S
(
X
Y
Z
,
p
e
_
r
a
t
i
o
)
;
B
E
G
I
N
SELECT price / earnings INTO
pe_ratio FROM stocks;
-- erreur possible de division
par 0
I
N
S
E
R
T
I
C
O
M
M
I
T
;
EXCEPTION
-- prise en
compte erreur
division by
zero
W
H
E
N
ZE
RO
_DI
VI
DE
TH
EN
IN
SE
RT
IN
TO
sta
ts
(sy
m
bol
,
rat
io)
VA
LU
ES
(X
YZ
,
NU
LL)
;
COMMIT;
p
r
i
s
e
e
n
c
o
m
p
t
e
d
e
t
o
u
t
e
s
l
e
s
a
u
t
r
e
s
e
r
r
e
u
r
s
W
H
E
N
O
T
H
E
R
S
T
H
E
N
_
ROLLBACK;
END;
39
Dclarer
Associer
Traiter
m
m
Nommer l'exception
Coder le PRAGMA EXCEPTION_INIT Traiter
l'exception dclenche
Soi
t
lev
er
ma
nu
elle
me
nt
l'ex
ce
pti
on
I
S
N
U
L
L
T
H
E
N
n
o
e
m
p
:
=
RAI
SE
no
m_
ex
ce
pti
on
Section dclarative
traitement exceptions
Section excutable
Dclarer
Section
Activer
Nommer l'exception
Dclencher l'exception
Traiter
Traiter
l'exception dclenche
explicitement par la clause RAISE
38
v
_
v
e
n
d
.
e
m
p
n
o
;
R
A
I
S
E
p
a
s
_
d
e
_
c
o
m
m
;
E
N
D
I
F
;
END LOOP;
EXCEPTION
W
h
e
n
p
a
s
_
d
e
_
c
o
m
m
T
H
E
N
40
10
ses e
es avances
Exemple d'erreur
Exemple d'erreur dfinie
dfinie par utilisateur par utilisateur
On suppose quil existe une table COMPAGNIE et une table PILOTE
vec une contrainte de clef trangre entre les deux (un pilote appartient
DECLARE
deadlock_detected EXCEPTION;
PRAGMA
EXCEPTION_INIT(deadlock_detect
ed, -60);
BEGIN
... - traitement qui soulve une
erreur ORA-00060
E
N
R
O
EXCEPTION
A
C
s
e
END;
e
n
c
o
m
p
t
e
Excepti
on
"others"
d
e
l
'
e
r
r
e
u
r
W
H
E
N
O
T
H
E
R
S
s
q
l
c
o
d
e
:
c
o
d
e
T
H
E
N
d
e
c
o
d
e
:
=
s
q
l
c
o
d
e
;
mess:=sqlerrm;
db
m
s_
ou
tp
ut.
pu
t_li
ne
('e
rre
ur:
'
co
de
m
es
s);
EN
D;
l
'
e
r
r
e
u
r
o
r
a
c
l
e
s
q
l
e
r
r
m
:
l
i
b
e
l
l
d
e
l
'
e
r
r
e
u
r
Exemple
DECLARE
BEGIN
EXCEPTION
W
H
E
N
O
T
H
E
R
S
une compagnie)
Lors
quo
n
veut
supp
rimer
une
com
pagn
ie
qui a
enco
re
des
pilot
es :
ORA0229
2
enre
gistr
eme
nt
fils
exist
ant.
c
r
e
a
t
e
p
r
o
c
e
d
u
r
e
d
e
t
r
u
i
t
C
o
m
p
a
g
n
i
e
.
.
.
r
e
s
t
e
P
i
l
o
t
e
E
X
C
E
P
T
I
O
N
;
PRAGMA
Exception_init(restePilote,
-2292);
BEGIN
delete from compagnie
where comp =
MaCompagnie ;
EXCEPTION
w
h
e
n
r
e
s
t
e
P
i
l
o
t
e
t
h
e
n
publier
des
messages
d'erreurs dfinis par
l'utilisateur depuis
un bloc PL/SQL.
.
.
.
t
r
a
i
t
e
m
e
n
t
Lappel
la
procdure
RAISE_APPLICATION
_ERROR interrompt
le programme et
retourne
le
numro
et
le
message derreur
qui peuvent tre
rcuprs par
lenvironnement englobant (v
ariables SQLCODE et SQLERRM ).
d
e
ROR(numro_erreur,
e
r
r
e
u
r
message
[,{TRUE|
numro_erreur
:
numro
d'exception spcifi
par le dveloppeur
qui doit
se trouver entre -20000 et
20999.
message :
texte du
message d'une
longueur
maximum de
2048 octets
TRUE : indique
que l'erreur est
ajoute la
pile des erreurs
prcdentes
FALSE : indique
que l'erreur
remplace
toutes les
erreurs
prcdentes
FALSE}]);
.
.
.
E
N
D
;
41
42
RAISE_A
PPLICATI
ON_ERR
OR
La
procdure
RAISE_APP
LICATION_
ERROR
permet de
Syntaxe
RAISE_APPLICATION_ER
Du fait que
cette procdure
appartienne a un
paquetage
standard, il n'est
pas ncessaire
de
prfixer
cette
procdure
43
ses e
es avances
44
11
RAISE_APPLIC
ATION_ERRO
R
Exemple
47
45
Propagatio
n des
exceptions
Exemple 2
Propagation des
exceptions
Exemple 3
ses e
es avances
Propagation des
exceptions
48
12
C
L
A
R
V- Les
affectati
ons
E
s
a
l
a
i
r
e
S
o
i
t
N
U
M
B
E
R
;
p
a
r
l
'
o
p
r
a
t
e
u
r
B
E
G
I
N
s
a
l
a
i
r
e
d
'
a
f
f
e
c
t
a
t
i
o
n
:
=
D
E
:
=
2
0
0
0
;
S
o
i
t
p
a
r
l
a
;
B
E
G
I
N
SELECT sal
INTO salaire
FROM Employ
WHERE
nom='toto';
c
l
a
u
s
e
I
N
T
O
A
t
t
e
n
t
i
o
n
d
e
l
o
r
d
r
e
d
a
n
s
S
E
L
E
C
T
c
e
t
e
x
e
m
p
l
e
D
E
C
L
A
R
E
s
a
l
a
i
r
e
N
U
M
B
E
R
l
e
s
e
l
e
c
t
n
e
doit
ramene
r qu'un
tuple !
sinon
il
faut
utiliser
les
curseur
s.
49
V- Exemple
d'affectatio
n
On a dans la BD:
Create type
Person_type
AS
Object
(ssn
NUMBER,
nom
VARCHAR2(3
0));
Create
table
Person_tab
AS
Object
(person
Person_type,
age
NUMBER);
O
n
p
e
u
t
c
r
i
r
e
l
'
a
f
f
e
c
t
a
t
i
o
n
P
L
S
Q
L
:
D
E
C
L
A
R
E
m
a
_
p
e
r
s
o
n
P
e
r
s
o
n
_
t
a
b
%
r
o
w
t
y
p
e
;
B
E
G
I
N
S
E
L
E
C
T
*
I
N
T
O
m
a
_
p
e
r
s
o
n
F
R
O
M
p
e
r
s
o
n
_
t
a
b
;
d
b
m
s
_
o
u
t
p
u
t
.
p
u
t
_
l
i
n
e
(
m
a
_
p
e
r
s
o
n
.
p
e
r
s
o
n
.
s
s
n
)
;
E
N
D
;
/
51
V- Affectation de valeurs
une collection
Exemple 1
DECLARE
T
Y
P
E
C
o
u
r
s
e
L
i
s
t
I
S
T
A
B
L
E
O
F
V
A
R
C
H
A
R
2
(
1
6
)
;
T
Y
P
E
P
r
o
j
e
c
t
L
i
s
t
I
S
VARRAY(50)
OF
VARCHAR2(
16);
my_courses
CourseList;
a
c
c
o
u
n
t
i
n
g
_
p
r
o
j
e
c
t
s
P
r
o
j
e
c
t
L
i
s
t
;
B
E
G
I
N
my_cou
rses :=
Course
List(BD
R,
BDA,
IBD);
account
ing_proj
ects
:=Proje
ctList('
MADS,
IM2);
END;
C
l
i
e
n
t
e
l
e
(
)
;
-- initialisation d'un tableau vide
grce au constructeur
BEGIN
END;
50
V- Les blocs
L
e
s
a
s
p
e
c
t
s
p
r
o
c
d
u
r
Exemple 2
DECLARE
TYPE
Client
ele IS
VARR
AY(10
0) OF
Custo
mer;
vips
Client
ele :=
a
u
x
o
n
d
i
t
L
O
O
P
,
i
o
n
s
FOR i,
WHILE
I
F
T
H
E
N
E
L
S
E
E
N
D
I
F
C
A
S
E
I
t
r
a
t
i
o
n
B
r
a
n
c
h
e
m
e
n
t
s
s
q
u
e
n
t
i
e
l
s
G
O
T
O
NULL
52
13
ses e
es avances
I
F
;
V
I
F
T
H
E
N
E
L
S
E
1. IF THEN
I
F
c
o
n
d
i
t
i
o
n
T
H
E
N
s
e
q
u
e
n
c
e
_
o
f
_
s
t
a
t
e
m
e
n
t
s
E
N
D
2
.
I
F
T
H
E
N
E
L
S
E
I
F
c
o
n
d
i
t
i
o
n
T
H
E
N
s
e
q
u
e
n
c
e
_
o
f
_
s
t
a
t
e
m
e
n
t
s
1
E
L
S
E
s
e
q
u
e
n
c
e
_
o
f
_
s
t
a
t
e
m
e
n
t
s
2
E
N
D
I
F
;
3
.
I
F
f
_
s
t
a
t
e
m
e
n
t
s
1
E
L
S
I
F
c
o
n
d
i
t
i
o
n
2
T
H
E
N
s
e
q
u
e
n
c
e
_
o
f
_
s
t
a
t
e
m
e
n
t
s
2
T
H
E
N
E
L
S
I
F
I
F
c
o
n
d
i
t
i
o
n
1
T
H
E
N
s
e
q
u
e
n
c
e
_
o
E
L
S
E
s
e
q
u
e
n
c
e
_
o
f
_
s
t
a
t
e
m
e
n
t
s
3
E
N
D
I
F
;
VConditi
ons
L
e
s
c
o
n
d
i
t
i
o
n
s
p
e
u
v
e
n
t
c
o
m
p
o
r
t
e
r
l
e
s
o
p
r
a
t
e
u
r
s
s
u
i
v
a
n
t
s
:
s
t
r
u
c
t
i
o
n
1
.
=
,
<
,
>
,
!
=
,
a
p
r
<
=
,
>
=
,
l
e
<
>
2. IS [NOT] NULL
3. [NOT] BETWEEN
AND, [NOT] IN
4. [NOT] LIKE
5. AND, OR, NOT
I
l
d
o
i
t
y
a
v
o
i
r
a
u
m
o
i
n
s
u
n
e
i
n
T
H
E
N
E
x
e
m
p
l
e
BEGIN
I
F
s
a
l
e
s
>
5
0
0
0
0
T
H
E
N
b
o
n
u
s
E
N
D
:
=
1
5
0
0
;
E
L
S
I
F
I
F
;
I
N
S
E
R
T
I
N
T
O
s
a
l
e
s
p
a
y
r
o
l
l
>
3
5
0
0
0
V
A
L
U
E
S
T
H
E
N
(
e
m
p
_
i
d
,
b
o
n
u
s
:
=
b
o
n
u
s
,
5
0
0
;
ELSE
b
o
n
u
s
.
.
.
)
;
:
=
1
0
0
;
E
N
D
;
53
54
Forme gnrale
VL'instructio
n CASE
CASE selector
W
H
E
N
e
x
p
r
e
s
s
i
o
n
1
T
H
E
N
s
e
q
u
e
n
c
e
_
o
f
_
s
t
a
t
e
m
e
n
t
s
1
;
W
H
E
N
e
x
p
r
e
s
s
i
o
n
2
T
H
E
N
s
e
q
u
e
n
c
e
_
o
f
_
s
t
a
t
e
m
e
n
t
s
2
;
W
H
E
N
e
x
p
r
e
s
s
i
o
n
N
T
H
E
N
s
e
q
u
e
n
c
e
_
o
f
_
s
t
a
t
e
m
e
n
t
s
N
;
[
E
L
S
E
s
e
q
u
e
n
c
e
_
o
f
_
s
t
a
t
e
m
e
n
t
s
N
+
1
;
]
END CASE;
Si
une
condition est
vraie,
les
instructions
aprs
le
THEN
sont
effectues et
on sort
du
CASE
Si aucune
condition n'est
vraie,
les
instructions
associes
au
ELSE
sont
e
f
f
e
c
t
u
e
s
(
a
n
a
l
o
g
u
e
a
u
d
e
f
a
u
l
t
d
u
C
)
.
Si pas de ELSE,
PL/SQL ajoute la
clause (implicite) ELSE
suivante:
ELSE RAISE
CASE_NOT_FOU
ND;
55
V- Exemple de Case
ses e
es avances
CASE
WHEN grade = A THEN
dbms_output.put_line(Excelle
nt); WHEN grade = B THEN
dbms_output.put_line(trs
bien); WHEN grade = C
THEN
dbms_output.put_line(Bien);
WHEN grade = D THEN
dbms_output.put_line(Moye
n);
WHEN
grade = F
THEN
dbms_outpu
t.put_line(F
aible); ELSE
dbms_outpu
t.put_line(A
ucun
grade);
END CASE;
56
14
V- L'instruction
LOOP (rpeter)
V- L'instruction WHILE
(Tant que)
Format gnrale
LOOP
instructi
ons;
E
XI
T
[
W
H
E
N
C
O
N
D
IT
I
O
N
];
END
LOOP;
sortie si
la
condition
est vraie
W
H
I
L
E
c
o
n
d
i
t
i
o
n
L
O
O
P
T
r
a
i
t
e
m
e
n
t
d
e
l
a
b
o
u
c
l
e
END LOOP;
t
o
t
a
l
Exemple
WHILE total
<= 25000
LOOP
SELECT sal
INTO salary
FROM emp
WHERE
:
=
t
o
t
a
l
+
L
a
p
a
r
t
i
c
u
l
a
r
i
t
d
e
c
e
t
t
e
s
t
r
u
c
t
u
r
e
e
s
t
q
u
e
l
a
p
r
e
s
a
l
a
r
y
;
E
N
D
L
O
O
P
;
m
i
r
e
i
t
r
a
t
i
o
n
e
s
t
e
f
f
e
c
t
u
e
q
u
e
l
l
e
s
q
u
e
s
o
i
e
n
t
l
e
s
c
o
n
d
i
t
i
o
n
s
i
n
i
t
i
a
l
e
s
.
L
a
c
o
n
d
i
t
i
o
n
n
e
s
t
v
a
l
u
e
q
u
e
n
f
i
n
d
e
b
o
u
c
l
e
.
57
VL'instruct
ion FOR
Format gnrale
F
O
R
o
m
p
t
e
u
r
I
N
d
e
[
R
V
E
l
e
END LOOP;
n
f
.
.
s
u
p
L
O
O
P
T
r
a
i
t
e
Exemple
F
O
R
c
o
m
p
t
e
u
r
I
N
R
E
V
E
R
S
E
1
.
.
1
0
L
O
O
P
m
e
n
t
f
a
c
t
e
u
58
r
:
=
c
o
m
p
t
e
u
r
V- L'instruction
GO TO
Permet de
se brancher
une
tiquette du
bloc courant
BEGIN
*
2
;
INSERT INTO
T VALUES
(compteur,
facteur);
-- OK
END LOOP;
T: (10,20), (9,18), (8,
16), (7,14), (6,12), ,
(1,2)
GOTO insert_row;
59
<<insert_row>>
I
N
S
E
R
T
I
N
T
O
e
m
p
V
A
L
U
E
S
.
.
.
E
N
D
;
Attention: Un GO TO peut faire n'importe quoi
!!!
ses e
es avances
60
15
A
L
U
E
_
VL'instructi
on NULL
E
R
R
O
R
Cette
instruction
signifie
faire",
"ne
rien
passer
N
I
l'instruction
S
E
suivante
Exemple
EXCEPTION
W
I
V
U
E
H
E
.
.
O
L
;
W
W
H
E
N
V
H
E
N
O
Where sal>1200;
T
H
E
R
S
Deux types de
curseurs dans Oracle:
T
H
Implicite
s : crs
automati
quement
par
Oracle
pour ses
propres
traiteme
nts
Explicite
s : crs
par
l'utilisat
eur pour
pouvoir
traiter le
rsultat
de
requtes
E
N
N
U
L
L
;
E
N
D
;
61
VI- Les
curseurs
dans Oracle
Les curseurs
dans
Oracle
sont des zones
de travail pour
excuter les
ordres SQL,
stocker
leurs
rsultats et les
utiliser.
p
l
u
s
d
'
u
n
Exemple:
crire un bloc
PL-SQL
permettant
dafficher les
noms des
pilotes dont
les
salaires
sont
>
1200DT.
Select nom Into v_nom
Cette solution nest plus valable
parce quon ne peut
r
e
t
o
u
r
n
a
n
t
t
u
p
l
e
C
o
m
m
e
n
t
V- Ordres SQL
autoriss
c
l
a
r
a
t
i
o
n
(
D
E
C
L
A
R
E
)
o
u
v
e
r
t
u
r
e
(
O
P
E
N
)
utilisation
(FETCH)
fermeture (CLOSE)
63
L
e
s
o
r
d
r
e
s
d
e
g
e
s
t
i
o
n
d
e
s
t
r
a
n
s
action
s
L'ouvertur
e
provoque
l'excution
de
la
requte
associe.
ses e
es avances
1.
COMM
IT
2. ROLLBACK, ROLLBACK TO
3. LOCK TABLE
62
OPEN
nom_curs
eur
E
x
e
m
p
l
e
:
E
x
e
m
p
l
e
:
D
E
C
L
A
R
E
D
E
C
L
A
R
E
CURSOR c1 IS
SELECT
ename,
job FROM emp
WHERE
sal
<
3000; BEGIN
OPEN c1;
END;
64
16
VI- Les
curseurs
dans Oracle
FETCH: Permet de
parcourir une une
les
lignes
retournes
par
l'ouverture du
curseur.
Cette
commande
ne
ramne
qu'une
seule ligne, il faut
donc la
mettre dans une boucle
FETCH nom_curseur
INTO var1, var2,
o
var1,
var2
correspo
ndent
aux
colonnes
de
l'ordre
select
L'instruc
tion
FETCH :
a
v
a
n
c
e
l
e
p
o
i
n
t
e
u
l
a
p
r
o
c
h
a
i
n
e
l
i
g
n
e
d
e
l
'
e
n
s
e
m
b
l
e
a
c
t
i
f
,
l
i
t
l
e
s
d
o
par l'ordre
FETCH.
La
clause INTO
de
l'instruction
FETCH
contient
autant
de
variable
qu'il y a
de
colonnes
dans
la
clause
SELECT
de
la
requte
associe
au
curseur.
n
n
e
s
d
e
l
a
l
i
g
n
e
c
o
u
r
a
n
t
e
65
VI- Les
curseu
rs
dans
Oracle
d
e
l
'
e
n
s
e
m
b
l
e
a
c
t
i
f
,
extrait
valeurs
de
ligne actuelle
les place dans
variables de
clause INTO.
les
la
et
les
la
Le nombre de
variables dclarer
dpend du nombre
de champs retourns
Q
u
at
re
at
tri
b
ut
s
p
er
m
et
te
nt
d'
v
al
u
er
l'
ta
t
du
curseur:
1.
%NOTFOU
ND: vrai si
le dernier
fetch n'a
ramen
aucune
ligne
2. %FOUND (inverse de
%NOTFOUND)
3.
%ROWCOU
NT: compte
le nombre
de
fetch
excuts
sur
un
curseur 4.
%ISOPEN
Exemples
1
.
F
E
T
C
H
C
_
V
E
N
D
E
U
R
S
I
N
T
O
V
E
N
D
E
U
R
S
E
X
I
T
W
H
E
N
C
_
V
E
N
D
E
U
R
S
%
N
O
T
F
O
U
N
D
;
2. FETCH C_VENDEURS
INTO VENDEURS;
IF C_VENDEURS
%FOUND then insert
into
3. FETCH C_VENDEURS
INTO VENDEURS;
IF C_VENDEURS
%ROWCOUNT < 15
THEN
4. IF C_VENDEURS
%ISOPEN THEN
FETCH C_VENDEURS
INTO VENDEURS;
67
DECLARE
V
_
d
e
p
t
n
o
d
e
p
t
.
d
e
p
t
n
o
%
T
Y
P
E
;
V
_
d
n
a
m
e
d
e
p
t
.
d
n
a
m
e
%
T
Y
P
E
;
CUR
SOR
c1 IS
SELE
CT
dept
no,
d
n
a
m
e
F
R
O
M
d
e
p
t
;
B
E
G
I
N
open c1;
LOOP
F
E
T
C
H
c
1
I
N
T
O
V
_
d
e
p
t
n
o
,
V
_
d
n
a
m
e
;
CURSOR
c1
IS
SELECT
deptno,
dname,
loc
FROM
dept;
dept_rec
c1%RO
WTYPE;
BEGIN
open c1;
LOOP
FETCH c1 INTO dept_rec;
66
j
o
b
%
T
Y
P
E
;
f
a
c
t
e
u
r
I
N
T
E
G
E
R
:
=
2
;
CURSOR
c1
IS
SELECT facteur*sal
FROM emp WHERE
job
=
my_job;
BEGIN
OPEN c1;
LOOP
F
E
T
C
H
c
1
I
N
T
O
m
y
_
s
a
l
;
E
X
I
T
W
H
E
N
c
1
%
N
O
T
F
O
U
N
D
;
f
a
c
t
e
u
r
:
=
f
a
c
t
e
u
r
+
1
;
E
N
D
L
O
O
P
;
END;
68
17
ses e
es avances
:
=
VI- Utilisation
simplifie des
curseurs
Le
curseur FOR
LOOP
remplace
OPEN,
s
a
l
a
r
y
_
t
o
t
a
l
FETCH et
CLOSE Ce
curseur
dclare
impliciteme
nt un index
(ici
emp_rec)
pour se
parcourir.
Cette faon sappelle la forme
condense et utilise la structure
FOR.
DECLARE
CURSOR c1 IS SELECT
ename, sal, hiredate,
deptno FROM emp;
BEGIN
FOR emp_rec IN c1 LOOP
s
a
l
a
r
y
_
t
o
t
a
l
+
e
m
p
_
r
e
c
.
s
a
l
;
E
N
D
L
O
O
P
69
e
m
p
.
e
n
a
m
e
%
T
Y
P
E
;
BULK COLLECT
BULK COLLECT: permet de
rcuprer un ensemble de lignes
dans une table plutt que ligne
aprs ligne
Il faut:
Dclarer une table imbrique
(nested) pour chaque colonne de
l'ordre select, ou crer une table
imbrique d'un type compos de
chaque colonne de l'ordre select
n
u
m
s
N
u
m
T
a
b
;
names NameTab;
CURSOR c1 IS
SELECT empno,
ename
FROM
emp WHERE job
=CLERK;
BEGIN
OPEN c1;
FETCH c1 BULK COLLECT INTO nums,
names;
CLOSE c1;
END;
70
eptRecT
ab
IS
TABLE
OF
BUL
K
COL
LEC
T
(suit
e)
dept
%ROW
TYPE;
dept_re
cs
DeptRe
cTab;
CURSO
R c1 IS
SELEC
T
deptno
,
dname
,
loc
FROM
DECLARE
T
Y
P
E
D
dept
WHER
E
deptno
> 10;
BEGIN
OPEN c1;
F
E
T
C
Collections
dans
PL/SQL
H
c
1
ses e
es avances
1. Varray
2. Nested table
U
L
K
Chaque
lment possde
un
index
qui
dtermine
sa
position dans la
collection On
va
pouvoir
parcourir
squentiellement
les collections
C
O
L
L
E
C
T
I
N
Parcourir
une
collection:
mthodes
applicables
sur
les
collections:
T
O
d
e
p
1.
EXISTS
2. COUNT
3. LIMIT
4. FIRST and LAST
5. PRIOR and NEXT
t
_
r
e
c
s
Application:
E
N
D
;
nom_collection.nom_mthode[(par
amtres)]
71
72
18
pr
c
de
l'in
de
x n
da
ns
la
col
lec
tio
n.
NE
XT(
n)
ret
our
ne
l'in
de
x
qui
sui
t
l'in
de
x n
da
ns
la
col
lec
tio
n.
Exemple:
Collections
dans
PL/SQL
EXISTS
EXISTS(n)
retourne
TRUE si le
nime
lment de
la collection
existe
Exemple:
IF courses.EXISTS(i)
THEN courses(i) :=
new_course;
END IF;
COUNT
COUNT
retourne le
nombre
d'lment
s que la
collection
contient
Exemple:
IF projects.COUNT =
25 THEN
...
73
Collections
dans PL/SQL
(suite)
PRIOR et NEXT
PRIOR(n)
retourne
l'index qui
i :=
courses.FI
RST;
WHILE i IS
NOT NULL
LOOP
t
r
a
i
t
e
m
e
n
t
Collections dans
PL/SQL
s
u
r
FIRST et LAST
c
o
u
r
s
e
s
(
i
)
FIRST
and
LAST
retour
nent
l'inde
x de
la
collec
tion
Si
la
collec
tion
est
vide
ils
retour
nent
NULL
Exemple:
FOR i IN
courses.FIRST..courses.LAST LOOP
i
:
=
c
o
u
r
s
e
s
.
N
E
X
T
(
i
)
;
END LOOP;
p
o
u
r
75
a
c
c
d
e
r
u
n
cours
es(1)
ou
cours
es(co
urses.
FIRST)
ses e
es avances
lme
nt
partic
ulier:
74
76
19
Utilisation des
procdures et des
fonctions
Lutilisation
des
procdures
et des fonctions
stockes permet
denregistrer et
dexcuter
des
traitements
frquemment
utiliss au
niveau du noyau
du SGBDR plutt
que dans
chaque
application.
Un seul
exemplaire du
traitement est
donc dfini et
stock dans la
base et
il
est
excutable, en
mode partag,
par toutes les
applications
qui
y
font
rfrence.
Une
procdu
re
ou
une
fonction
stocke
peut
tre
appele
: en
mode
interactif
dans une application cliente
dans un
programm
e
hte
uti
lis
an
t
de
s
or
dr
es
S
Q
L
int
g
r
(P
R
O
x)
da
ns
d
au
tr
es
pr
oc
d
ur
es
ou
fo
nc
tio
ns
st
oc
k
es
dans un corps de
dclencheur
77
Les
procdu
res et les
fonctions
r
y
F
CREAT
E
PROCE
DURE
raise_s
alary
(emp_i
d
INTEGE
R,
amoun
t REAL)
IS
current
_salary
REAL;
s
R
O
M
e
m
p
W
H
E
R
E
e
m
p
n
o
s
s
n
g
c
u
a
r
E
G
N
SEL
ECT
sal
INT
O
curr
ent_
sala
N
U
L
L
T
H
EN
RAI
SE
sala
ry_
Cration des
procdures et les
fonctions
mis
sing
;
ELS
E
Les procdures
UP
CREATE
[OR
REPLACE]
PROCEDURE
Nom_Procedure
[(paramtre[,
paramtre]...)] [IS | AS ]
[
d
c
l
a
r
a
t
i
o
n
s
DA
TE
em
p
SET
sal
=
sal
+
am
oun
t
WH
ER
E
em
l
o
c
a
l
e
s
]
pno
=
em
p_i
d;
EN
D
IF;
B
E
G
I
N
EXCEPTION
WHEN
NO_DATA_FOUN
D THEN INSERT
INTO emp_audit
VALUES(emp_id,
'No such
number');
Corps PL-SQL
[
E
X
C
E
P
T
I
O
N
WHEN
salary_missing
THEN
INSERT
INTO emp_audit
VALUES(emp_id
, 'Salary is
null');
END raise_salary;
79
e
x
c
e
p
t
i
o
n
h
a
n
d
l
e
r
s
]
e
x
c
e
p
t
i
o
n
E
N
D
[
n
o
m
_
P
r
o
c
e
d
u
r
e
]
;
h
a
n
d
l
e
r
s
]
E
N
D
[
N
o
m
_
F
o
n
c
t
i
o
n
]
;
Les fonctions
[CREATE [OR REPLACE ] ] FUNCTION
Nom_fonction [ ( parameter [ ,
parameter ]... ) ] RETURN datatype
[IS | AS ]
[
d
c
l
a
r
a
t
i
o
n
s
78
l
o
c
a
l
e
s
]
Les procdures et
les fonctions
Utilisation dans un bloc PL/SQL:
B
E
G
I
N
1. nom_proc();
2. Variable := nom_fonc();
Corps PL-SQL
[
E
X
C
E
P
T
I
O
N
U
t
i
l
i
s
a
ses e
es avances
tion
d'une
procd
ure
dans
SQL+:
1.
variable
nom_var
type
2. execute nom_proc ();
3. print nom_var
Utilisat
ion
d'une
fonctio
n dans
SQL+:
: 1.
variabl
e
nom_va
riable
type
2. execute variable := nom_fonc ();
3. print nom_variable
D
r
o
p
F
u
n
c
t
i
o
n
n
o
m
_
f
u
n
c
t
i
o
n
Drop Procedure nom_procedure
80
Suppres
sion
d'une
fonction
/proced
ure :
20
Modification des
Procdures et des
Fonctions stockes
Suite
aux
volutions
des
applications
on
peut tre amen
modifier quelques
procdures
ou
fonctions
existantes. Il faut
les recompiler avec
la commande suivante :
A
L
T
E
R
P
R
O
C
E
D
U
R
E
n
o
m
p
r
o
c
e
d
u
r
e
C
O
M
P
I
L
E
;
A
L
T
E
R
F
U
N
C
T
I
O
N
n
o
m
f
o
n
c
t
i
o
n
C
O
M
P
I
L
E
;
Recherche des
messages derreurs de
compilation
Pour dterminer
la
cause
chec
dun
la
compilation
dun
code, on utilise :
la
commande
SHOW ERRORS de
SQL*PLUS
qui
TYPE
EmpR
ecTyp
IS
RECO
RD
(emp_i
d INT,
salary
REAL);
CURSOR desc_salary
RETURN EmpRecTyp;
PROCED
URE
hire_emp
loyee
(ename
VARCHA
R2,job
VARCHA
R2, mgr
NUMBER,
sal
NUMBER,
comm
NUMBER,
deptno
NUMBER)
;
PROCED
URE
fire_empl
oyee
(emp_id
NUMBER)
;
END emp_actions;
Les
Packages
(spcificatio
ns)
83
CREATE
OR
REPLACE
PACKAGE
emp_actions
AS
-specification
s
,
Exceptions
Les Packages
Un Package
permet
de
regrouper
d'autres objets :
procdures,
fonctions,
v
a
r
i
a
b
l
e
s
e
t
c
o
n
s
t
a
n
t
e
s
,
c
u
r
s
e
u
r
Les
objets
stock
s dans
un
packa
ge
peuve
nt tre
public
s
:
access
ibles
par
tout le
monde
privs: accessibles que de
l'intrieur du package
P
r
s
e
n
t
a
t
i
o
n
:
D
e
u
x
p
a
r
t
ie
s
o
y
e
e
s
p
ci
fi
c
at
io
n:
l
m
e
nt
s
p
u
bl
ic
s
(
e
m
p
_
i
d
N
U
M
B
E
R
)
I
S
B
E
G
I
N
D
E
L
E
T
E
F
R
O
M
e
m
p
W
H
E
R
E
e
m
p
n
o
=
e
m
p
_
i
d
;
E
N
D
fire_e
mploy
ee;
END emp_actions;
ses e
es avances
S
Q
L
>
n
o
m
_
p
a
c
k
a
g
e
.
n
o
m
_
e
l
e
m
e
n
t
E
x
e
m
p
l
e
:
SQL>
emp_actions.hireEmployee('toto','progra
mmeur',3,5000,2000,4);
84
21
Le Package
DBMS_OUTP
UT
Le Package
DBMS_OUTPUT
Procdure
Permet
denvoyer des
messages
depuis
une
procdure,
une fonction,
un package
ou
un
dclencheur
(trigger) de la
base
de
donnes.
Ses procdures
peuvent tre soit
incorpors dans le
corps dun bloc
PL/SQL, soit mises
en
uvre
de
manire
interactive.
GET_LINE
INTEGER)
Action
GET_LINE(ligne OUT VARCHAR2, statut OUT
EW_LINE
NEW_LINE(ligne OUT VARCHAR2, statut OUT INTEGER)
Procdures accessibles:
l
e
t
u
t
_
'
l
i
g
n
e
A
p
p
e
l
:
1. faire tout d'abord la
commande: SET
SERVEROUTPUT ON
2.
dbms_output.nomproc( );
3. exemple:
dbms_output.putline('rsultat')
;
85
Le Package
DBMS_OUTP
UT
Exemple : Utilisation de
GET_LINE
Il est possible
dextraire une ou
plusieurs lignes
partir du tampon
(buffer).
La
procdure
GET_LINE permet
den retirer une
seule
(de
type
VARCHAR2(255)).
Cette ligne est la premire qui
a t mise dans le tampon.
Si lexcution
est correcte, le
paramtre statut
reoit 0. Sil ny a
plus de lignes dans
le tampon, le
paramtre statut
reoit 1.
es avances
ses e
PUT
PUT _LINE
c
o
m
bi
n
ai
s
o
n
d
e
P
U
T
e
t
d
e
N
E
W
_
LI
N
E
E
N
A
B
L
E
PUT_LINE(variable | constante)
E
N
A
B
L
E
(t
ai
ll
e
_t
a
m
p
o
n
)
Activation du paquetage
dans la session. Lappel de
cette procdure sera
ignor
si
le
package
DBMS_OUTPUT nest pas
activ
(SET
SERVEROUTPUT ON).
DISABLE
DISABLE
Dsactivation du paquetage
dans
la
session
(dsactivation des appels
aux procdures PUT_LINE
NEW_LINE, , et vidage du
tampon
de
toutes
les
informations quil contient.
86
Le Package
DBMS_OUTPUT
Exemple : Utilisation de GET_LINES
La procdure GET_LINES(tab
OUT
DBMS_OUTPUT.CHARARR,
nombreLignes IN OUT INTEGER)
22
systme
s
Les
trigg
ers
Pour
crer
des
dclen
Un dclencheur
ou trigger est un
traitement
dclench suite
un vnement.
cheurs
, il faut
dispos
er des
Nous ne nous
intresserons
quaux
dclencheurs de
BD. Un
ges
privil
syst
mes
dclencheur de base
de donnes est
associ une et une
seule table; il est
oprationnel jusqu la
suppression de la table
laquelle il est li.
CREAT
E
TRIGG
ER
(prse
nt
avec le
rle
RESOU
RCE)
Sous
Oracle,
aussi
triggers
INSTEAD OF sur
les
vues,
et
triggers systmes.
ANY
CREATE
TRIGGER
(pour
ceux des
89
autres
schmas
)
Les triggers -
ADMINIS
Privilges
TER
DATABSE
TRIGGER (pour
les
dclencheurs
d'instances)
Les
v
ne
me
91
nts
dc
len
che
urs
peu
ven
t
tr
e:
une
inst
ruct
ion
INS
ERT
,
DEL
ETE
,
UP
DAT
E
une
instruction
CREATE, ALTER, ou DROP
sur un objet (table, index,
squence, etc.)
es avances
ses e
le dmarrage ou larrt de la
base (startup ou shutdown), une
erreur spcifique
(NO_DATA_
FOUND,
DUP_VAL_ON_INDEX,
etc.), une
connexion
ou
une
dconnexi
on
dun
utilisateur.
On
parle
de
dclenche
urs
dinstance
s.
Exemple, la condition :
une compagnie ne fait voler
un pilote que sil a totalis
plus de 60 heures de vol
dans les 2 derniers mois sur
le type dappareil du vol en
question, ne pourra
pas tre programme par une contrainte et
ncessitera lutilisation dun dclencheur.
quoi sert un
dclencheur ?
92
23
L
e
s
t
r
i
g
g
e
r
s
Mcanis
me
gnral
Mise en uvre un
dclencheur :
Il faut
dabord le
coder
(comme un
sousprogramme
) (1), puis
le compiler
(il sera
stock ainsi
en
base)
(2).
Par la
suite,
au
cours
du
temps, et si
le
dclencheu
r est actif
(il
est
possible de
dsactiver
un
dclencheu
r mme sil
est
compil),
chaque
vnement
(3)
(qui caractrise le dclencheur)
aura pour consquence son
excution (4).
Syntaxe
C
R
E
A
T
E
[
O
R
R
E
P
L
A
C
E
]
1.
2
.
3.
4.
93
T
R
I
G
G
E
R
<
n
o
m
_
t
r
i
g
g
e
r
>
<
i
n
s
t
a
n
t
>
<
l
i
s
t
e
_
e
v
t
s
>
O
N
<
n
o
m
_
t
a
b
l
e
>
[
F
O
R
E
A
C
H
R
O
W
]
[
W
H
E
N
(
<
c
o
n
d
i
t
i
o
n
>
)
]
<corps>
|
n
o
m
_
v
u
e
<
i
n
s
t
a
n
t
>
:
:
=
A
F
T
E
R
|
B
E
F
O
R
E
|
I
N
S
T
E
A
D
O
F
<
l
i
s
t
e
_
e
v
t
s
>
:
:
=
<
e
v
t
>
{
O
R
<
e
v
t
>
}
<evt>
::=
DELET
E
|
INSERT
|
UPDAT
E [OF
{<liste
_cols>
}]
<liste_
col> ::
=
<nom_
col>
{
,
<nom_
col> }
<corps> corps
de programme
PL/SQL
95
On dfinit
la table,
les instructions du
LMD qui dclenchent le
trigger le moment o
le trigger va se
dclencher par rapport
linstruction
L
M
D
Les triggers
Le traitement
associ
au
trigger peut tre
excut:
Implmentation
d'un
systme
d'audit particulier.
Gnration des valeurs des colonnes
calcules.
Maintenance de plusieurs
tables "miroir" sur diffrents
sites d'un rseau : on assure
ainsi le fait que toutes les
modifications soient
rpercut
es
sur
tous
les
sites
en
mme
temps.
Vrification
de
l'intgrit
rfrentiell
e:
(
a
v
a
n
t
o
u
a
p
r
s
)
par
les
contraintes
dclaratives,
dans
s
i
distribue.
l
e
le contrle de l'heure
et
de
la
date
de
connexion,
le contrle du terminal partir duquel la
commande est lance.
94
Entte du trigger
t
r
i
g
g
e
r
s
e
et ventuellement
une
condition
supplmentaire
de
dclenchement (clause
WHEN).
une seule fois pour toute
linstruction (i.e trigger
96
ses e
es avances
instruction), ou une
fois pour chaque ligne
modifie/insre/suppri
me (i.e trigger
ligne, avec loption FOR EACH ROW).
c
l
e
n
c
h
e
24
u
r
Tri
gg
er
Il
e
st
c
o
n
s
ei
ll
d
e
li
m
it
er
la
ta
ill
e
(p
ar
ti
e
in
st
ru
ct
io
n
s)
d
u
n
d
cl
e
n
c
h
e
s
o
i
x
a
n
t
e
l
i
g
n
e
s
d
e
c
o
d
e
P
L
/
S
Q
L
(
l
a
t
a
i
l
l
e
d
u
n
d
c
l
e
n
c
h
e
u
r
n
e
p
e
u
t
e
x
c
d
e
r
3
2
k
o
)
.
P
o
u
r
c
o
n
t
o
u
r
n
e
r
c
e
t
t
e
l
i
m
i
t
a
t
i
o
n
,
a
p
p
e
l
e
r
d
e
s
s
o
u
s
p
r
o
g
r
a
m
m
e
s
d
a
n
s
l
e
c
o
d
e
lvnem
ent
dtermin
er
est
une mise
jour
particuli
re de la
base
(ajout,
modifica
tion
ou
suppress
ion dans
une table ou une
vue).
d
u
d
c
l
e
n
c
h
e
u
r
.
Un dclencheur
ne
peut
valider
aucune
transaction,
ainsi
les instructions
suivantes sont
interdites
:
COMMIT,
ROLLBACK,
SAVEPOINT, et SET
CONSTRAINT.
Attention ne pas crer de
dclencheurs rcursifs (exemple
dun
dclencheur qui excute une
instruction lanant elle-mme
le dclencheur
ou
deux
dclencheurs
sappelant
en
cascade jusqu
loccupation de
toute
la
mmoire
rserve).
97
Dclenc
heurs
LMD
Pour ce type de
dclencheurs,
Lexcuti
on
est
dpenda
nte
ou
non
du
nombre
de lignes
concern
es par
lvnem
ent.
On
program
me
un
dclench
eur
de
lignes
(row
trigger)
quand
on
dsire
excuter
autant
de
fois
le
dclench
eur quil
y a de
lignes
concernes par une
mise jour.
Les triggers
AFTER ou BEFORE ?
Dclencheurs
LMD
Exemple :
Soit une table t1
ayant
cinq
enregistrements, si on
programme
un
dclencheur
de
niveau
ligne
avec
lvnement
AFTER
DELETE, et
quon lance DELETE
FROM
t1,
le
dclencheur excutera
cinq
fois
ses
instructions (une fois
aprs
chaque
suppression).
Le
tableau
suivant
explique ce mcanisme
:
N
ature de
tat (statement trigger)
Ligne (row trigger)
BEFORE
Excution une fois avant la mise jour
Excution avant chaque ligne mise jour.
(statement trigger).
AFTER
Excution Excution aprs chaque ligne
une fois aprs la mise mise jour.
jour.
100
25
ses e
es avances
Dclenche
urs de
lignes
(row
triggers)
Les
trigg
ers
Lvneme
nt
dclenche
ur est ici
BEFORE
INSERT car
il
faudra
sassurer,
avant
de
faire
linsertion,
que
le
pilote nest
pas
dj
qualifi sur
trois types
dappareils
.
On utilise un dclencheur
FOR EACH ROW car on
dsire quil sexcute autant
de fois
quil y a de lignes
concernes par
lvnement dclencheur.
:old
:new
insert
null
valeur insre
delete
valeur
supprime
null
update
modif
modif
valeur avant
valeur aprs
2. Trigger instruction
(tat)
Le trigger
est excut
une fois pour
lensemble
de
linstruction !
pas
de
notion
de
ligne
courante
103
101
es avances
Exemple
ses e
Dclencheurs de
lignes (row triggers)
Programmons
le
dclencheur
TrigInsQualif qui surveille les insertions
arrivant sur la table Qualifications et
incrmente de 1 la colonne nbQualif
pour le pilote
concern, ou refuse linsertion pour
le
pilote
ayant
dj
trois
qualifications (cas du pilote de code
'PL-1' dans la figure suivante).
102
104
26
107
Dclencheurs
de lignes (row
triggers)
Le test de ce
dclencheur peut
tre ralis sous
SQL*Plus comme
le montre la trace
suivante.
On
retrouve
lerreur
utilisateur qui est
leve en premier.
105
Dclencheurs
de lignes (row
triggers)
programmer le
dclencheur
qui
dcrmente la valeur de
la colonne nbQualif pour
chaque
pilote
concern
par
une
suppression de lignes
dans
la
table
Qualifications. Il faut
raisonner ici sur la
directive :OLD.
Dclencheurs de lignes
(row triggers)
108
106
27
ses e
es avances
Quand
utiliser la
directive
:OLD?
Chaque enregistrement
qui tente dtre supprim
dune table qui inclut un
dclencheur de type
DELETE FOR EACH ROW,
est dsign par :OLD au
niveau du code du
dclencheur.
Quand utiliser
la directive
:OLD?
Le
code
minimal de ce
dclencheur (on
ne prend pas en
compte le fait
quil nexiste plus
de pilote de ce
code brevet) est
dcrit
dans
le
tableau suivant :
Programmons
le
dclencheur TrigDelQualif
qui
surveille
les
suppressions de la table
Qualifications
et
dcrmente
de
1
la
colonne
nbQualif pour le pilote
concern par la
suppression de sa
qualification.
En considrant
les
donnes
initiales
des
tables, le test de
ce
dclencheur
sous SQL*Plus est
le suivant :
Lvnement 109
dclencheur est ici AFTER 110
DELETE
car il faudra
sassurer que
la
suppression
nest
pas
entrave
par
dventuelles contraintes
rfrentielles. On utilise
un dclencheur
FOR
EACH ROW, car sil se
produit une suppression
de
toute
la
table
(DELETE
FROM
Qualifications;)
on
excutera autant de
fois le dclencheur quil
y
a
de
lignes
supprimes.
Quand utiliser
la fois les
Seuls
les
dclencheurs de type
UPDATE FOR EACH ROW
permettent
de
manipuler la fois les
directives :NEW
et
:OLD.
En effet, la mise
jour dune ligne dans
une table fait intervenir
une nouvelle donne
qui en remplace
une
ancienne. Laccs aux
anciennes valeurs se
fera par la notation
pointe du
pseudoenregistrement :OLD.
Laccs aux nouvelles
valeurs se fera par
:NEW. La figure
suivante illustre la
modification de la
colonne brevet du
dernier enregistrement
de la table Qualifications.
Le dclencheur doit programmer deux
mises jour dans la table Pilote.
112
111
28
ses e
es avances
Clause
WHEN
Test du dclencheur
113
Claus
e
WHEN
Exemple 2
114
Clause
WHEN
EMP
EMP
update Emp
Empno
Empno
af
te
r
up
da
1
1
te
of
sa
la
ry
Salary
Salary
10000
10000
o
n
E
M
es avances
ses e
PL
OY
EE
fo
r
ea
ch
ro
w
w
h
e
n
(
:
n
e
w
.
s
a
l
a
r
y
2 4000
3 4000
6000
4 6000
8000
8000
3
li
g
n
e
s
m
o
di
fi
e
s
Le
trigg
er se
dcle
nche
2 fois
115
EMP_LOG
emp_id
date_evt
msg
25/11/08
salaire diminu
25/11/08
salaire diminu
<
116
:
o
l
d
.
s
a
l
a
r
y
)
b
e
g
i
n
insert into
EMP_LOG(emp_id,
date_evt, msg)
values
(:new.empno,
sysdate,
salaire
diminu); end ;
29
Regroupeme
nts
dvnement
s
Des vnements (INSERT,
UPDATE ou DELETE) peuvent
tre
regroups au sein dun
mme dclencheur sils sont
de mme type
(BEFORE
ou
AFTER). Ainsi,
un
seul
dclencheur
est coder et
des instructions
dans le corps du
dclencheur
permettent de
retrouver
la
nature
de
lvnement
dclencheur :
IF (INSERTING)
THEN excute un
bloc dans le cas
dune insertion ;
IF
(UPDATING('colonn
e')) THEN
excute un bloc
dans le cas de la
modification dune colonne ;
IF (DELETING)
THEN excute un
bloc en cas dune
suppression.
Utilisons cette
fonctionnalit pour
regrouper les
dclencheurs de
type
AFTER que nous avons
programms.
Si
plusieurs
dclencheurs
mono
vn
emen
ts
sont
regro
ups
en
un
dcle
nche
ur
multi
vne
ment
s,
il
faut
pense
r
suppri
mer
les
dcle
ncheu
rs
mono
vne
ment
s
(DRO
P
TRIGG
ER)
pour
ne
pas
progr
amme
r
involo
ntaire
ment
plusie
urs
fois la
mme
action
par
lintermdiaire des
diffrents dclencheurs
existants.
117
T
a
b
l
e
s
m
utante
s
Il
est,
en
principe, interdit de
manipuler la table
sur
laquelle
se
porte le dclencheur
(appele
table
mutante)
dans
le
corps du dclencheur
lui-mme.
Regroupements
dvnements
Cette restriction
concerne
les
dclencheurs
de
lignes
(FOR
EACH
ROW),
et
les
dclencheurs
dtat
qui
sont
excuts
via
la
directive
DELETE
CASCADE.
Lecture possible
de la table dans le
cas
d'un
dclenchement
par un insert de
type BEFORE.
Les
vues
modifiables par des
dclencheurs
INSTEAD
OF
ne
sont
pas
considres
comme des tables
mutantes.
Exemple :
118
Dclencheurs dtat
(statement triggers)
Un dclencheur dtat
(global)
est
utilis
lorsqu'il
nest
pas
possible davoir accs aux
valeurs des lignes mises
jour par lvnement.
Le raisonnement de tels
dclencheurs porte donc
119 sur la globalit de la table
mme si la requte LMD
met jour plusieurs lignes.
Ils
prsentent
l'avantage
de
pouvoir
effectuer
des
manipulations sur la table
qui a dclench le trigger.
Dans le cadre de
notre
exemple,
programmons
le
dclencheur
priodeOKQualifs qui
120
ses e
es avances
30
m
o
u
n
t
M
o
v
i
e
Dclencheurs
dtat (statement
triggers)
Exemple
A
s
s
e
l
e
c
t
Test du dclencheur
121
Trigger
INSTEAD
OF
Exemple de trigger
INSTEAD OF
C
r
e
a
t
e
v
i
e
w
P
a
r
a
t
i
t
l
e
,
y
e
a
r
f
r
o
m
m
o
v
i
e
c
r
e
a
t
e
t
r
i
g
g
where studioName
= Paramount;
e
r
r
o
w
P
a
r
a
m
o
u
n
t
I
n
s
e
r
t
b
e
g
i
n
i
n
s
e
r
t
i
n
t
o
i
n
s
t
e
a
d
M
o
v
i
e
(
t
i
t
l
e
,
y
e
a
r
,
s
t
u
d
i
o
N
a
m
e
)
o
f
i
n
s
e
r
t
o
n
P
a
r
a
m
o
u
n
t
M
o
v
i
e
f
o
r
e
a
c
h
v
a
l
u
e
s
(
:
n
e
w
.titl
e,
:new.
year,
Para
mount
)
end ;
Trigger
INSTEAD OF
123
Un
dclencheur
INSTEAD OF permet de
mettre jour une vue
multitable
qui
ne
pouvait
tre
modifie
directement par INSERT,
UPDATE ou DELETE.
INSTEAD OF : faire une
action "au lieu" dinsrer,
de modifier ou de
supprimer une vue.
Pas encore normalis
mais
(utilis
SGBD)
devrait
par
venir
plusieurs
Oracle
le
L
i
m
i
t
a
t
i
o
n
s
p
a
r
r
a
p
p
o
r
t
t
e
u
r
au
triggers
TABLE
Pas
e
n
s
e
m
b
l
i
s
t
e
doption
BEFORE
ou AFTER
uniqu
emen
t
trigge
rs
FOR
EACH
ROW
U
n
uniqu
emen
t
sur
des
vues
122
Trigger INSTEAD OF
Quand utiliser les triggers INSTEAD OF
quand la clause WITH
CHECK OPTION nest pas
satisfaisante Quand la
vue ne peut pas tre modifie
directement. Cest--dire
quand elle contient :
U
n
o
p
r
a
o
p
r
a
t
e
u
r
D
I
S
T
I
N
C
T
U
n
e
f
o
n
c
t
i
o
n
es avances
ses e
a
g
r
g
a
t
Un
GROUP
BY, un
ORDER
BY
Une
sousrequte
dans la
liste du
SELECT
Une
jointure
(mais a
p
e
n
d
d
e
s
c
a
s
)
.
.
.
124
31
D
cle
nc
he
ur
s
LD
D
Ils ragissent aux
modifications
de
la
structure de la base de
donnes et non plus
la
modification
des
donnes de la base.
Ils sont sensibles aux
options BEFORE et
AFTER
la
directive
DATABASE prcise que
le dclencheur peut
s'excuter partir d'un
vnement
provoqu
par
n'importe
quel
schma
la directive SCHEMA
prcise que le
dclencheur peut
s'excuter
partir d'un
vnement provoqu
par le schma lui mme
Les ordres LDD
pouvant provoquer
l'excution du
dclencheur sont :
ALTER,
COMMENT,
CREATE, DROP,
GRANT,
RENAME,
REVOKE
Syntaxe :
CREATE [OR
REPLACE]
TRIGGER
[schma.]
nomDclencheur
BEFORE | AFTER
{ actionStructureBase [OR
actionStructureBase] }
ON { [schma.] SCHEMA |
DATABASE } }
Bloc
PL/SQL
(variabl
es
BEGIN
instruct
ions
END ; )
| CALL
nomSo
usProgr
amme(
param
tres) }
t
toute
suppression
dobjet, dans
le
schma
soutou,
se
produisant un
lundi ou un
vendredi.
D
cle
nc
he
urs
LD
D
Exemp
le : Le
dclen
cheur
suivan
t
interdi
125
126
Dclencheu
rs
dinstances
Ils sont
dclenchs suite
des vnements
systmes comme :
LOGON,
STARTUP,
SERVERRROR,
SUSPEND(utiliss
avec l'option AFTER)
LOGOFF, SHUTDOWN (utiliss
avec t l'option BEFORE)
Des vnements
comme
AFTER
STARUP et BEFORE
SHUTDOWN
s'appliquent avec
des dclencheurs de
type DATABASE.
Exemple :
Le dclencheur
suivant insre une
ligne dans
une
table qui indique
lutilisateur et
lheure
de
dconn
exion
(sous
SQL*Plu
s,
via
un
progra
mme
dapplic
ation,
etc.). On suppose la
table
Trace(vnement
VARCHAR2(100))
cre.
127
l
e
n
ses e
es avances
h
e
u
r
s
affectes
par
les
dclencheurs
de
lignes BEFORE ;
verrouillage, modification et
vrification
dintgrit
des
;
contraintes
tous
les
vrifi
catio
n des
contr
ainte
s
diffr
es ;
128
tous
les
32
M
P
I
Gestion
des
dclenche
urs
L
E
;
A
L
T
E
R
T
R
I
G
G
E
R
<
n
o
m
d
u
d
c
l
e
n
c
h
e
u
r
>
C
O
A
L
T
E
R
T
R
I
G
G
E
R
<
n
o
m
d
u
d
c
l
e
n
c
h
e
u
r
>
D
I
S
L
E
I
G
E
R
<
L
E
o
m
>
E
A
G
G
E
R
S
;
L
T
>
b
l
e
E
N
A
B
L
E
A
L
L
T
R
I
G
G
E
R
S
;
D
R
O
P
T
R
I
G
G
E
R
n
o
m
D
Nouveauts 11g
Il est
possible
de crer
des
dclench
eurs
directem
ent
inactifs
(disable)
Il est
possible
de
choisir
l'ordre
d'excuti
on des
dclench
eurs
d'un
mme vnement
(utilisation de la
directive follows )
Il est
possible
de crer
des
dclenc
heurs
compos
s
de
plusieur
s blocs
sensibles
des
vnem
ents
diffrent
s.
Cela
peut
permettre
de
rsoudre
le problme des tables
mutantes.
129
Suppor
t de
SQL
SQL est devenu le
langage standard des
BD parce qu'il est
flexible, puissant, et
facile apprendre.
Quelques commandes
(dans
un
anglais
simple)
telles
que
SELECT, INSERT,
UPDATE, et DELETE
rendent
facile
la
slection
et
les
mises jour des
donnes
stockes
dans
une
BD
relationnelle.
SQL
est
non
procdural (l'utilisateur
qualifie les donnes
qu'il
souhaite
sans
prciser comment les
obtenir).
Oracle
dtermine
la
meilleure
stratgie
pour excuter la
commande
de
l'utilisateur Il n'y a
aucune dpendance
entre
les
commandes
conscutives parce
que Oracle excute
les commandes SQL
un par un.
PL/SQL
permet
toutes
les
manipulations
SQL
des
donnes,
les
curseurs,
et
les
commandes
de
gestion
des
transactions
entre
autres. Ainsi, on peut
manipuler une BD
Oracle avec souplesse et sans risque.
En outre, PL/SQL
reconnat tous
les
types de donnes SQL
ce
qui
rduit
la
ncessit de convertir
des donnes changes
entre les applications et
la BD.
PL/SQL
supporte
galement le
SQL
dynamique,
une
technique de
programmati
on avance
qui
rend
plus
flexibles
et
souples
l'criture de
commandes
SQL. Les
programm
es peuvent
construire
des
commande
s
de
dfinition
et
de
slection
de
donnes et
des
commande
s
de
contrle
des
transactio
ns " la
vole " au
moment
de
l'excution
.
131
1
.
Conclusion: Avantages de
PL/SQL
PL/SQL est un langage
portable et performant dans le
traitement de transactions.
I
l
o
f
f
r
e
l
e
s
a
v
a
n
t
a
g
e
s
s
u
i
v
a
n
t
s
:
S
u
p
p
o
r
t
d
e
S
Q
L
2. Support de la programmation
oriente objet
3. Meilleure performance
4. Productivit plus leve
5. Meilleure portabilit
6. Grande interaction avec Oracle
7. Scurit accrue
8. Gestion des erreurs
130
Support de la
programmation Objet
Les
types
"objets"
constituent un outil idal
pour la modlisation oriente
Objet qui permet de rduire
le cot et le temps requis
pour
dvelopper
des
applications
complexes.
Les
types
"objets"
permettent de crer des
composants
logiciels
modulaires, faciles
maintenir, et rutilisables.
Les
types
"objets"
permettent
diffrentes
quipes de dvelopper en
parallle des composants
logiciels.
Avec
les
d'encapsulation
oprations
des
donnes,
les
types
"objets"
permettent aussi de dplacer le code
de maintenance des donnes vers des
mthodes et non
dans des scripts et des blocs PL/SQL.
Les types "objets" cachent les
dtails d'implmentation, de sorte
qu'on peut modifier ces dtails sans
affecter les programmes utilisateurs.
En outre, les types "objets"
tiennent compte de la ralit de la
modlisation. Les entits
et
les
associations du monde rel sont
modlises par des objets ce qui
rend les programmes plus fidles la ralit.
132
33
ses e
es avances
Meilleure
performa
nce
utilisateurs
ce
qui
abaisse les
besoins en
mmoire
et
les
cots
d'invocatio
n.
133
Oracle
ce
qui
occasionne
un
overhead. Dans un
environnement rseau, cet overhead
peut devenir significatif:
Chaque fois
qu'une commande
SQL est mise, elle
doit passer par le
rseau ce qui peut
augmenter le trafic.
Cependant, avec
PL/SQL, un bloc entier
de commandes peut
tre envoy Oracle
en mme temps. Ceci
peut
rduire
la
communication
entre
l'application et Oracle.
Si une application
accde intensivement
la BD, elle peut grouper
plusieurs commandes
SQL dans des blocs
et
des
sousprogrammes
PL/SQL
avant de les envoyer
Oracle pour
excution.
Des
procdures
stockes par PL/SQL
sont compiles une fois
et stockes sous forme
excutable cde qui
rend les appels plus
rapides et efficaces.
Les
procdures
stockes,
qui
s'excutent dans le
serveur, peuvent tre
appeles, mme avec
un lent rseau lent,
une seule fois. Ceci
rduit le trafic sur le
rseau et amliore le
temps de rponse.
Le code excutable
est
automatiquement
cach et mis en
commun plusieurs
Mei
lleu
re
pro
duc
tivit
PL/SQL
ajoute la
fonctionn
alit aux
outils non
procdur
aux tels
Oracle
Forms
Oracle
Reports.
Avec
PL/SQL
dans
des ces
outils,
on peut
employ
er des
constru
cteurs
procdu
raux
familier
s pour
dvelop
per des
applicat
ions.
Par
exempl
e,
on
peut
employ
er
un
bloc
entier
PL/SQL
dans
un
dclencheur
d'Oracle Forms.
On
n'as
pas
besoin de faire
des tapes
multipl
es
de
dclench
eurs, des
macros,
ou
des
sorties
d'utilisat
eur.
Ainsi,
PL/SQL
augment
e
la
productiv
it.
Meilleure
performance
PL/SQL est le
mme dans tous
les
environnements.
134
Ds qu' on
matrise PL/SQL
Meilleure
portabilit
avec un outil
d'Oracle, on peut
exploiter ces
connaissance
s
dans
d'autres
outils,
et
ainsi
multiplier les
gains
de
productivit.
Par exemple,
des
scripts
crits avec un
outil
peuvent
tre
employs
par d'autres
outils.
Les
applications
crites en PL/SQL sont
portables vers tous les
systmes d'exploitation
et
plateformes
sur
lesquels
Oracle
fonctionne.
En d'autres termes,
les programmes PL/SQL
peuvent
tourner
n'importe o Oracle
tourne;
135
rutilises
dans
environnements
diffrents
ses e
es avances
136
34
Forte
Intgration
avec SQL
Les
langages
PL/SQL
et
SQL
sont
troitement
intgres. PL/SQL
reconnait
tous
les
types
de
donnes SQL et la
constante
prdfinie
NULL.
Cela
permet
de
manipuler
facilement
et
efficacement les
donnes Oracle.
maintenan
ce, et
permet
des
programm
es
de
s'adapter
pendant
que la BD
change
pour
satisfaire des
nouveaux besoins.
137
Ge
sti
on
de
s
err
eu
rs
On
peut
utiliser l'attribut
%TYPE
pour
dclarer
des
variables
ayant
les mmes
types que les
colonnes de la
BD.
Si
une
dfinition
change, la
dclaration de
la
variable
change
en
consquence la
prochaine fois
que
le
programme
est
compil
ou
excut.
La
nouvelle
dfinition
entre
en
vigueur
sans
aucun effort.
Ceci garantit
l'indpendance de
donnes,
rduit
les
cots
de
Traitemen
t
des
erreurs
provenant
du SGBD
dans une
seule
section
EXECPTIO
N
Dclarat
ion
et
traiteme
nt
des
erreurs
utilisate
ur dans
une
section
EXECPTION
Centralisa
tion
du
traitemen
t
des
erreurs
dans
un
seul
endroit de
Scurit
Les procdures stockes
par PL/SQL permettent de
diviser
la
logique
d'application entre le
client et le serveur. De
cette faon, on peur
empcher
des
applications client de
manipuler des donnes
sensibles Oracle.
lapplicati
on
Lisibilit du code
Maintenance facile des
applications
Rduction du
volume
des
codes
des
applications (Une
grande partie du
code
dune
application
est
gnralement
ddie
la
gestion
des
erreurs)
139
Bibliographi
e
140
35
ses e
es avances