Vous êtes sur la page 1sur 159

Plan du

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

Bases de donnes avances


CYCLE INGNIEUR - 2ME ANNE INFORMATIQUE

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

Partie II : Administration des BD

Architecture dun SGBD


Scurit des BD
Optimisation de la BD
Gestion des transactions et des accs concurrents
Reprise aprs panne
Sauvegarde et restauration des donnes
Panorama des BD (Travail individuel)

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

Varray Traitement des

enc

erreurs

heu

Les instructions

rs

Record,

Conclusion: les avantages de PL/SQL

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

raliss par le SGBD. Donc,


rduction du nombre
d'changes travers le
rseau et
optimisation
des
performances
des
applications
+
autres
avantages
(gestions
des
curseurs et traitements des
erreurs).

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

Il offre plusieurs avantages suivants :


1. Support de SQL
2. Support de la programmation
oriente objet
3. Meilleure performance
4. Productivit plus lev
5. Meilleure portabilit
6. Grande interaction avec Oracle
7. Scurit accrue
8. Gestion des erreurs

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] ;

II- lments de syntaxe


de PL/SQL(suite)

13

Une instruction PL/SQL se termine

Les trois
types de
blocs
[DECLARE]
BEGIN
RETURN type
-- instructions

PROCEDURE
nom
IS
FUNCTION nom

toujours par un point virgule


sauf les
mots cls
DECLARE,
BEGIN et
EXCEPTIO
N La
partie

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

Le corps d'un bloc


peut lui mme contenir
dautres blocs (un bloc
est considre comme
une instruction).

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

SELECT quantitEnStock INTO laQuantitEnStock

FROM Article

WHERE noArticle = 10;

IF laQuantitEnStock = 0 THEN

8
DBMS_OUTPUT.PUT_LINE('L article est en
rupture de stock');
9

ELSE

10

DBMS_OUTPUT.PUT('Quantit en stock :');

11
12

DBMS_OUTPUT.PUT_LINE(laQuantitEnStock);
END IF;

13 EXCEPTION
14

WHEN NO_DATA_FOUND THEN

15

DBMS_OUTPUT.PUT_LINE('Numro d article inexistant');

16

WHEN OTHERS THEN

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

tre utilises pour les principales


raisons suivantes:
1
.
S
t
o
c
k
a
g
e
t
e
m
p
o
r
a
i
r
e

s
i
e
(
u
t
i
l
i
s
a
t
e
u
r
s
)
- Traitement ultrieur dans le flux de donnes

2. Manipulation de valeurs stockes


- Calculs et autres manipulations de donnes
sans accs la BD

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

On peut associer une


variable une colonne (ou
une ligne) dune table
(%TYPE et %ROWTYPE)
Si une dfinition sousjacente (dans la BD) change,
la dclaration de la variable
change automatiquement
aussi
(et
de
manire
transparente)
Cest
une
forme
dindpendance
de
donnes qui permet de
rduire les cots de
maintenance et donne la
possibilit aux programmes
de
sadapter
aux
modifications
du schma de la BD.
20

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

LOB (Large Object)

Recoi
vent
des
pointe
urs
sur
des
objets
volum
ineux
(com
me
des
image
s)
stock
s
lextr
ieur
de la
table

Variables non PL/SQL

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

III- Les dclarations - Les types


de PL/SQL

V
A
R
C
H
A
R
2
(
3
0
)
;
22

III- Les dclarations


(suite)
1
.
E
x
e
m
p
l
e
d
e
v
a
r
i
a
b
l
e
s

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

un bloc ne peut utiliser les


variables d'un autre bloc de
mme niveau.

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

-- A ce niveau A: CHAR, B: REAL

END;
25

26

a
g
e

III- Les dclarations :


types dynamiques
%rowtype

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

III- Les dclarations: le


type Record
Alors que la directive
%ROWTYPE permet de
dclarer une structure
compose de colonnes
de tables, elle ne convient
pas des structures de
donnes personnalises.

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

TYPE nomRecord IS RECORD


( nomChamp
typeDonnes
[[NOT NULL]
{:=
|
DEFAULT}
expression]
[,nomChamp
typeDonnes
] );

28

ses e

es avances

III- Les dclarations: le type Record


III- Les dclarations: le type Record
Exemple

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

Affectation 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

(r_aronef avionAirbus_rec, dateVol


DATE,
rty_coPilote Pilote%ROWTYPE,
affretPar Compagnie.comp%TYPE);

Les RECORD ne peuvent pas tre compars


(nullit, galit et ingalit).
30

III- Les dclarations: Table imbrique


III- Les dclarations: Table imbrique
xemple

Les variables de type TABLE (associative arrays)


manipuler des tableaux
dynamiques (car dfinis sans
dimension initiale).
DECLARE
Un tableau est
compos dune cl
primaire (de type
BINARY_INTEGER)
et dune colonne
(de type scalaire,
TYPE, ROWTYPE ou
RECORD) pour
stocker chaque lment.

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;

TYPE nom_type IS TABLE OF type_lment [NOT


NULL] [INDEX BY
tab_pilotes pilotes_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

nom_type est le nom du type


nested table dfini

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

Une erreur est


automatiquemen
t transmise un
bloc EXCEPTION
permettant de
la traiter.

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:

vers la section exception


est soit:

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;

IV- Traitement des erreurs: Les


exceptions
Le
droutement
l'excution normale du

implicite dans le cas d'erreur Oracle


explicite dans le cas d'erreurs dfinies
par utilisateurs

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

IV- Traitement des


erreurs: 2 types
d'exceptions

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. Exceptions dfinies par


l'utilisateur

IV- Traitement des erreurs:


Dfinition d'une exception
1.
Dclaration d'une
variable
de
type
exception
dans
la
section DECLARE
nom_exception
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

Soit associer cette


erreur un code oracle,
elle
sera
leve
automatiquement:
PRAGMA
EXCEPTION_INIT(nom_e
xception,code_erreur_o
racle)

eptio
n
THE
N
trait
eme
nt

3. Dclenchement:

Section dclarative

Nommes par l'utilisateur

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

Section traitement exceptions

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

IV- Traitement des


erreurs: Exemple
d'erreurs d'Oracle
DECLARE
p
e
_
r
a
t
i
o
N
U
M
B
E
R
(
3
,
1
)
;

(
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

Exemple d'erreur dfinie par


utilisateur
DECLARE
pas_de_comm EXCEPTION;
CURSEUR c_vendeurs is
select * from emp where
job='salesman';
noemp
emp.empno%type;
BEGIN
for v_vend IN c_vendeurs LOOP
I
F
v
_
v
e
n
d
.
c
o

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

WHEN deadlock_detected THEN

A
C

- prise en compte de toutes les autres


erreurs

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

Exception prdfinie porte le


nom de others permet de grer les
erreurs Oracle qui ne sont pas
gres explicitement
WHEN OTHERS THEN

Deux fonctions permettent de


rcuprer des informations sur
l'erreur Oracle:

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.

.
.
.

Ainsi, il est possible d'annoncer


des erreurs une application et
d'viter de
retourner des exceptions non
dfinies.

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

Dans cet exemple,


il s'agit de la cration
d'une
procdure
appele
raise_salary
qui rcupre
le
salaire d'un employ
dont le numro est
pass en paramtre.
Si le
salaire
de
l'employ est nul,
alors la procdure
RAISE_APPLICATIO
N_ERROR
est
appele. Sinon la
procdure met
jour le salaire de
l'employ dans la
base en lui ajoutant
une augmentation
passe
en
paramtre.

45

Propagatio
n des
exceptions
Exemple 2

traitement se poursuit dans


le bloc parent
46

Quand un sous-bloc traite une


exception, le sous-bloc se termine
normalement, et
le
programme
reprend donc dans le bloc "pre"
immdiatement aprs l'ordre
END du sous-bloc.

Propagation des
exceptions
Exemple 3

Si une exception n'est pas traite


au sein du bloc BEGIN END; dans
lequel elle est gnre, elle remonte
successivement
dans
les
blocs
"pres" jusqu' ce
qu'elle soit traite ou rende la main au programme
appelant.

ses e

es avances

Propagation des
exceptions

48

Dans cet exemple, l'exception A


est traite dans le bloc local. Le

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;

valuation squentielle des


conditions

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

somme des 100 premiers


entiers

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

pas affecter plusieurs


Valeurs une seule
variable.

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

Les ordres du LMD:


1. SELECT INTO FROM
2. UPDATE
3. DELETE
4. INSERT

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

CURSOR c1 IS SELECT ename, job


FROM emp WHERE sal < 3000;

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

VI- Les curseurs dans


Oracle
Dclaration
CURSOR nom_curseur IS ordre_select

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

VI- Les curseurs dans


Oracle
Exemple:

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
;

Il est possible de dfinir une variable


dynamique partir d'un curseur:
DECLARE

CURSOR
c1
IS
SELECT
deptno,
dname,
loc
FROM
dept;
dept_rec
c1%RO
WTYPE;
BEGIN
open c1;
LOOP
FETCH c1 INTO dept_rec;

66

VI- Les curseurs dans


Oracle
Exemple
DECLARE
m
y
_
s
a
l
e
m
p
.
s
a
l
%
T
Y
P
E
;
m
y
_
j
o
b
e
m
p
.

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

Exemple: Autant de tables imbriques que de colonnes


slectionnes:
DECLARE
TYPE
NumT
ab IS
TABLE
OF
emp.
empn
o
%TYP
E;
TYPE
Name
Tab IS
TABLE
OF

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

Exemple: Une table


imbrique de type
compos:

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

Deux collections de SQL:

ses e

es avances

1. Varray
2. Nested table

U
L
K

Manipulation des collections

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

Les performances sont


assures par les facteurs
suivants : Les

cours
es(1)
ou
cours
es(co
urses.
FIRST)

ses e

es avances

lme
nt
partic
ulier:

74

Les procdures et les


fonctions
PL/SQL est aussi utilis pour
dfinir des procdures stockes
et des fonctions dans la BD,
comme tout autre objet (donne)
manipul par
le moteur du SGBD.

procdures stockes nont


pas besoin d'tre analyses
une seconde
fois l'excution (gain
de temps : pas de
recompilation ). Un
gain de place en
mmoire contribue
cette amlioration de
performances car la
procdure charge en
mmoire
pour
son
excution
est
partage par tous les
objets
qui
la
demandent
(applications). De plus
la
procdure
sexcute
immdiatement si elle
est
en
mmoire
(rduction des accs
disque),
Rduction du trafic
sur
le
rseau
(soumission d'un bloc
PL/SQL au moteur
au
lieu d'une commande
SQL),

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

L'option OR REPLACE permet de spcifier


au systme le remplacement de la
procdure ou de la fonction si elle existe dj
dans la base de donnes.

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

affiche les erreurs


de
compilation PL/SQL
spcifiques.
Le package
DBMS_OUTPUT:
lune
des
possibilits
offertes pour la
mise au point
des packages,
des
procdures ou
des fonctions
est lutilisation
des
procdures
standard
runies
dans
le
package
DBMS_OUTP
UT, qui est
fourni avec
le
noyau
Oracle.

Ce package permet, entre


autre, de mettre en uvre un
mode de trace.
81

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

body: lments privs


82

Les Packages (Body)


CREATE OR REPLACE
PACKAGE
BODY
emp_actions AS -- body
CURSOR
desc_salary
RETURN
EmpRecTyp IS
SELECT empno, sal FROM emp ORDER BY sal
DESC;
PROCEDURE hire_employee
(ename
VARCHAR2,
job
VARCHAR2, mgr NUMBER,
sal NUMBER, comm NUMBER,
deptno NUMBER) IS
BEGIN
INSERT INTO emp VALUES
(empno_seq.NEXTVAL,
ename,
job,
mgr,
SYSDATE,
sal,
comm,
deptno);
END hire_employee;
PROCEDU
RE
fire_empl

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

Package utilis pour l'affichage


des rsultats.

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

Affectation dune chane du tampon dans une


variable.
GET_LINES GET_LINES(ltab OUT DBMS_OUTPUT.CHARARR,
nombreLignes IN OUT INTEGER);
CHARARR table de VARCHAR2(255)
Affectation de chanes du tampon dans un
tableau.

EW_LINE
NEW_LINE(ligne OUT VARCHAR2, statut OUT INTEGER)

Procdures accessibles:

criture du caractre fin de ligne dans le tampon..

1. put: ajout du texte sur ligne


courante
2. new_line: retour chariot
3. put_line: put + new_line

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 (variable | constante)


Mise d'une valeur spcifie dans le tampon de sortie.
La variable doit tre de type numrique (NUMBER),
caractre (VARCHAR2) ou date (DATE).

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)

permet dextraire plusieurs


lignes vers le tableau tab.
Le deuxime
paramtre indique le
nombre de lignes (les
premires y tre mises)
retirer. Dans lexemple
suivant on extrait les 3
premires lignes du tampon
dans le tableau tab.

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

Les triggers peuvent tre


applicatifs ou de base de
donnes.

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

Les triggers font


partie du schma
de la base. Leur
code compil est
conserv
(comme pour les
programmes
stocks)

nt
avec le
rle
RESOU
RCE)

Ils font partie de la norme


SQL3.

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

Les triggers vnements


dclencheurs

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

On parle de dclencheurs LMD ;

une
instruction
CREATE, ALTER, ou DROP
sur un objet (table, index,
squence, etc.)

On parle de dclencheurs LDD ;

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.

Renforcer des aspects de scurit et


daudit.
Collecte
des
informations
sur les mises-jour de la
BD.
Chargement
automatique
de tables
daudit sur
lvolution de
la BD

N.B: la diffrence dune procdure stocke,


on ne peut pas appeler
un trigger explicitement.
90

quoi sert un
dclencheur ?

Dporter des contraintes au niveau du


serveur et allger la programmation client.
Programmer
lintgrit
rfrentielle et la rplication
dans
des
architectures
distribues avec lutilisation
de liens de BD (database links).

Implmenter des alertes ...


Programmer toutes les rgles de
gestion qui nont pas pu tre mises
en place par des contraintes au
niveau des tables.

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
)

pour des actions non


gres

par

les

contraintes
dclaratives,

dans

une base de donnes

s
i

distribue.

Prvention des transactions invalides


Implmentation de
rgles de scurit
complexes comme :

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

ALTER TRIGGER nom_trigger ENABLE | DISABLE

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.

anciennes valeurs et/ou aux nouvelles


valeurs des colonnes.
98

Les triggers
AFTER ou BEFORE ?

Dclencheurs
LMD

Si le trigger doit dterminer si


linstruction LMD est autorise :
utiliser BEFORE
Si le trigger doit "fabriquer" la
valeur
dune
colonne
pour
pouvoir ensuite la mettre dans la
table : utiliser BEFORE
Un trigger ligne avec loption
BEFORE peut servir effectuer des
traitements dinitialisation
avant
excution des modifications sur la
table.

Si on a besoin que linstruction


LMD soit termine pour excuter le
corps du trigger : utiliser AFTER.
Un trigger ligne avec loption
AFTER permet de propager les
modifications ou de grer des
historiques.
Il
est
souvent
utilis avec rfrence aux

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)

Si on dsire excuter une seule fois le dclencheur quel que soit le


lvnement
sans FOR EACH ROW
avec FOR EACH ROW

nombre de lignes concernes, on utilisera un dclencheur dtat

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.

La directive FOR EACH ROW distingue ces deux familles de dclencheurs.


99

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

Trigger ligne ou instruction


?
1. Trigger ligne
notion
de
ligne
courante,
:old
dsigne la
ligne
avant
modif et
:new
dsigne la
ligne
aprs
modif.

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

Dclencheurs de lignes (row


triggers)

es avances

Quand utiliser la directive :NEW ?


Chaque enregistrement
qui tente dtre ajout dans
la table Qualifications est
dsign par
:NEW
au
niveau
du
code
du
dclencheur. Laccs aux
colonnes de ce pseudoenregistrement dans le
corps du dclencheur se fait
par la notation pointe. Le
code minimal de ce
dclencheur (on ne prend
pas en compte lventuelle
erreur du
SELECT ne renvoyant aucun pilote) est dcrit
dans le tableau suivant :

Exemple

ses e

Dclencheurs de
lignes (row triggers)

Essayons de programmer la rgle de


gestion tout pilote ne peut tre
qualifi sur plus de trois
types
dappareils.
Ici, il sagit dassurer la cohrence
entre la valeur de la colonne nbQualif
de la table Pilote et les lignes de la
table Qualifications.

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

Comme linstruction RAISE, la


procdure
RAISE_APPLICATION_ERROR passe
par la section EXCEPTION (sil en
existe une) avant de terminer le
dclencheur. En consquence, si
vous utilisez aussi une section
exception dans le mme bloc, il
faut
forcer
la
sortie
du
dclencheur par la directive
RAISE pour ne pas perdre le
message derreur et surtout ne
pas raliser la mise jour de la
base.
Afin dillustrer cette importante
remarque, ajoutons une section
EXCEPTION au prcdent exemple.
Cette section vrifiera lexistence du
pilote.

106

Dclencheurs de lignes (row


triggers)
Le test derreur de ce
dclencheur sous SQL*Plus est
illustr dans le tableau suivant :

Pour que la cohrence soit plus


complte,
il
faudrait
aussi

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 :

Laccs aux colonnes


de
ce
pseudoenregistrement dans le
corps du dclencheur se
fait
par
la
notation
pointe.

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

directives :NEW et :OLD


?

Seuls
les
dclencheurs de type
UPDATE FOR EACH ROW
permettent
de
manipuler la fois les
directives :NEW
et
:OLD.

Quand utiliser 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.

Lvnement dclencheur est ici


AFTER UPDATE car il faudra sassurer
que la suppression
nest pas entrave par dventuelles
contraintes rfrentielles.

112

111

28

ses e

es avances

Clause
WHEN

Quand utiliser la fois


les directives :NEW
et :OLD ?

On peut dfinir une


condition pour un trigger
ligne : le trigger se
dclenchera
pour
chaque ligne vrifiant la
condition.

Principe du dclencheur TrigUpdQualif

Test du dclencheur

113

Si celle-ci est ralise


pour
lenregistrement
concern
par
lvnement,
le
dclencheur
sexcute. Dans le cas
inverse, le dclencheur
na aucun effet. La
condition
contenue
dans la clause WHEN
doit tre une expression
SQL, et ne peut inclure de requtes ni
de fonctions PL/SQL.

Claus
e
WHEN
Exemple 2

114

Create or replace trigger


journal_emp

Clause
WHEN
EMP
EMP

update Emp

Empno
Empno

af
te
r
up
da

1
1

te
of
sa
la
ry

Salary
Salary
10000
10000

set salary = 5000

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

where salary < 10000 ;

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

interdit toute mise jour sur


la table
Qualifications pendant les week-ends.

120

ses e

es avances

Quel que soit le nombre de


lignes
concernes
par
un
vnement, le dclencheur

sexcutera une seule fois


avant chaque vnement
sur la table
Qualifications.

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

propose depuis la version


8 (serveur Entreprise)

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

Ordre dexcution des


dclencheurs

l
e
n

ses e

es avances

La squence dexcution des


dclencheurs est thoriquement la
suivante. En pratique certaines
excutions peuvent ne pas suivre
cet ordre !
tous les dclencheurs dtat BEFORE ;

h
e
u
r
s

analyse de toutes les


lignes

affectes

par

linstruction SQL; tous

les

dclencheurs

de

lignes BEFORE ;

verrouillage, modification et

vrification

dintgrit

des
;

contraintes
tous

les

dclencheurs de lignes AFTER ;

vrifi

catio

n des

contr

ainte
s
diffr
es ;

128

tous
les

32

M
P
I

Gestion
des
dclenche
urs

L
E
;

Voici la liste des oprations


de gestion des
dclencheurs

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

Sans PL/SQL, Oracle


doit
traiter
les
commandes SQL une
par
une.
Chaque
commande SQL
engendre un appel

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

On n'as pas besoin de


les concevoir en fonction
de
chaque
nouvel
environnement.
Cela signifie qu'on
peut
crire
des
bibliothques
de
programmes portables,
qui
peuvent
tre

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

Les attributs %TYPE et


%ROWTYPE permettent une
meilleure
intgration entre PL/SQL et
SQL:

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)

Les triggers BD crits


en
PL/SQL
peuvent
empcher, de manire
slective,
certaines
mises jour
et garder
des traces des requtes
utilisateur selon leur contenu.

139

En outre, on peut limiter


les accs aux donnes
Oracle en ne permettant
de
les
manipuler
seulement
via
les
procdures stockes qui
s'excutent
avec les privilges de leurs crateurs.
Par exemple, on peut
accorder le droit un
utilisateur
de mettre
jour une table via une
procdure et lui interdire
l'accs la table elle
mme.
138

Bibliographi
e

Christian Soutou, SQL


pour
Oracle
:
Applications avec Java,
PHP et XML. Eyrolles,
3ime dition, 2013.

Habib Ounalli, cours de Bases de


donnes, Chapitre : Programmation
avec SQL- Le langage PL/SQL
d'Oracle, Universit Tunis El Manar,
FST, 2006.

140

35

ses e

es avances