Programmation PL/SQL
G
en
eralit
es
1 / 45
2 / 45
Presentation
Programmation PL/SQL
Anne-Cecile Caron
Licence MIAGE - Bases de donn
ees
2012-2013
Programmation PL/SQL
Programmation PL/SQL
G
en
eralit
es
Un peu de syntaxe
3 / 45
Utilisation
I
C
ote Serveur : Definir des objets programmes persistants
I
C
ote Client :
I
I
4 / 45
Les commentaires
Programmation PL/SQL
Programmation PL/SQL
Un peu de syntaxe
Un peu de syntaxe
5 / 45
dun type reference (REF) ou dun type LOB (adresse vers une
donnee externe de tr`es grande taille)
6 / 45
Exemples de declarations :
num NUMBER(4) ;
num2 NUMBER NOT NULL := 3.5 ;
en_stock BOOLEAN := false ;
limite CONSTANT REAL := 5000.00 ;
La syntaxe est
v1 , v2 NUMBER ;
Programmation PL/SQL
Programmation PL/SQL
Un peu de syntaxe
Un peu de syntaxe
7 / 45
types record. Quand tous les attributs sont dun type SQL, une variable de
type record peut representer une ligne dune table relationnelle.
8 / 45
Employee.emp_name%type ;
v1 du m^
eme type que la colonne emp_name
de la table Employee
v1%type ;
v2 du m^
eme type que v1
num NUMBER(5) ;
numbis num%type ;
-- numbis du m^
eme type que num
Programmation PL/SQL
Programmation PL/SQL
Un peu de syntaxe
Un peu de syntaxe
9 / 45
10 / 45
Notion de sous-type
I
attribut %rowtype :
signifie du meme type ligne (record) que
emp_rec Employee%rowtype ;
-- emp_rec est de type record
-- ses attributs suivent le sch
ema de Employee
subtype
subtype
subtype
-- type
Programmation PL/SQL
Programmation PL/SQL
Un peu de syntaxe
Un peu de syntaxe
11 / 45
Conversions de types
Comme en SQL, Oracle autorise des conversions implicites ou explicites.
une_date DATE := 27-11-2007;
une_chaine VARCHAR2(20) := sysdate ;
une_autre_date DATE
:= to_date(10/11/12,DD/MM/YY);
12 / 45
Expressions et operateurs
I
** (exponentiation)
+ - (op unaires)
* /
+ - ||
< > = <= >= <>
NOT
AND
OR
!=
IS NULL
LIKE
BETWEEN
IN
Programmation PL/SQL
Programmation PL/SQL
Un peu de syntaxe
Int
egrer les requ
etes SQL
13 / 45
Structures de controle
14 / 45
Programmation PL/SQL
Pour une requete dont le resultat est constitue dune unique ligne,
on peut utiliser la syntaxe SELECT ... INTO....
select * into emp_rec
from Employee
where emp_no = 12; emp no est la clef
Pas de possibilite decrire telle quelle une requete DDL (utiliser SQL
dynamique)
Programmation PL/SQL
Int
egrer les requ
etes SQL
Int
egrer les requ
etes SQL
15 / 45
16 / 45
Programmation PL/SQL
Programmation PL/SQL
Int
egrer les requ
etes SQL
Int
egrer les requ
etes SQL
17 / 45
Les curseurs
I
Les requetes de la forme select ... into ... peuvent declencher des
exceptions
I TOO_MANY_ROWS si le r
esultat de la requete contient plusieurs lignes.
I
18 / 45
Si on nest pas s
ur que la requete ram`ene exactement 1 ligne, utiliser un
curseur.
Programmation PL/SQL
Programmation PL/SQL
Int
egrer les requ
etes SQL
Int
egrer les requ
etes SQL
19 / 45
20 / 45
I
I
Instructions :
I
I
Attributs du curseur :
I
I
I
I
Programmation PL/SQL
Programmation PL/SQL
Int
egrer les requ
etes SQL
Int
egrer les requ
etes SQL
21 / 45
22 / 45
declare
cursor c_proj is
select proj_name, proj_budget
from project
order by proj_budget ;
declare
cursor c_proj is
select proj_name, proj_budget
from project
order by proj_budget ;
proj_rec c_proj%rowtype ;
begin
open c_proj ;
loop -- parcours des lignes du curseur
fetch c_proj into proj_rec ;
exit when c_proj%notfound ;
... on utilise la ligne courante rang
ee dans proj_rec ...
end loop ;
close c_proj ;
end ;
begin
for proj_rec in c_proj loop -- parcours des lignes du curseur
... on utilise la ligne courante rang
ee dans proj_rec ...
end loop ;
end ;
Programmation PL/SQL
Programmation PL/SQL
Int
egrer les requ
etes SQL
Int
egrer les requ
etes SQL
23 / 45
24 / 45
Curseurs implicites
I
open emp_cursor(56) ;
fetch emp_cursor into emp_cursor_rec ;
...
close emp_cursor ;
ou bien :
Programmation PL/SQL
Programmation PL/SQL
Les Exceptions
26 / 45
Programmation PL/SQL
Programmation PL/SQL
Declenchement dexception
I
I
I
Traitement dexception
28 / 45
20999 et
20000
Programmation PL/SQL
Programmation PL/SQL
Le WHEN OTHERS permet de traiter les erreurs (non liees `a des noms
dexception)
Lorsquune exception est declenchee, le deroulement du programme
est interrompu et le traitement dexception est execute.
Sil ny a pas de traitement pour une exception donnee,
I
30 / 45
DECLARE
pe_ratio NUMBER(3,1);
BEGIN
SELECT price / earnings INTO pe_ratio
FROM stocks
WHERE symbol = XYZ;
-- might cause division-by-zero error
INSERT INTO stats (symbol, ratio)
VALUES (XYZ, pe_ratio);
EXCEPTION -- exception handlers begin
WHEN ZERO_DIVIDE THEN
INSERT INTO stats (symbol, ratio)
VALUES (XYZ, NULL);
END;
Programmation PL/SQL
Programmation PL/SQL
Exemple (2)
On suppose quil existe une table COMPAGNIE et une table PILOTE avec une
contrainte de clef etrang`ere entre les deux (un pilote appartient `
a une
compagnie)
Lorsquon veut supprimer une compagnie qui a encore des pilotes :
ORA-02292 enregistrement fils existant.
create procedure detruitCompagnie...
restePilote EXCEPTION ;
PRAGMA Exception_init(restePilote, -2292);
begin
delete from compagnie where comp = MaCompagnie ;
...
exception
when restePilote then
... traitement de lerreur ...
end ;
32 / 45
Exemple (3)
Version o`
u lon traite le cas o`
u il ny a pas de ligne eacee.
create procedure detruitCompagnie(ma_comp VARCHAR2) is
restePilote EXCEPTION ;
PRAGMA Exception_init(restePilote, -2292);
compagnieInexistante EXCEPTION ;
begin
delete from compagnie where comp = ma_comp ;
if SQL%NOTFOUND then
raise compagnieInexistante ;
end if ;
exception
when restePilote then
... traitement de lerreur ...
when compagnieInexistante then
...
when others then
... on traite les autres erreurs
end ;
Programmation PL/SQL
Programmation PL/SQL
Modules stock
es
Proc
edures et fonctions
33 / 45
34 / 45
Programmation PL/SQL
Programmation PL/SQL
Proc
edures et fonctions
Proc
edures et fonctions
35 / 45
Les param`etres
I
36 / 45
Exemple
create or replace function nom_dept(numero dept.dept_no%type)
return VARCHAR2 is
nom dept.dept_name%type ;
begin
select dept_name into nom from dept
where dept_no = numero ;
return nom ;
end ;
select nom_dept(1) from dual ; -- possible car pas de modif de la base
NOM_DEPT(1)
---------------------------info
Programmation PL/SQL
Programmation PL/SQL
Proc
edures et fonctions
Proc
edures et fonctions
37 / 45
Exemple (2)
38 / 45
Exemple (3)
Sous SQLPlus, on peut aussi utiliser des variables globales, et
linstruction execute :
declare
leNom VARCHAR2(100) ;
begin
nom_dept2(1,leNom) ; -- appel de la procedure
dbms_output.put_line(leNom) ;
end ;
begin
:le_dept := 4 ;
nom_dept2(:le_dept,:le_nom);
end ;
/
print le_nom ;
Sous SQLPlus, la d
efinition dun programme PLSQL est suivie de / `
a la ligne suivante
(directive dex
ecution de linstruction donc de compilation du programme PLSQL)
Programmation PL/SQL
Programmation PL/SQL
Proc
edures et fonctions
Les paquetages
39 / 45
Erreurs de compilation
I
I
I
I
40 / 45
Les paquetages
I
Programmation PL/SQL
Programmation PL/SQL
Les paquetages
Les paquetages
41 / 45
La specification
42 / 45
Le corps
Elle contient :
Il contient :
Programmation PL/SQL
Programmation PL/SQL
Les paquetages
Les paquetages
43 / 45
Exemple (1)
create or replace package Paq_Commerce as
procedure ajout_produit(le_nom produit.nom%type,
le_prix produit.prix_unitaire%type) ;
procedure suppression_produit(le_num produit.num_produit%type);
procedure ajout_produit_commande(le_num_cmde commande.num_commande%type,
le_num_produit produit.num_produit%type,
la_qte contient.quantite%type);
PRODUIT_INCONNU EXCEPTION ;
PRAGMA exception_init(PRODUIT_INCONNU,-20100);
PRODUIT_UTILISE EXCEPTION ;
PRAGMA exception_init(PRODUIT_UTILISE,-20101);
end Paq_Commerce;
44 / 45
Exemple (2)
create or replace package body Paq_Commerce as
...
procedure ajout_produit_commande(le_num_cmde commande.num_commande%type,
le_num_produit produit.num_produit%type,
la_qte contient.quantite%type) is
ancienne_qte contient.quantite%type ;
begin
select quantite into ancienne_qte from contient
where num_commande = le_num_cmde and num_produit = le_num_produit ;
-- il y a d
ej`
a une ligne pour cette commande et ce produit
update contient set quantite = quantite + la_qte
where num_commande = le_num_cmde and num_produit = le_num_produit ;
exception
when NO_DATA_FOUND then -- creer une nouvelle ligne
insert into contient(num_commande, num_produit, quantite)
values(le_num_cmde, le_num_produit, la_qte);
end ajout_produit_commande ;
end Paq_Commerce;
Programmation PL/SQL
Les paquetages
45 / 45
Exemple (3)
Sous SQLPlus :
execute paq_commerce.ajout_produit_commande(3,1,2);
-- ok
execute paq_commerce.suppression_produit(25);
ERREUR `
a la ligne 1 :
ORA-20100:
ORA-06512: `
a "CARON.PAQ_COMMERCE", ligne 16
ORA-06512: `
a ligne 1