Académique Documents
Professionnel Documents
Culture Documents
Dfinition (1)
Instructions de base
Squences, curseurs
Traitement des erreurs
Procdures et fonctions
Tableaux, structures et collections
Possibilits:
Ordres SQL (LMD): SELECT,INSERT,UPDATE,DELETE
Variables et sous-programmes (BLOC PL/SQL)
Structures conditionnelles: IF,THEN,ELSEIF,ELSE,ENDIF
Structures itratives : LOOP,FOR,WHILE,EXIT WHEN
Utilisation des fonctions et prdicats SQL
1/76
PL/SQL (#1)
Jean-Luc GOERIG
2/76
PL/SQL (#1)
Jean-Luc GOERIG
Dfinition (2)
Possibilits:
Gestion de curseurs
Traitement des erreurs : EXCEPTION
Gestion de transactions: COMMIT,ROLLBACK,SAVEPOINT
Procdures et fonctions: CREATE PROCEDURE ou FUNCTION
Packages: regroupement de procdures et fonctions
Packages standards Oracle (DBMS_OUTPUT,UTL_FILE )
Codage de Triggers
Restriction:
LDD impossible (ALTER,CREATE.)
Avantages:
Portabilit sur Oracle, performant, facilit de programmation
END;
END; --- fin
fin bloc
bloc BB
EXCEPTION
EXCEPTION
--- Section
Section facultative
facultative
--- Traitement
Traitement des
des exceptions
exceptions (gestion
(gestion des
des erreurs)
erreurs)
END;
END;
PL/SQL (#1)
Jean-Luc GOERIG
4/76
PL/SQL (#1)
Jean-Luc GOERIG
Exemple
Variables (1)
--- traitement
traitement de
de commandes
commandes
DECLARE
DECLARE
qte_stock
qte_stock number(5);
number(5);
BEGIN
BEGIN
Select
Select quantite
quantite into
into qte_stock
qte_stock
from
inventaire
from inventaire
where
where produit=chaise;
produit=chaise;
--- contrle
contrle du
du stock
stock suffisant
suffisant
if
if qte_stock
qte_stock >> 00 then
then
update
update inventaire
inventaire set
set quantite
quantite == quantite
quantite 11
where
where produit=chaise;
produit=chaise;
insert
insert into
into achat
achat
values
values (chaise,sysdate);
(chaise,sysdate);
else
else
insert
insert into
into acheter
acheter
values
values (Plus
(Plus de
de chaise!,sysdate);
chaise!,sysdate);
end
end if;
if;
commit;
commit;
END;
END;
5/76
PL/SQL (#1)
Types de variables:
variables locales:
variables externes:
Jean-Luc GOERIG
6/76
PL/SQL (#1)
Jean-Luc GOERIG
Variables (2)
Variables (3)
DECLARE
DECLARE
reponse
reponse boolean;-boolean;-- valeur
valeur TRUE,FALSE,NULL
TRUE,FALSE,NULL
BEGIN
BEGIN
emp.name%TYPE;
emp.name%TYPE;
7/76
DECLARE
DECLARE
commission
commission number(7,2);
number(7,2);
salaire
salaire commission%TYPE;
commission%TYPE;
BEGIN
BEGIN
PL/SQL (#1)
Jean-Luc GOERIG
DECLARE
DECLARE
nom
nom char(10)
char(10) :=
:= Zorro;
Zorro;
salaire
salaire number(7,2)
number(7,2) :=
:= 9800;
9800;
reponse
boolean
:=
TRUE;
reponse boolean := TRUE;
BEGIN
BEGIN
8/76
PL/SQL (#1)
Jean-Luc GOERIG
Variables (4)
Structures conditionnelles
Trois formes de IF:
IF
IF <condition>
<condition> THEN
THEN
traitement;
traitement;
END
END IF;
IF;
PL/SQL (#1)
Jean-Luc GOERIG
CASE
<variable>
CASE
<variable>
WHEN
WHEN <condition1>
<condition1> THEN
THEN instructions1;
instructions1;
WHEN
WHEN <condition2>
<condition2> THEN
THEN instructions2;
instructions2;
WHEN
WHEN <conditionN>
<conditionN> THEN
THEN instructionsN;
instructionsN;
[[ ELSE
instructionsZ;
ELSE
instructionsZ; ]]
END
END CASE;
CASE;
> !=
is null
4 types de boucle :
boucle de base LOOP
boucle FOR
Boucle de base LOOP:
instructions;
instructions;
END
END LOOP;
LOOP;
11/76
not
like
Jean-Luc GOERIG
VALUES
VALUES (nbre);
(nbre);
PL/SQL (#1)
and
or
between
FOR
FOR var_indice
var_indice IN
IN [REVERSE]
[REVERSE] valeur_dbut
valeur_dbut ..
.. valeur_fin
valeur_fin
LOOP
LOOP
instructions;
instructions;
END
END LOOP;
LOOP;
boucle WHILE
boucle CURSOR...FOR
LOOP
LOOP
>= <=
is not null
PL/SQL (#1)
DECLARE
DECLARE
nbre
nbre NUMBER:=1;
NUMBER:=1;
BEGIN
BEGIN
LOOP
LOOP
INSERT
INSERT INTO
INTO rsultat
rsultat
nbre:=nbre+1
nbre:=nbre+1
EXIT WHEN nbre > 10;
EXIT WHEN nbre > 10;
END LOOP;
END LOOP;
END;
END;
IF
IF <condition1>
<condition1> THEN
THEN
traitement1;
traitement1;
ELSIF
ELSIF <condition2>
<condition2> THEN
THEN
traitement2;
traitement2;
ELSE
ELSE
traitement3;
traitement3;
END
END IF;
IF;
Structure CASE:
Attention!
9/76
IF
IF <condition>
<condition> THEN
THEN
traitement1;
traitement1;
ELSE
ELSE
traitement2
traitement2
END
END IF;
IF;
Jean-Luc GOERIG
12/76
PL/SQL (#1)
Jean-Luc GOERIG
Boucle Rpter:
Dommage! il ny a pas de repeat en PL/SQL!
Se programme avec la syntaxe LOOP EXIT.
BEGIN
BEGIN
WHILE
WHILE condition
condition
LOOP
LOOP
instructions;
instructions;
END
LOOP;
END LOOP;
BEGIN
BEGIN
...
...
LOOP
LOOP
END;
END;
<instructions>;
<instructions>;
EXIT
EXIT WHEN
WHEN <condition>;
<condition>;
END
LOOP;
END LOOP;
...
...
13/76
PL/SQL (#1)
Jean-Luc GOERIG
14/76
PL/SQL (#1)
Jean-Luc GOERIG
Package DBMS_OUTPUT
--- variables
variables SQL*Plus
SQL*Plus
accept
accept lenom
lenom prompt
prompt taper
taper votre
votre nom:
nom:
declare
declare
vnom
vnom char(15);
char(15);
vnompilote
vnompilote transair.pilote.nompil%type;
transair.pilote.nompil%type;
begin
begin
vnom
vnom :=
:= &lenom;
&lenom;
select
select nompil
nompil into
into vnompilote
vnompilote
from
from transair.pilote
transair.pilote
where
where nompil='&lenom';
nompil='&lenom';
...
...
end;
end;
NB: ces variables sont utilisables avec Sql Developer sans accept.
15/76
PL/SQL (#1)
Jean-Luc GOERIG
declare
declare
vnum
vnum transair.pilote.nopilote%type;
transair.pilote.nopilote%type;
vnom
vnom transair.pilote.nompil%type;
transair.pilote.nompil%type;
begin
begin
dbms_output.enable;
dbms_output.enable;
select
select nopilote,nompil
nopilote,nompil into
into vnum,vnom
vnum,vnom from
from transair.pilote
transair.pilote where
where nompilote
nompilote =6723;
=6723;
dbms_output.put_line('Pilote:
dbms_output.put_line('Pilote: '||vnum||'
'||vnum||' '||vnom);
'||vnom);
...
...
end;
end;
16/76
PL/SQL (#1)
Jean-Luc GOERIG
17/76
PL/SQL (#1)
Jean-Luc GOERIG
CREATE
CREATE SEQUENCE
SEQUENCE [schma.]
[schma.] <nom_squence>
<nom_squence>
[[ INCREMENT
INCREMENT BY
BY << 11 || entier
entier >]
>]
[[ START
START WITH
WITH entier
entier ]]
[[ << MAXVALUE
MAXVALUE entier
entier || NOMAXVALUE
NOMAXVALUE >> ]]
[[ << MINVALUE
MINVALUE entier
entier || NOMINVALUE
NOMINVALUE >> ]]
[[ << CYCLE
CYCLE || NOCYCLE
NOCYCLE >> ]]
[[ << CACHE
CACHE entier
entier || NOCACHE
NOCACHE >> ]]
[[ << ORDER
|
NOORDER
ORDER | NOORDER >> ];
];
nom_squence
de donnes
INCREMENT
squence
START WITH
Jean-Luc GOERIG
asc.
= MAXVALUE pour squence
Depuis Oracle 11g, il est possible dutiliser CURRVAL et NEXTVAL dans un bloc
PL/SQL. Les expressions <squence.CURRVAL> et <squence.NEXTVAL> peuvent
tre utilises tout endroit o une expression de type Number peut apparatre.
PL/SQL (#1)
PL/SQL (#1)
Squences (2)
19/76
18/76
Jean-Luc GOERIG
desc.
MAXVALUE
MINVALUE
20/76
NOMAXVALUE
NOMINVALUE
Squences (3)
Squences (4)
Mise en uvre:
Utilisation d'une squence dans une ordre SQL (SELECT, INSERT, UPDATE)
en tant que pseudo-colonne par:
nom_squence.NEXTVAL (gnre la valeur suivante de la squence)
nom_squence.CURRVAL (donne la valeur courante de la squence)
21/76
PL/SQL (#1)
Jean-Luc GOERIG
22/76
PL/SQL (#1)
Squences (5)
Squences (6)
Modification:
Compteur alphanumrique:
23/76
PL/SQL (#1)
Jean-Luc GOERIG
Jean-Luc GOERIG
24/76
PL/SQL (#1)
Jean-Luc GOERIG
Curseurs
Un curseur est une zone de mmoire de taille fixe, utilise par le noyau
d'ORACLE pour analyser et interprter tout ordre SQL.
Il existe deux types de curseurs :
Curseur explicite (select ... into)
Curseur implicite (for) pour simplifier lcriture.
25/76
PL/SQL (#1)
Jean-Luc GOERIG
26/76
PL/SQL (#1)
Jean-Luc GOERIG
27/76
PL/SQL (#1)
Jean-Luc GOERIG
28/76
PL/SQL (#1)
Jean-Luc GOERIG
Curseur explicite Tq
29/76
PL/SQL (#1)
%ROWCOUNT
%FOUND :
type boolen
SQL%FOUND (curseur implicite) ou nom_curseur%FOUND
TRUE si une ligne au moins est traite ou ramene.
%NOTFOUND : type boolen
SQL%NOTFOUND ou nom_curseur%NOTFOUND
TRUE si aucune ligne n'est traite ou ramene.
Jean-Luc GOERIG
30/76
PL/SQL (#1)
Jean-Luc GOERIG
%ISOPEN :
type boolen
SQL%ISOPEN est toujours FALSE
nom_curseur%ISOPEN est TRUE lorsque le curseur est ouvert.
%ROWCOUNT : type numerique
SQL%ROWCOUNT contient le nombre de lignes traites (I,U,D)
avec 0 : le select into ne ramne aucune ligne
1 : le select into ramne 1 ligne
2 : le select into ramne plus d'1 ligne
nom_curseur%ROWCOUNT traduit la nime ligne ramene par le
fetch.
31/76
PL/SQL (#1)
Jean-Luc GOERIG
32/76
PL/SQL (#1)
Jean-Luc GOERIG
Curseur FOR
33/76
PL/SQL (#1)
Jean-Luc GOERIG
34/76
DECLARE
CURSOR nom_curseur is ordre select;
nom_structure nom_curseur%ROWTYPE;
BEGIN
PL/SQL (#1)
Jean-Luc GOERIG
35/76
PL/SQL (#1)
Jean-Luc GOERIG
36/76
PL/SQL (#1)
Jean-Luc GOERIG
Curseurs paramtrs(1)
Curseurs paramtrs:
Ils permettent de pouvoir rutiliser un mme curseur avec des
valeurs diffrentes dans un mme bloc PL/SQL.
Les paramtres sont de type CHAR, NUMBER, DATE, BOOLEAN.
Le passage des valeurs se fait l'ouverture du curseur.
37/76
PL/SQL (#1)
DECLARE
DECLARE
CURSOR
CURSOR nom_curseur(param1
nom_curseur(param1 TYPE,
TYPE, param2
param2 TYPE,
TYPE, ...)
...)
IS
IS ordre
ordre select
select ....;
....;
--- utilisant
utilisant les
les paramtres
paramtres para1
para1 et
et para2
para2
BEGIN
BEGIN
OPEN
OPEN nom_curseur
nom_curseur (val1,
(val1, val2,
val2, ....);
....);
-ou
FOR
nom_structure
-- ou FOR nom_structure IN
IN nom_curseur
nom_curseur (val1,
(val1, val2,
val2, ...);
...);
Jean-Luc GOERIG
38/76
PL/SQL (#1)
Jean-Luc GOERIG
Curseurs paramtrs(2)
Exemple:
39/76
PL/SQL (#1)
Jean-Luc GOERIG
40/76
PL/SQL (#1)
Jean-Luc GOERIG
Exemple (dbut):
Exemple (suite):
prompt
prompt curseur
curseur pour
pour mise
mise jour
jour
prompt
prompt changement
changement de
de service
service de
de tous
tous les
les employs
employs du
du bar
bar
insert
insert into
into service
service values
values (5,'fast-food');
(5,'fast-food');
select
select ** from
from emp,service
emp,service
where
where service=num_serv
service=num_serv and
and nom_serv
nom_serv like
like 'bar%';
'bar%';
declare
declare
vbar
vbar service.nom_serv%type
service.nom_serv%type :=
:= 'bar';
'bar';
vnom
vnom emp.nom_emp%type;
emp.nom_emp%type;
vnumserv
vnumserv emp.service%type;
emp.service%type;
vservice
vservice service.nom_serv%type;
service.nom_serv%type;
cursor
cursor cv6
cv6 is
is
select
select nom_emp,service,
nom_emp,service, nom_serv
nom_serv
from
from emp,service
emp,service
where
where service=num_serv
service=num_serv
and
and nom_serv
nom_serv like
like vbar
vbar
for
for update
update of
of service;
service;
begin
begin ...
...
41/76
PL/SQL (#1)
begin
begin
open
open cv1;
cv1;
fetch
fetch cv1
cv1 into
into vnom,
vnom, vnumserv,
vnumserv, vservice;
vservice;
while
while cv1%found
cv1%found
loop
loop
update
update emp
emp set
set service=5
service=5
where
where current
current of
of cv1;
cv1;
fetch
fetch cv1
cv1 into
into vnom,
vnom, vnumserv,
vnumserv, vservice;
vservice;
end
end loop;
loop;
close
close cv1;
cv1;
end;
end;
//
select
select ** from
from emp,service
emp,service
where
where service=num_serv
service=num_serv
and
and nom_serv
nom_serv like
like 'fast%';
'fast%';
Jean-Luc GOERIG
42/76
PL/SQL (#1)
Jean-Luc GOERIG
Le code PL/SQL qui traite lerreur est crit dans la section EXCEPTION
DECLARE
DECLARE
<nom_erreur>
<nom_erreur> EXCEPTION;
EXCEPTION;
BEGIN
BEGIN
IF
IF <condition_detection>
<condition_detection>
THEN
THEN RAISE
RAISE <nom_erreur>;
<nom_erreur>;
EXCEPTION
EXCEPTION
WHEN
WHEN <nom_erreur>
<nom_erreur> THEN
THEN
<traitement
<traitement erreur>;
erreur>;
[WHEN
[WHEN OTHERS
OTHERS THEN
THEN <traitements>;]
<traitements>;]
End;
End;
PL/SQL (#1)
Jean-Luc GOERIG
44/76
PL/SQL (#1)
Jean-Luc GOERIG
--- exemple
exemple exception
exception utilisateur
utilisateur
declare
declare
gros_salaire exception;
gros_salaire exception;
cursor
cursor cv1
cv1 is
is select
select nom_emp,
nom_emp, salaire,
salaire, nom_serv
nom_serv
from emp,service where service=num_serv;
from emp,service where service=num_serv;
vnom emp.nom_emp%type;
vnom emp.nom_emp%type;
vsalaire emp.salaire%type;
vsalaire emp.salaire%type;
vservice service.nom_serv%type;
vservice service.nom_serv%type;
begin
begin
dbms_output.enable;
dbms_output.enable;
open
open cv1;
cv1;
loop
loop
fetch
fetch cv1
cv1 into
into vnom,
vnom, vsalaire,
vsalaire, vservice;
vservice;
exit when cv1%notfound;
exit when cv1%notfound;
if vsalaire > 9999 then
raise gros_salaire;
if vsalaire > 9999 then
raise gros_salaire;
end if;
end if;
end loop;
end loop;
close cv1;
close cv1;
exception
exception
when gros_salaire then
when gros_salaire then
dbms_output.put_line('Exception gros_salaire! :'||vnom||' '||vsalaire);
dbms_output.put_line('Exception gros_salaire! :'||vnom||' '||vsalaire);
when others then null;
when others then null;
end;
end;
45/76
PL/SQL (#1)
Jean-Luc GOERIG
PL/SQL (#1)
Elles ne sont ni dclares, ni dtectes. Elles ont des noms pr-dfinis mais on peut
les changer. Elles sont associes un traitement dans la partie EXCEPTION
Quelques erreurs courantes:
DUP_VAL_ON_INDEX
FETCH_OUT_OF
INVALID_CURSOR
INVALID_NUMBER
NO_DATA_FOUND
TOO_MANY_ROWS
VALUE_ERROR
ZERO_DIVIDE
-1
-1002
-1001
-1722
-1403
-1422
-6502
-1476
46/76
PL/SQL (#1)
Jean-Luc GOERIG
47/76
La
Labase
basede
dedonnes
donnesde
delalasocit
socitVOYAGE-ECO
VOYAGE-ECOcomprend
comprend44tables
tables: :
CHAUFFEUR
nom) )
CHAUFFEUR (ncar,
(ncar,nom
VOYAGE
VOYAGE(ncar#,
(ncar#,datevoyage,
datevoyage,ville#
ville#) )
PRIME
(nom,
date
versement,
montant)
PRIME (nom, date versement, montant)
DESTINATION
seuil,base)
base)
DESTINATION(ville,
(ville,seuil,
Chaque
Chaquevoyage
voyageeffectu
effectudonne
donnelieu
lieul'insertion
l'insertiond'une
d'uneligne
lignedans
danslalatable
tableVOYAGE.
VOYAGE.
La
Laville
villereprsente
reprsentelaladestination
destinationdu
duvoyage.
voyage.
Un
Unchauffeur
chauffeurne
neconduit
conduitqu'un
qu'unseul
seulcar,
car,un
uncar
carn'est
n'estconduit
conduitque
quepar
parun
unseul
seulchauffeur.
chauffeur.
Les
Lesprimes
primessont
sontattribues
attribuesen
enfonction
fonctiondu
dunombre
nombrede
devoyages
voyageseffectus
effectuspar
pardestination,
destination,du
duseuil
seuiletet
de
delalabase.
base.
Ex
Ex: : La
Laligne
ligne(Bruxelles,
(Bruxelles,10,
10,120)
120)dans
danslalatable
tableDESTINATION
DESTINATIONsignifie
signifieque
que les
leschauffeurs
chauffeursayant
ayant
effectus
effectusplus
plusde
de10
10voyages
voyagesvers
versBruxelles
Bruxellesauront
aurontune
uneprime
primegale
gale120
120xx(nb
(nbde
devoyage
voyage- -10).
10).
Le
Lechauffeur
chauffeurayant
ayantralis
ralisleleplus
plusde
devoyage
voyagesur
surune
unedestination
destinationaura
auragalement
galementune
uneaugmentation
augmentation
de
de10%
10%de
delalaprime
primeacquise
acquisesur
surcette
cettedestination.
destination.
Le
Letraitement
traitementest
esteffectu
effectuchaque
chaquesemestre
semestreetetzro
zroou
ouune
uneligne
lignepar
parchauffeur
chauffeurest
estinsre
insredans
danslala
table
PRIME.
table PRIME.
Ensuite,
Ensuite,les
leslignes
lignesde
delalatable
tableVOYAGE
VOYAGEsont
sontsupprimes.
supprimes.
Ecrire
Ecrireleleprogramme
programmePL/SQL
PL/SQLqui
quiralise
raliseleletraitement
traitementsemestriel
semestrieldes
desprimes
primes
Jean-Luc GOERIG
48/76
PL/SQL (#1)
Jean-Luc GOERIG
REF CURSOR:
Une variable curseur est un curseur dynamique qui nest pas associ
une requte donne comme un curseur classique (statique).
Une variable curseur permet au curseur dvoluer au cours du programme.
Dclare en deux tapes:
Dclaration du type
Dclaration de la variable du type
DECLARE
DECLARE
TYPE
TYPE nomTypeCurseurDyn
nomTypeCurseurDyn IS
IS REF
REF CURSOR
CURSOR [[ RETURN
RETURN typeRetourSQL
typeRetourSQL ];
];
...
...
nom_du_curseur_dyn
nom_du_curseur_dyn
nomTypeCurseurDyn;
nomTypeCurseurDyn;
49/76
PL/SQL (#1)
Jean-Luc GOERIG
DECLARE
DECLARE
TYPE
TYPE ref_pil
ref_pil IS
IS REF
REF CURSOR;
CURSOR;
cur_pil
cur_pil ref_pil;
ref_pil;
vnopil
vnopil transair.pilote.nopilote%TYPE;
transair.pilote.nopilote%TYPE;
vnom
vnom transair.pilote.nompil%TYPE;
transair.pilote.nompil%TYPE;
vadr
vadr transair.pilote.adresse%TYPE;
transair.pilote.adresse%TYPE;
vsal
vsal transair.pilote.salaire%TYPE;
transair.pilote.salaire%TYPE;
BEGIN
BEGIN
dbms_output.enable;
dbms_output.enable;
OPEN
OPEN cur_pil
cur_pil FOR
FOR SELECT
SELECT nopilote,nompil,adresse
nopilote,nompil,adresse
from
from transair.pilote
transair.pilote where
where comm
comm is
is not
not null;
null;
FETCH
FETCH cur_pil
cur_pil INTO
INTO vnopil,vnom,vadr;
vnopil,vnom,vadr;
WHILE
WHILE cur_pil%FOUND
cur_pil%FOUND LOOP
LOOP
dbms_output.put_line(vnopil||':'||vnom||':'||vadr);
dbms_output.put_line(vnopil||':'||vnom||':'||vadr);
FETCH
FETCH cur_pil
cur_pil INTO
INTO vnopil,vnom,vadr;
vnopil,vnom,vadr;
END
END LOOP;
LOOP;
CLOSE
CLOSE cur_pil;
cur_pil;
dbms_output.put_line('++++++++++++++++');
dbms_output.put_line('++++++++++++++++');
--- suite
suite sur
sur la
la diapo
diapo suivante
suivante
50/76
PL/SQL (#1)
Jean-Luc GOERIG
PL/SQL (#1)
Jean-Luc GOERIG
Notes
--- suite
suite du
du ref
ref cursor
cursor
dbms_output.put_line('++++++++++++++++');
dbms_output.put_line('++++++++++++++++');
OPEN
OPEN cur_pil
cur_pil FOR
FOR SELECT
SELECT nopilote,nompil,salaire
nopilote,nompil,salaire
from
from transair.pilote
transair.pilote where
where comm
comm is
is not
not null;
null;
FETCH
FETCH cur_pil
cur_pil INTO
INTO vnopil,vnom,vsal;
vnopil,vnom,vsal;
WHILE
WHILE cur_pil%FOUND
cur_pil%FOUND LOOP
LOOP
dbms_output.put_line(vnopil||':'||vnom||':'||vsal);
dbms_output.put_line(vnopil||':'||vnom||':'||vsal);
FETCH
FETCH cur_pil
cur_pil INTO
INTO vnopil,vnom,vsal;
vnopil,vnom,vsal;
END
END LOOP;
LOOP;
CLOSE
CLOSE cur_pil;
cur_pil;
END;
END;
51/76
PL/SQL (#1)
Jean-Luc GOERIG
52/76
Procdures (1)
53/76
PL/SQL (#1)
Jean-Luc GOERIG
54/76
PL/SQL (#1)
Procdures (2)
Procdures (3)
CREATE
CREATE [OR
[OR REPLACE]
REPLACE] PROCEDURE
PROCEDURE [schema].<nomprocedure>
[schema].<nomprocedure>
[[ (parametres,...)]
(parametres,...)]
{{ IS
|
AS
}
IS | AS }
Dclaration
Dclaration des
des variables
variables locales;
locales;
BEGIN
BEGIN
Instructions
SQL
et
PL/SQL;
Instructions SQL et PL/SQL;
EXCEPTION
EXCEPTION
des
exceptions;
des exceptions;
END;
END;
Loption OR REPLACE permet de spcifier au systme le remplacement de la
procdure si elle existe dj dans la base de donnes.
Les paramtres sont dfinis selon la syntaxe suivante :
nomparamtre [ IN | OUT | IN OUT ] type [ { := default } valeur]
IN : indique que la variable est passe en entre,
OUT : indique que la variable est renseigne par la procdure puis renvoye
l'appelant
IN OUT : passage par rfrence
Le type du paramtre ne doit pas contenir d'indication sur la longueur.
Jean-Luc GOERIG
CREATE
CREATE OR
OR REPLACE
REPLACE PROCEDURE
PROCEDURE AugmenterSalaire
AugmenterSalaire
(NumSal
(NumSal integer,
integer, Montant
Montant Real)
Real) IS
IS
SalaireActuel
SalaireActuel Real;
Real;
SalaireNull
SalaireNull Exception;
Exception;
BEGIN
BEGIN
Select
Select sal
sal into
into SalaireActuel
SalaireActuel From
From emp
emp
Where
Where empno
empno == NumSal
NumSal ;;
If
(SalaireActuel
is
NULL)
If (SalaireActuel is NULL)
then
then raise
raise SalaireNull
SalaireNull ;;
else
else Update
Update emp
emp set
set sal
sal == sal
sal ++ Montant
Montant
Where
empno
=
NumSal
;
Where empno = NumSal ;
End
End If;
If;
EXCEPTION
EXCEPTION
When
When no_data_found
no_data_found then
then
insert
insert into
into emp_audit
emp_audit values
values (NumSal,'Inconnu');
(NumSal,'Inconnu');
When
When SalaireNull
SalaireNull then
then
insert
insert into
into emp_audit
emp_audit values
values (NumSal,'Salaire
(NumSal,'Salaire Null');
Null');
END
END AugmenterSalaire;
AugmenterSalaire;
PL/SQL (#1)
Jean-Luc GOERIG
56/76
PL/SQL (#1)
Jean-Luc GOERIG
Procdures (4)
Procdures (5)
ERRORS FOR
LINE/COL
-----------3/24
5/0
AugmenterSalaire(100, 1000);
57/76
PL/SQL (#1)
PROCEDURE supprimer_emp ;
ERROR
------------------------------------------PL/SQL-00103 : Encountered the symbol "EMPNO" when ...
PL/SQL-00103 : Encountered the symbol "END" when ...
Jean-Luc GOERIG
58/76
PL/SQL (#1)
Fonctions (1)
Fonctions (2)
FUNCTION
FUNCTION nomfonction
nomfonction [[ (argument,...)]
(argument,...)]
RETURN
RETURN type
type {{ IS
IS || AS
AS }}
Dclarations
de
variables
Dclarations de variables locales;
locales;
BEGIN
BEGIN
Instructions
SQL
et
PL/SQL;
Instructions SQL et PL/SQL;
RETURN
RETURN (valeur);
(valeur);
EXCEPTION
EXCEPTION
Traitement
Traitement des
des exceptions;
exceptions;
END
END [nomfonction];
[nomfonction];
PL/SQL (#1)
Jean-Luc GOERIG
Jean-Luc GOERIG
CREATE
CREATE FUNCTION
FUNCTION VerifierSalaire
VerifierSalaire
(Numgrade
(Numgrade integer,
integer, Montant
Montant Real)
Real)
RETURN
RETURN boolean
boolean IS
IS
MinSalaire
MinSalaire Real;
Real;
MaxSalaire
MaxSalaire Real;
Real;
BEGIN
BEGIN
Select
Select losal,
losal, hisal
hisal into
into MinSalaire,
MinSalaire, MaxSalaire
MaxSalaire
From
salgrad
From salgrad
Where
Where grade
grade == Numgrade
Numgrade ;;
RETURN
(
(Montant
>=
RETURN ( (Montant >= MinSalaire)
MinSalaire) and
and (Montant
(Montant <=
<= MaxSalaire)
MaxSalaire) );
);
END
VerifierSalaire;
END VerifierSalaire;
60/76
PL/SQL (#1)
Jean-Luc GOERIG
Fonctions (3)
Fonctions (4)
PL/SQL (#1)
Jean-Luc GOERIG
63/76
PL/SQL (#1)
62/76
PL/SQL (#1)
Jean-Luc GOERIG
Jean-Luc GOERIG
64/76
PL/SQL (#1)
Jean-Luc GOERIG
Exemples de dclaration:
XX NUMBER
NUMBER NOT
NOT NULL
NULL :=10.40;
:=10.40;
CC VARCHAR(100)
VARCHAR(100) :=
:= 'Coucou';
'Coucou';
NN CONSTANT
CONSTANT INTEGER
INTEGER DEFAULT
DEFAULT 100;
100;
VV BOOLEAN
BOOLEAN :=
:= TRUE;
TRUE;
Mthodes communes
65/76
PL/SQL (#1)
Jean-Luc GOERIG
66/76
PL/SQL (#1)
TYPE
TYPE type_enr
type_enr IS
IS RECORD
RECORD
(( liste_de_types_avec_%TYPE_ou_non
liste_de_types_avec_%TYPE_ou_non || nom_table%ROWTYPE
nom_table%ROWTYPE );
);
PL/SQL (#1)
Jean-Luc GOERIG
68/76
PL/SQL (#1)
Jean-Luc GOERIG
--- table
table de
de multiplication
multiplication par
par 88 et
et par
par 9...
9...
declare
declare
type
type tablemul
tablemul is
is record
record (( par8
par8 number,
number, par9
par9 number);
number);
type
type tabledentiers
tabledentiers is
is table
table of
of tablemul
tablemul
index
index by
by binary_integer;
binary_integer;
ti
ti tabledentiers;
tabledentiers;
ii number;
number;
begin
begin
for
for ii in
in 1..10
1..10 loop
loop
ti(i).par9
ti(i).par9 :=
:= i*9
i*9 ;;
ti(i).par8:=
ti(i).par8:= i*8;
i*8;
dbms_output.put_line
dbms_output.put_line (i||'*8='||ti(i).par8||'
(i||'*8='||ti(i).par8||'
'||i||'*9='||ti(i).par9
'||i||'*9='||ti(i).par9 );
);
end
end loop;
loop;
end;
end;
69/76
PL/SQL (#1)
Jean-Luc GOERIG
--- on
on va
va lire
lire les
les salaires
salaires de
de la
la table
table emp...
emp...
declare
declare
type
tsal
is
table
of
emp.sal%type
type tsal is table of emp.sal%type
index
index by
by binary_integer;
binary_integer;
tasal
tasal tsal;
tsal;
ii number;
number;
cursor
cursor cur
cur is
is select
select sal
sal from
from emp;
emp;
begin
begin
open
open cur;
cur;
ii :=1;
:=1;
loop
loop
exit
exit when
when cur%notfound;
cur%notfound;
fetch
fetch cur
cur into
into tasal(i)
tasal(i) ;;
dbms_output.put_line
dbms_output.put_line ('salaire
('salaire ...'||tasal(i));
...'||tasal(i));
ii :=
i
+
1;
:= i + 1;
end
end loop;
loop;
end;
end;
70/76
PL/SQL (#1)
Jean-Luc GOERIG
TYPE
TYPE nom_type
nom_type IS
IS VARRAY
VARRAY (taille)
(taille) OF
OF
<< type_colonne
|
type_record
type_colonne | type_record >;
>;
DECLARE
DECLARE
TYPE
TYPE TYPE_TAB
TYPE_TAB IS
IS VARRAY
VARRAY (100)
(100) OF
OF VARCHAR2(1);
VARCHAR2(1);
TAB
TYPE_TAB
:=
TYPE_TAB(1,2,3,4);
TAB TYPE_TAB := TYPE_TAB(1,2,3,4);
BEGIN
BEGIN
TAB(1)
TAB(1) :=
:= 'T';
'T';
TAB(2)
TAB(2) :=
:= 'O';
'O';
TAB(3)
TAB(3) :=
:= 'T';
'T';
TAB(4)
TAB(4) :=
:= 'O';
'O';
FOR
LOOP
FOR II IN
IN 1..4
1..4
LOOP
DBMS_OUTPUT.PUT_LINE(TAB(I));
DBMS_OUTPUT.PUT_LINE(TAB(I));
END
END LOOP;
LOOP;
END;
END;
DECLARE
DECLARE
TYPE
TYPE t_tab_emp
t_tab_emp IS
IS VARRAY
VARRAY (1000)
(1000) OF
OF emp%ROWTYPE;
emp%ROWTYPE;
tab_emp
tab_emp t_tab_emp;
t_tab_emp; --- dclaration
dclaration de
de la
la variable
variable !!
71/76
PL/SQL (#1)
Jean-Luc GOERIG
72/76
PL/SQL (#1)
Jean-Luc GOERIG
nom_table_sql.COUNT
nom_table_sql.DELETE
nom_table_sql.DELETE (n)
supprime llment n
73/76
PL/SQL (#1)
nom_table_sql.LAST
nom_table_sql.TRIM
lment suivant
nom_table_sql.TRIM(n)
nom_table_sql.FIRST
Jean-Luc GOERIG
nom_table_sql.NEXT(n)
nom_table_sql.PRIOR(n)
lment du tableau
74/76
PL/SQL (#1)
Jean-Luc GOERIG
--- exemple
exemple dutilisation
dutilisation des
des attributs
attributs // mthodes
mthodes de
de TABLES
TABLES et
et VARRAY
VARRAY ::
declare
declare
type
type tsal
tsal is
is table
table of
of emp.sal%type
emp.sal%type index
index by
by binary_integer;
binary_integer;
tasal
tasal tsal;
tsal;
ii number;
number;
cursor
cursor cur
cur is
is select
select sal
sal from
from emp;
emp;
begin
begin
open
cur;
open cur;
ii :=1;
:=1;
loop
loop
exit
exit when
when cur%notfound;
cur%notfound;
fetch
fetch cur
cur into
into tasal(i)
tasal(i) ;;
ii :=
:= ii ++ 1;
1;
end
end loop;
loop;
close
close cur;
cur;
dbms_output.put_line('premier
dbms_output.put_line('premier lment:'||tasal(tasal.FIRST)
lment:'||tasal(tasal.FIRST) );
);
dbms_output.put_line('dernier
dbms_output.put_line('dernier lment:'||tasal(tasal.LAST)
lment:'||tasal(tasal.LAST) );
);
dbms_output.put_line('nombre
d
lment
:
'||tasal.COUNT);
dbms_output.put_line('nombre d lment : '||tasal.COUNT);
dbms_output.put_line('suppresion
dbms_output.put_line('suppresion des
des lments'||
lments'||
tasal.next(1)||'
tasal.next(1)||' '||tasal.prior(tasal.COUNT));
'||tasal.prior(tasal.COUNT));
tasal.delete(2,tasal.COUNT-1);
tasal.delete(2,tasal.COUNT-1);
dbms_output.put_line('nombre
dbms_output.put_line('nombre dd lment
lment :: '||tasal.COUNT);
'||tasal.COUNT);
end;
end;
75/76
PL/SQL (#1)
Jean-Luc GOERIG
76/76
PL/SQL (#1)
Jean-Luc GOERIG