Bases de Donn´
ees Avanc´
ees
PL/SQL
Thierry Hamon
Bureau H202 Institut Galil´ee - Universit´e Paris 13
& LIMSI-CNRS hamon@limsi.fr
https://perso.limsi.fr/hamon/Teaching/P13/BDA-INFO2-2016- 2017/
PL/SQL Introduction
PL/SQL Introduction
PL/SQL Introduction
Clauses SQL
SELECT Interrogation des donn´ees
INSERT
UPDATE Langage de Manipulation de Donn´ees (LMD) DELETE
CREATE ALTER
DROP Langage de D´efinition de Donn´ees (LDD) RENAME
TRUNCATE
GRANT Langage de Contrˆole de Donn´ees (LCD) REVOKE
COMMIT
PL/SQL Introduction
PL/SQL
Procedural Language for Structured Query Language
Langage fournissant une interface proc´
edurale au SGBD
Oracle
Int`
egration du langage SQL en lui apportant une dimension
proc´
edurale
R´
ealisation de traitements algorithmiques (ce que ne permet
pas SQL)
Mise `
a disposition de la plupart des m´
ecanismes classiques de
programmation des langages hˆ
otes tels que C, COBOL,
PASCAL, C++, JAVA ...
PL/SQL Introduction
PL/SQL Introduction
Avantages de PL/SQL
PL/SQL compl´
ement de SQL (qui n’est pas proc´
edural)
M´
ecanismes offerts par PL/SQL :
Structures it´
eratives : WHILE *** LOOP, FOR *** LOOP,
LOOP ***
Structures conditionnelles :
IF *** THEN *** ELSE | ELSEIF *** ENDIF, CASE ***
D´
eclaration des curseurs et des tableaux
D´
eclaration de variables
Affectation de valeurs aux variables
Branchements : GOTO, EXIT
Exceptions : EXCEPTION
PL/SQL Introduction
Avantages de PL/SQL
Int´egration
Meilleure coh´
erence du code avec les donn´
ees
Utilisation de librairies standards pr´
ed´
efinies (biblioth`
eques
partag´
ees)
PL/SQL Introduction
Avantages de PL/SQL
Blocs SQL
Traitement par/de blocs SQL dans un ´
enonc´
e PL/SQL
(optimisation des transactions r´
eseaux)
PL/SQL Introduction
Avantages de PL/SQL
Ex´ecution de programmes modulaires
Traitements complexes (cas particuliers, erreurs)
Traitements des exceptions
PL/SQL Introduction
Avantages de PL/SQL
R´esum´e
Langage portable
Utilisation de variable de stockage
Utilisation de type simple ou de type structur´
e
dynamiquement (%TYPE, %ROWTYPE, etc.)
Utilisation des structures de contrˆ
ole des langages proc´
eduraux
Gestion et manipulation des erreurs
PL/SQL Structure de blocs PL/SQL
Utilisation de PL/SQL
3 formes :
Bloc de code, execut´
e comme une commande SQL (utilisation
d’un interpr´
eteur standard SQL+ ou iSQL*PLus)
Fichier de commandes PL/SQL
PL/SQL Structure de blocs PL/SQL
Structure d’un bloc PL/SQL
−− S e c t i o n d ´e c l a r a t i v e , o p t i o n n e l l e DECLARE V a r i a b l e s , c u r s e u r s , e x c e p t i o n s , . . . −− S e c t i o n e x ´e c u t a b l e , o b l i g a t o i r e BEGIN I n s t r u c t i o n s SQL e t PL/SQL P o s s i b i l i t ´e s de b l o c s f i l s ( i m b r i c a t i o n de b l o c s ) −− S e c t i o n de t r a i t e m e n t d e s e x c e p t i o n s , o p t i o n n e l l e EXCEPTION o p t i o n n e l l e T r a i t e m e n t d e s e x c e p t i o n s ( g e s t i o n d e s e r r e u r s ) −− T e r m i n a i s o n du b l o c , o b l i g a t o i r e END ;PL/SQL Structure de blocs PL/SQL
Type de blocs
Bloc anonyme
Proc´
edure
Fonction
PL/SQL Structure de blocs PL/SQL
Type de blocs
Bloc anonyme
Structure classique (1 `
a 3 sections)
Un bloc ne peut ˆ
etre vide. Il doit contenir une instruction (il
peut donc contenir l’instruction NULL)
[ DECLARE ] BEGIN I n s t r u c t i o n s [ EXCEPTION] END; /
PL/SQL Structure de blocs PL/SQL
Type de blocs
Bloc anonyme – Exemple 1
DECLARE x INTEGER ; BEGIN
x := 1 ; END;
PL/SQL Structure de blocs PL/SQL
Type de blocs
Bloc anonyme – Exemple 2
DECLARE v a r x VARCHAR2( 5 ) . BEGIN SELECT n o m c o l o n n e INTO v a r x FROM n o m t a b l e EXCEPTION WHEN n o m e x c e p t i o n THEN . . . END ; /
PL/SQL Structure de blocs PL/SQL
Type de blocs
Proc´edure
Bloc PL/SQL nomm´
e
puis compil´
e et stock´
e dans la base
PROCEDURE nom I S BEGIN I n s t r u c t i o n s [ EXCEPTION] END; /
PL/SQL Structure de blocs PL/SQL
Type de blocs
Proc´edure – Exemple
PROCEDURE p r o c e x e m p l e I S v a r x VARCHAR2 ( 5 ) ; BEGIN SELECT n o m c o l o n n e INTO v a r x FROM n o m t a b l e EXCEPTION WHEN n o m e x c e p t i o n THEN . . . END ; / → Commande SQL qui cr´ee la proc´edure PL/SQL
PL/SQL Structure de blocs PL/SQL
Type de blocs
Proc´edure
Remarques :
Ex´
ecution (auto) de la proc´
edure :
SQL> EXECUTE proc_exemple
Pas d’ex´
ecution de proc´
edure (ou d’instructions) en fin de
transaction (COMMIT, ROLLBACK, Ordre DDL)
D´
ecision d’enregistrement ou d’annulation de la transaction en
cours : `
a r´
ealiser par le programme appelant la proc´
edure
PL/SQL Structure de blocs PL/SQL
Type de blocs
Fonction
Fonction : proc´
edure retournant une valeur
FUNCTION nom RETURN t y p e d o n n ´e e s I S BEGIN I n s t r u c t i o n s RETURN v a l e u r ; [ EXCEPTION] END; /
PL/SQL Structure de blocs PL/SQL
Type de blocs
Fonction – exemple
SQL> CREATE OR REPLACE FUNCTION s o l d e ( no INTEGER) RETURN REAL I S l e s o l d e REAL ;
BEGIN
SELECT s o l d e INTO l e s o l d e FROM c l i e n t s WHERE n o c l i = no ;
RETURN l e s o l d e ; END;
PL/SQL Structure de blocs PL/SQL
Type de blocs
Fonction
Remarques :
Utilisation de fonction au sein d’une requˆ
ete SQL
Exemple :
SQL> SELECT solde(1000) FROM dual ; Solde(1000)
---12024,50
Appel d’une fonction comme une proc´
edure provoque une
erreur
Exemple : fonction mdp(INTEGER)
SQL> execute mdp(2); BEGIN mdp(2); END; *
PL/SQL Structure de blocs PL/SQL
Types de variables
Variables locales
Constantes Composites R´ef´erencesVariables de l’environnement ext´
erieur `
a PL/SQL
Attach´ees (Bind) Hˆotes (Host)
PL/SQL Structure de blocs PL/SQL
D´
eclaration des variables en PL/SQL
Syntaxe
I d e n t i f i c a t e u r [ CONSTANT ] t y p e d o n n ´e e s [NOT NULL ] [ : = e x p r e s s i o n ] ;
Exemple
DECLARE
v d a t e n a i s s a n c e DATE;
v d e p a r t e m e n t NUMBER( 2 ) NOT NULL := 1 0 ; v v i l l e VARCHAR2( 1 3 ) := ’ P a r i s ’ ;
PL/SQL Structure de blocs PL/SQL
Assignation des variables
Syntaxe
I d e n t i f i c a t e u r := e x p r ;
Exemples
Affecter la date de naissance du fils d’un employ´es v d a t e n a i s s a n c e := ’ 23−SEP−2004 ’ ; Fixer le nom d’un employ´e `a ’Cl´ement’
PL/SQL Structure de blocs PL/SQL
Types de donn´
ees scalaires
Types de base – chaˆınes de caract`eres
VARCHAR2(n)/NVARCHAR2(n)
: Chaˆıne de n caract`
eres
(n < 4000octets) – longueur variable
(pr´
efixe N : prise en compte de la localisation – NLS /National
Language Support)
CHAR(n)/NCHAR(n) : Chaˆıne de n caract`
eres
(n < 2000octets) – longueur fixe, rempli par des espaces
LONG/RAW/LONG RAW : Chaˆıne de caract`
ere ou de donn´
ees
binaires (raw ) de longueur variable ( < 2000octets)
PL/SQL Structure de blocs PL/SQL
Types de donn´
ees scalaires
Types de base – nombres et date
NUMBER (n , m) : R´
eel avec n chiffres significatifs et m
d´
ecimals
INTERGER/FLOAT : Nombre entier/r´
eel sign´
e
BINARY_INTEGER : Nombre entier sign´
e sur 32 bits (utilisation
de la librairie math´
ematique)
DATE : date entre le 1 janvier -4712 et le 21 d´
ecembre 9999
BOOLEAN : bool´
een
NB : pas d’´
equivalent en SQL.
Il n’est donc pas possible
de stocker un bool´een dans une table
de s´electionner un ´el´ement de table dans un variable bool´eenne d’utiliser un bool´een dans une requˆete SQL ou une fonction
PL/SQL Structure de blocs PL/SQL
D´
eclaration des variables scalaires
Exemples v j o b VARCHAR2( 9 ) . v c o u n t BINARY INTEGER := 0 ; v s a l t o t a l NUMBER( 9 , 2 ) . v d a t e DATE := SYSDATE +7; v t a u x t a x e CONSTANT NUMBER( 3 , 2 ) := 8 . 2 5 ;
PL/SQL Structure de blocs PL/SQL
Attribut %TYPE
D´
efinition : d´
eclaration d’une variable associ´
ee `
a
Une colonne d’une table dans la BD
Une variable pr´
ec´
edemment d´
efinie
Exemples :
v nom emp . nom%TYPE ;
v s a l a n n u e l NUMBER( 7 , 2 ) ;
PL/SQL Structure de blocs PL/SQL
Types de donn´
ees composites
Types :
Les tables PL/SQL
Les records PL/SQL
(voir plus loin)
PL/SQL Variables attach´ees
Variables attach´
ees/Bind variables
Variables de substitution dans les requˆ
etes SQL
Variable r´
ef´
eren¸
cant des variables non-PL/SQL
Economie d’analyse de la requˆ
ete, donc gain de temps pour
Oracle
→ M´
ecanisme consid´
er´
e par certains comme le point cl´
e de
performance d’Oracle
PL/SQL Variables attach´ees
Variables attach´
ees/Bind variables
D´eclaration
D´
eclaration, en SQL*Plus, d’une variable attach´
ee : utilisation de
la commande VARIABLE
Exemple :
VARIABLE n o m v a r i a b l e t y p e v a r i a b l e ;
PL/SQL Variables attach´ees
Variables attach´
ees/Bind variables
R´ef´erence aux variables non-PL/SQL
Exemple :
Stocker le salaire mensuel dans une variable globale SQL*Plus
: g s a l m e n s u e l := v s a l a n n u e l / 1 2 ;
Faire r´ef´erence aux variables non-PL/SQL comme des variables hˆote
PL/SQL Variables attach´ees
Variables attach´
ees/Bind variables
Exemple d’utilisation – optimisation
Exemple de requˆ
ete SELECT g´
en´
er´
ees des milliers de fois :
SELECT fname , lname , p c o d e FROM c u s t WHERE i d = 6 7 4 ; SELECT fname , lname , p c o d e FROM c u s t WHERE i d = 2 3 4 ; SELECT fname , lname , p c o d e FROM c u s t WHERE i d = 3 3 2 ;
. . .
A chaque soumission d’un requˆ
ete,
V´
erification si la requˆ
ete a d´
ej`
a ´
et´
e ´
et´
e soumise
Si oui, r´
ecup´
eration du plan d’ex´
ecution de la requˆ
ete, et
ex´
ecution de la requˆ
ete
PL/SQL Variables attach´ees
Variables attach´
ees/Bind variables
Exemple d’utilisation – optimisation
Si non,
analyse syntaxique de la requˆete
d´efinition des diff´erentes possibilit´es d’ex´ecution d´efinition du plan d’ex´ecution optimal
→ Processus coˆ
uteux en temps CPU, alors que seule la valeur
de id change !
Solution : r´
eutiliser le plan d’ex´
ecution existant
→ N´
ecessite d’utiliser des variables attach´
ees :
Substitution de la valeur par la variable attach´e
Envoi de la mˆeme requˆete pour toutes les valeurs de id Exemple :
PL/SQL Bloc PL/SQL
Bloc PL/SQL
syntaxe et directives
Les instructions peuvent ˆ
etre ´
ecrites sur plusieurs lignes.
Les unit´
es lexicales peuvent ˆ
etre s´
epar´
ees par des espaces :
D´elimiteurs Identificateurs
Litt´eraux (ou constantes) Commentaires
PL/SQL Bloc PL/SQL
Bloc PL/SQL
syntaxe et directives
Les litt´
eraux
Les dates et les chaˆınes de caract`
eres d´
elimit´
ees par deux
simples cotes
V nom := ’ T h i e r r y ’ ;
v a n n e e := t o n u m b e r ( t o c h a r ( v D a t e F i n P e r i o d e , ’YY ’ ) ) ;
Les nombres peuvent ˆ
etre des valeurs simples ou des
expressions
PL/SQL Bloc PL/SQL
Commentaires dans le code
Pr´
ec´
eder un commentaire ´
ecrit sur une seule ligne par ’--’.
Placer un commentaire ´
ecrit sur plusieurs lignes entre les
symboles ’/*’ et ’*/’.
Exemple :
v s a l NUMBER( 9 , 2 ) ; BEGIN /∗ C e c i e s t un c o m m e n t a i r e q u i p e u t e t r e e c r i t s u r p l u s i e u r s l i g n e s ∗/ ENd ; −− C e c i e s t un c o m m e n t a i r e s u r une l i g n ePL/SQL Bloc PL/SQL
Les Fonctions SQL en PL/SQL
Les fonctions sur les nombres
Les fonctions sur les chaˆınes de caract`
eres
Les fonctions de conversion de type de donn´
ees
Les fonctions de dates
PL/SQL Bloc PL/SQL
Exemples de fonctions SQL en PL/SQL
Exemples :
Recomposer l’adresse d’un employ´
e :
V A d r C o m p l e t e : = V Rue | | CHR( 3 2 ) | | V V i l l e | | CHR( 3 2 ) | | V C o d e P o s t a l ;
Convertir le nom en majuscule
V Nom := UPPER ( V Nom ) ;
Extraction d’une partie de la chaˆıne
V c h r := S u b s t r ( ’ PL/SQL ’ , 4 , 3 ) ;
Replacement d’une chaˆıne par une autre
PL/SQL Bloc PL/SQL
Blocs imbriqu´
es et port´
e des variables
. . . x BINARY INTEGER ; BEGIN −− Debut de l a p o r t e e de x . . . DECLARE y NUMBER; BEGIN −− d e b u t de l a p o r t e de y . . . END; −− f i n de l a p o r t e e de y . . . END; −− f i n de l a p o r t e e de x
PL/SQL Op´erateurs
Op´
erateurs dans PL/SQL
Identique `
a SQL
Logique Arithm´etique Concat´enation
Parenth`eses pour contrˆoler l’ordre des op´erations
PL/SQL Op´erateurs
Utilisation des variables li´
ees
Pour r´
ef´
erencer une variable en PL/SQL, on doit pr´
efixer son
nom par un ’:’
Exemple :
: c o d e r e t o u r := 0 ; I F v ´e r i f i e r c r ´e d i t o k ( c o m p t n o ) THEN : c o d e r e t o u r := 1 ; END I F ;PL/SQL Instructions
Instructions SQL dans PL/SQL
Extraire une ligne de donn´
ees `
a partir de la BD par la
commande SELECT. Un seul ensemble de valeurs peut ˆ
etre
retourn´
e
Effectuer des changements aux lignes dans la BD par les
commandes du LMD
Contrˆ
oler des transactions avec les commandes COMMIT,
ROLLBACK et SAVEPOINT
D´
eterminer les r´
esultats du LMD avec des curseurs implicites
(voir plus loin)
PL/SQL Instructions
Instruction SELECT dans PL/SQL
R´
ecup´
erer une donn´
ee de la BD avec SELECT.
Syntaxe
SELECT l i s t e s ´e l e c t i o n
INTO { nom var [ , nom var ] . . .
| n o m r e c o r d }
FROM t a b l e
PL/SQL Instructions
Instruction SELECT dans PL/SQL
La clause INTO est obligatoire
Exemple
DECLARE v d e p t n o NUMBER( 2 ) ; v l o c VARCHAR2( 1 5 ) ; BEGIN SELECT d e p t n o , l o c INTO v d e p t n o , v l o c FROM d e p tWHERE nom d = ’INFORMATIQUE ’ ;
. . . END;
PL/SQL Instructions
Instruction SELECT dans PL/SQL
Retourne la somme des salaires de tous les employ´
es d’un
d´
epartement donn´
e.
Exemple
DECLARE
v s o m s a l emp . s a l%TYPE ;
v d e p t n o NUMBER NOT NULL := 1 0 ;
BEGIN SELECT sum ( s a l ) −−f o n c t i o n d ’ a g r ´e g a t INTO v s o m s a l FROM emp WHERE d e p t n o = v d e p t n o ; END;
PL/SQL Manipulation de donn´ees
Manipulation de donn´
ees en PL/SQL
Effectuer des mises `
a jour des tables de la BD utilisant les
commandes du LMD :
INSERT UPDATE DELETE
PL/SQL Manipulation de donn´ees
Insertion de donn´
ees
Ajouter les informations d’un nouvel employ´
e `
a la table emp
Exemple
DECLARE
v empno NUMBER NOT NULL := 1 0 5 ;
BEGIN
INSERT INTO emp ( empno , emp nom , p o s t e , d e p t n o ) VALUES ( v empno , ’ C l´e m e n t ’ , ’ D i r e c t e u r ’ , 1 0 ) ; END ;
PL/SQL Manipulation de donn´ees
Mise `
a jour de donn´
ees
Augmenter le salaire de tous les employ´
es dans la table emp
qui ont le poste d’enseignant.
Exemple
DECLARE v a u g m s a l emp . s a l%TYPE := 2 0 0 0 ; BEGIN UPDATE emp SET s a l := s a l + v a u g m s a l WHERE j o b = ’ E n s e i g n a n t ’ ; END; 1PL/SQL Manipulation de donn´ees
Suppression de donn´
ees
Suppression des lignes appartenant au d´
epartement 10 de la
table emp
Exemple
DECLARE
v d e p t n o emp . d e p t n o%TYPE := 1 0 ; BEGIN
DELETE FROM emp
WHERE d e p t n o = v d e p t n o ; END;
PL/SQL Structure de contrˆole
Structure de contrˆ
ole dans PL/SQL
IF conditionnel :
I F THEN END I F ;
I F THEN ELSE END I F ;
I F THEN ELSIF END I F ;
Les boucles :
LOOP END LOOP ;
FOR LOOP END LOOP ;
PL/SQL Structure de contrˆole
Instruction IF
Syntaxe I F c o n d i t i o n THEN ´ e n o n c ´e s ; [ ELSIF c o n d i t i o n THEN ´ e n o n c ´e s ; ] [ ELSE ´ e n o n c ´e s ; ] END I F ;PL/SQL Structure de contrˆole
Instruction IF
Exemple de IF simple
Mettre le ID de l’employ´
e ’MARK’ `
a 101.
I F v nom = ’MARK ’ THEN v I D := 1 0 1 ;
PL/SQL Structure de contrˆole
IF simple
Si le nom de l’employ´
e est ’CLEMENT’, lui attribuer le poste
’Enseignant’, le d´
epartement n
◦102 et une commission de 25
% sur son salaire actuel
Exemple
. . . I F v nom = ’ C l´e m e n t ’ THEN v p o s t e := ’ E n s e i g n a n t ’ ; v d e p t n o := 1 0 2 ; v nouv comm := s a l ∗ 0 . 2 5 ; END I F ; . . .PL/SQL Structure de contrˆole
IF-THEN-ELSE
Si le nom de l’employ´
e est ’CLEMENT’, lui attribuer le poste
’Enseignant’, le d´
epartement n
◦102 et une commission de 25
% sur son salaire actuel, sinon afficher le message ’Employ´
e
inexistant’
Exemple
. . . I F v nom = ’ C l´e m e n t ’ THEN v p o s t e := ’ E n s e i g n a n t ’ ; v d e p t n o := 1 0 2 ; v nouv comm := s a l ∗ 0 . 2 5 ; ELSEDBMS OUTPUT . PUT LINE ( ’ Employ´e i n e x i s t a n t ’ ) ; END I F ;
PL/SQL Structure de contrˆole
IF-THEN-ELSIF
Pour une valeur donn´
ee en entr´
ee, retourner une valeur
calcul´
ee
Exemple
. . .
I F v d e b u t > 100 THEN RETURN ( 2 ∗ v d e b u t ) ;
ELSIF v d e b u t >= 50 THEN RETURN ( 5 ∗ v d e b u t ) ; ELSE RETURN ( 1 ∗ v d e b u t ) ;
END I F ; . . .
PL/SQL Structure de contrˆole
CASE
Exemple :
s e l e c t i d b c r e x p o , i d g e s t f i n , rownum ,
c a s e when rownum <= 50 t h e n ’ 1−50 rownum ’ | | rownum when rownum <= 100 t h e n ’ 51−100 rownum ’ | | rownum e l s e ’ p l u s de 100 ’ end
from b c r i . t b g s t f i n a n c e m e n t where rownum <= 100
Cette requˆ
ete permet de retourner un contenu dans une colonne en
fonction d’une condition
PL/SQL Structure de contrˆole
Boucle de base
Syntaxe LOOP −− d ´e l i m i t e u r ´ e n o n c´e 1 ; −− ´e n o n c´e . . . .EXIT [ WHEN c o n d i t i o n ] ; −− ´e n o n c´e EXIT
END LOOP ;
When : condition est une variable bool´
eenne ou expression (TRUE,
FALSE, ou NULL);
PL/SQL Structure de contrˆole
Boucle de base
Exemple
Ins´
erer 10 articles avec la date d’aujourd’hui.
. . . v D a t e DATE; v c o m p t e u r NUMBER( 2 ) := 1 ; BEGIN . . . v D a t e := SYSDATE ; LOOP
INSERT INTO a r t i c l e ( Artno , ADate ) VALUES ( v c o m p t e u r , v D a t e ) ; v c o m p t e u r := v c o m p t e u r + 1 ; EXIT WHEN v c o m p t e u r > 1 0 ; END LOOP ;
PL/SQL Structure de contrˆole
Boucle FOR
Syntaxe FOR i n d i c e IN [ REVERSE ] b o r n e i n f . . B o r n e s u p LOOP ´ e n o n c´e 1 ; ´ e n o n c´e 2 ; . . . . . END LOOP ;Utiliser la boucle FOR pour raccourcir le test d’un nombre
d’it´
erations
PL/SQL Structure de contrˆole
Boucle FOR
exemple
Ins´
erer Nb articles index´
es de 1 `
a Nb avec la date du syst`
eme en
utilisant la boucle FOR
ACCEPT Nb PROMPT ’ Donner l e nombre a r t i c l e : ’ . . .
v D a t e DATE; BEGIN
. . .
v D a t e := SYSDATE ;
FOR i IN 1 . . &Nb LOOP
INSERT INTO a r t i c l e ( Artno , ADate ) VALUES ( i , v D a t e ) ;
END LOOP ; . . .
PL/SQL Structure de contrˆole
Boucle WHILE
Syntaxe WHILE c o n d i t i o n LOOP ´ e n o n c´e 1 ; ´ e n o n c´e 2 ; . . . . . END LOOP ;La condition est ´
evalu´
ee au d´
ebut de chaque it´
eration
Utiliser la boucle WHILE pour r´
ep´
eter des ´
enonc´
es tant que la
condition est vraie
PL/SQL Structure de contrˆole
Boucle WHILE
Exemple
ACCEPT p i t e m t o t PROMPT ’ Donner l e t o t a l max de l ’ ’ a c h a t d ’ ’ un a r t i c l e ’ DECLARE v D a t e DATE ; v c o m p t e u r NUMBER( 2 ) := 1 ; BEGIN . . . v D a t e := SYSDATE ;
WHILE v c o m p t e u r <= &p i t e m t o t LOOP INSERT INTO a r t i c l e ( A r t n o , ADate )
VALUES ( v c o m p t e u r , v D a t e ) ; v c o m p t e u r := v c o m p t e u r + 1 ; END LOOP ;
PL/SQL Structure de contrˆole
Boucles imbriqu´
ees et Labels
Imbriquer les boucles `
a niveaux multiples
Utiliser les labels pour distinguer les blocs et les boucles
Quitter la boucle ext´
erieure avec un EXIT r´
ef´
eren¸
cant le label
PL/SQL Structure de contrˆole
Boucles imbriqu´
ees et Labels
. . . . BEGIN << b o u c e x t >> LOOP v c o m p t e u r := v c o m p t e u r + 1 ; EXIT WHEN v c o m p t e u r > 1 0 ; <<b o u c i n t >> LOOP . . .EXIT b o u c e x t WHEN t o t a l f a i t = ’ OUI ’ ; −− q u i t t e r l e s d e u x b o u c l e s
EXIT WHEN i n t f a i t = ’ OUI ’ ;
−− q u i t t e r l a u n i q u e m e n t l a b o u c l e i n t e r n e . . .
END LOOP b o u c i n t ; . . .
PL/SQL Types de donn´ees complexes
Types de donn´
ees complexes
Types :
RECORDS TABLES
Contiennent des composants internes
Sont r´
eutilisables
PL/SQL Types de donn´ees complexes
Records PL/SQL
Contiennent des champs qui sont soit des scalaires, des
records ou des tables PL/SQL
Structure similaire `
a des enregistrements dans les langages de
programmation classiques
Tr`
es utiles pour rechercher des lignes de donn´
ees dans une
table et les traiter
PL/SQL Types de donn´ees complexes
Cr´
eation d’un record PL/SQL
Syntaxe
TYPE <Nom Enreg> I S RECORD ( Champ1 Type1
. .
ChampN TypeN ) ;
Exemple
TYPE TProd I S RECORD (
VRefPro NUMBER( 4 ) , VDesPro VARCHAR2( 3 0 ) , V P r i U n i NUMBER( 7 , 2 )
PL/SQL Types de donn´ees complexes
Attribut %ROWTYPE
D´
eclaration d’une variable associ´
ee `
a une collection de
colonnes dans une table ou une vue de la BD
le nom de la table doit pr´
ec´
eder %ROWTYPE
Les champs dans le record prennent leurs noms et types des
colonnes de la table ou la vue en question
PL/SQL Types de donn´ees complexes
Attribut %ROWTYPE
Exemples
D´
eclarer une variable pour stocker les mˆ
emes informations
concernant une personne telles qu’elles sont stock´
ees dans la
table PERS
p e r s o n n e P e r s%ROWTYPE;
D´
eclarer une variable pour stocker les mˆ
emes informations
concernant un article telles qu’elles sont stock´
ees dans la table
ART
PL/SQL Tables PL/SQL
Tables PL/SQL
Le type de donn´
ees complexe TABLE offre au d´
eveloppeur un
m´
ecanisme pour traiter les tableaux
Il se compose de deux colonnes :
Une cl´e primaire de type BINARY_INTEGER Une colonne de type scalaire ou record
PL/SQL Tables PL/SQL
Cr´
eation d’une table PL/SQL
Syntaxe
TYPE <N o m t a b l e > I S TABLE OF <t y p e > INDEX BY BINARY INTEGER ;
Exemple
TYPE t y p e e t u d n o m I S TABLE OF e t u d . nom%TYPE INDEX BY BINARY INTEGER ; etud nom t y p e e t u d n o m ;
PL/SQL Tables PL/SQL
Structure d’une table PL/SQL
en m´emoire
Cl´
e primaire
Colonne
1
Ritchie
2
Marvin
3
Dennis
. . .
. . .
. . .
. . .
PL/SQL Tables PL/SQL
Cr´
eer une table PL/SQL
SQL> DECLARE
2 TYPE t y p e e t u d n o m I S TABLE OF v a r c h a r 2 ( 1 0 ) INDEX BY BINARY INTEGER ; 3 e t u d n o m t y p e e t u d n o m ; 4 BEGIN 5 s e l e c t nom 6 i n t o e t u d n o m ( 1 ) 7 from e t u d 8 where e t u d i d = 6 ; 9 d b m s o u t p u t . p u t l i n e ( e t u d n o m ( 1 ) ) ; 10 d b m s o u t p u t . p u t l i n e ( e t u d n o m ( 2 ) ) ; 11 end ; 12 / mark DECLARE ∗ ERREUR `a l a l i g n e 1 :
PL/SQL Tables PL/SQL
TABLE de RECORDS en PL/SQL
D´
efinit une table dont la deuxi`
eme colonne est un
enregistrement au lieu d’un scalaire
Pour d´
efinir la deuxi`
eme colonne :
Soit en utilisant l’attribut %ROWTYPE Soit en utilisant un record d´ej`a d´efini
PL/SQL Tables PL/SQL
TABLE de RECORDS PL/SQL
Exemple 1 DECLARE TYPE t y p e e t u d n o m I S TABLE OF e t u d%r o w t y p e INDEX BY BINARY INTEGER ; e t u d n o m t y p e e t u d n o m ; BEGIN SELECT nom INTO e t u d n o m ( 1 ) . nom FROM e t u d . . . END ;PL/SQL Tables PL/SQL
TABLE de RECORDS PL/SQL
Exemple 2
DECLARE
TYPE r e c e t u d I S RECORD( i d e t u d . e t u d i d%TYPE , nom e t u d . nom%TYPE ) ; TYPE t y p e e t u d n o m I S TABLE OF r e c e t u d%ROWTYPE
INDEX BY BINARY INTEGER ; e t u d n o m t y p e e t u d n o m ; BEGIN SELECT nom INTO e t u d n o m ( 1 ) . nom FROM e t u d . . . END ;
PL/SQL Curseurs
Les curseurs dans SQL
Un curseur est une zone de travail priv´
ee de SQL (zone
tampon)
Il y a deux types de curseurs:
Curseurs implicites Curseurs explicites
Oracle utilise les curseurs implicites pour analyser et ex´
ecuter
les ´
enonc´
es de SQL
Les curseurs explicites sont d´
eclar´
es explicitement pas le
programmeur
PL/SQL Curseurs
Les attributs des curseurs SQL
Les attributs des curseurs SQL permettent de tester les r´
esultats
des ´
enonc´
es SQL
SQL%ROWCOUNT
Nombre de lignes affect´
e par l’´
enonc´
e
SQL le plus r´
ecent (renvoie un entier).
SQL%FOUND
attribut bool´
een qui prend la valeur TRUE
si l’´
enonc´
e SQL le plus r´
ecent affecte une
ou plusieurs lignes.
SQL%NOTFOUND
attribut bool´
een qui prend la valeur TRUE
si l’´
enonc´
e SQL le plus r´
ecent n’affecte
aucune ligne.
SQL%ISOPEN
Prend toujours la valeur FALSE parce que
PL/SQL ferment les curseurs implicites
PL/SQL Curseurs
Les attributs des curseurs SQL
Supprimer de la table ITEM des lignes ayant un ordre sp´
ecifi´
e.
Afficher le nombre de lignes supprim´
ees.
Exemple
DECLARE v o r d i d NUMBER := 6 0 5 ; BEGIN DELETE FROM i t e m WHERE o r d i d = v o r d i d ;DBMS OUTPUT . PUT LINE ( SQL%ROWCOUNT | | ’ L i g n e s s u p p r i m ´e e s ’ ) ; END ;
Remarque : ne pas oublier Set ServerOutput on (sous
SQLPLUS)
PL/SQL Curseurs
Les curseurs
Chaque ´
enonc´
e SQL ex´
ecut´
e par Oracle a son propre curseur :
Curseurs implicites : d´
eclar´
es pour tout ´
enonc´
e SELECT du
LMD ou PL/SQL
PL/SQL Curseurs
PL/SQL Curseurs
PL/SQL Curseurs
D´
eclaration des curseurs
Syntaxe
CURSOR n o m d u c u r s e u r I S un ´e n o n c´e SELECT ;
Ne pas inclure la clause INTO dans la d´
eclaration du curseur
Si le traitement des lignes doit ˆ
etre fait dans un ordre
sp´
ecifique, on utilise la clause ORDER BY dans la requˆ
ete
PL/SQL Curseurs
D´
eclaration des curseurs
Exemple DECLARE CURSOR C1 I S SELECT R e f A r t , NomArt , Q t e A r t FROM A r t i c l e WHERE Q t e A r t < 5 0 0 ;
PL/SQL Curseurs
Ouverture du curseur
Syntaxe
OPEN n o m d u c u r s e u r ;
Ouvrir le curseur pour ex´
ecuter la requˆ
ete et identifier
l’ensemble actif
Si la requˆ
ete ne renvoie aucune ligne, aucune exception n’aura
lieu
Utiliser les attributs des curseurs pour tester le r´
esultat du
FETCH
PL/SQL Curseurs
Recherche des donn´
ees dans le curseur
Syntaxe
FETCH n o m d u c u r s e u r
INTO [ v a r i a b l e 1 , [ v a r i a b l e 2 , . . . ] | n o m d e r e c o r d ] ;
Rechercher les informations de la ligne en cours et les mettre dans
des variables.
PL/SQL Curseurs
Recherche des donn´
ees dans le curseur
Exemples
FETCH c1 INTO v R e f A r t , v NomArt , v Q t e A r t ;
. . . . OPEN C u r E t u d ; LOOP FETCH C u r E t u d INTO R e c E t u d ; { t r a i t e m e n t s d e s d o n n´ee s r e c h e r c h ´e e s } . . . END LOOP ; . . .
PL/SQL Curseurs
Fermeture du curseur
Syntaxe
CLOSE n o m d u c u r s e u r ;
Fermer le curseur apr`
es la fin du traitement des lignes
Rouvrir le curseur si n´
ecessaire
On ne peut pas rechercher des informations dans un curseur si
ce dernier est ferm´
e
PL/SQL Curseurs
Les attributs du curseur explicite
Obtenir les informations d’´
etat du curseur (CUR EXP)
Attribut
Type
Description
CUR EXP%ISOPEN
BOOLEAN
Prend la valeur TRUE
si le curseur est ouvert
CUR EXP%NOTFOUND
BOOLEAN
Prend la valeur TRUE
si le FETCH le plus r´
ecent
ne retourne aucune ligne
CUR EXP%FOUND
BOOLEAN
Prend la valeur TRUE
si le FETCH le plus r´
ecent
retourne une ligne
CUR EXP%ROWCOUNT
NUMBER
Retourne le nombre de lignes
PL/SQL Curseurs
Contrˆ
ole des recherches multiples
Traitement de plusieurs lignes d’un curseurs en utilisant une
boucle
Rechercher une seule ligne `
a chaque it´
eration
Utiliser les attributs du curseur explicite pour tester le succ`
es
de chaque FETCH
PL/SQL Curseurs
Attribut %ISOPEN
La recherche des lignes n’est possible que si le curseur est
ouvert
Utiliser l’attribut %ISOPEN avant un FETCH pour tester si le
curseur est ouvert ou non
Exemple :
I F NOT C1%ISOPEN THEN
OPEN C1
END I F ; LOOP
PL/SQL Curseurs
Attributs %FOUND, %NOTFOUND et %ROWCOUNT
Utiliser l’attribut %ROWCOUNT pour fournir le nombre exact des
lignes trait´
ees
Utiliser les attributs %FOUND et %NOT FOUND pour formuler le
test d’arrˆ
et de la boucle
PL/SQL Curseurs
Attributs %FOUND, %NOTFOUND et NOTFOUND%ROWCOUNT
Exemple
LOOP
FETCH c u r s 1 INTO v e t u d i d , v nom ; I F c u r s 1%ROWCOUNT > 20 THEN
. . .
EXIT WHEN c u r s 1%NOTFOUND;
. . . END LOOP ;
PL/SQL Curseurs
Obtenir les informations d’´
etat du curseur
Exemple complet
DECLARE
nom emp . ename%TYPE ; s a l a i r e emp . s a l%TYPE ;
CURSOR C1 I S SELECT ename , NVL( s a l , 0 ) FROM emp ; BEGIN
OPEN C1 ; LOOP
FETCH C1 INTO nom , s a l a i r e ; EXIT WHEN C1%NOTFOUND;
DBMS OUTPUT . PUT LINE ( nom | | ’ g a g n e ’ | | s a l a i r e | | ’ d o l l a r s ’ ) ; END LOOP ;
PL/SQL Curseurs
Les curseurs et les Records
Traitement des lignes de l’ensemble actif par l’affectation des
valeurs `
a des records PL/SQL.
Exemple
. . .
CURSOR E t u d C u r s I S
SELECT e t u d n o , nom , age , a r d
FROM e t u d WHERE a g e < 2 6 ; E t u d R e c o r d E t u d C u r s%ROWTYPE; BEGIN OPEN E t u d C u r s ; . . . FETCH E t u d C u r s INTO E t u d R e c o r d ;
PL/SQL Curseurs
Les boucles FOR des curseurs
Syntaxe FOR n o m r e c o r d IN n o m c u r s e u r LOOP −− t r a i t e m e n t d e s i n f o r m a t i o n s −− u t i l i s e r d e s o r d r e s SQL −− u t i l i s e r d e s o r d r e s PL / SQL END LOOP ; . . .
Un raccourci pour le traitement des curseurs explicites
OPEN, FETCH et CLOSE se font de fa¸
con implicite
Ne pas d´
eclarer le record, il est d´
eclar´
e implicitement
PL/SQL Curseurs
Les boucles FOR des curseurs
Exemple
DECLARE
CURSOR C u r E t u d I S
SELECT ∗ FROM Etud ;
BEGIN
FOR R e c E t u d IN C u r E t u d LOOP
DBMS OUTPUT . PUT LINE ( R e c E t u d . e t u d i d | | ’ ’ | | R e c E t u d . nom | | ’ ’ | | R e c E t u d . a d r ) ; END LOOP ;
END; /
PL/SQL Exceptions
Manipulation des exceptions en PL/SQL
Le traitement des exceptions PL/SQL : m´
ecanisme pour
manipuler les erreurs rencontr´
ees lors de l’ex´
ecution
Possibilit´
e de continuer l’ex´
ecution si l’erreur n’est pas
suffisamment importante pour produire la terminaison de la
proc´
edure
D´
ecision de continuer une proc´
edure apr`
es erreur : d´
ecision
que le d´
eveloppeur doit faire en fonction des erreurs possibles
PL/SQL Exceptions
Types des exceptions
D´
eclench´
ees implicitement
Exceptions Oracle pr´ed´efinies Exceptions Oracle Non-pr´ed´efinies
D´
eclench´
ees explicitement
PL/SQL Exceptions
Capture des exceptions
Syntaxe
EXCEPTION
WHEN e x c e p t i o n 1 [OR e x c e p t i o n 2 . . . ] THEN ´e n o n c´e 1 ;
´e n o n c´e 2 ; . . .
[WHEN e x c e p t i o n 2 [OR e x c e p t i o n 4 . . . ] THEN ´e n o n c´e 3 ;
´e n o n c´e 4 ; . . . ]
[WHEN OTHERS THEN
´e n o n c´e 5 ; ´e n o n c´e 6 ;
PL/SQL Exceptions
Capture des exceptions pr´
ed´
efinies
Faire r´
ef´
erence au nom dans la partie traitement des
exceptions
Quelques exceptions pr´
ed´
efinies :
NO DATA FOUND TOO MANY ROWS INVALID CURSOR ZERO DIVIDE DUP VAL ON INDEX
PL/SQL Exceptions
Exceptions pr´
ed´
efinies
Exemple
BEGIN . . . EXCEPTION
WHEN NO DATA FOUND THEN
´e n o n c´e 1 ; ´e n o n c´e 2 ;
DBMS OUTPUT . PUT LINE (TO CHAR ( e t u d n o ) | | ’ Non v a l i d e ’ ) ;
WHEN TOO MANY ROWS THEN
´e n o n c´e 3 ; ´e n o n c´e 4 ;
DBMS OUTPUT . PUT LINE ( ’ Donn´ees i n v a l i d e s ’ ) ;
WHEN OTHERS THEN
PL/SQL Exceptions
PL/SQL Exceptions
Capture des exceptions non-pr´
ed´
efinies
Exemple
Capture de l’erreur n
◦2291 (violation de la contrainte int´
egrit´
e).
DECLARE
c o n t i n t e g r i t v i o l EXCEPTION ;
PRAGMA EXCEPTION INIT ( c o n t i n t e g r i t v i o l , −2291); . . .
BEGIN . . . EXCEPTION
WHEN c o n t i n t e g r i t v i o l THEN
DBMS OUTPUT . PUT LINE ( ’ v i o l a t i o n de c o n t r a i n t e d ’ i n t ´e g r i t ´e ’ ) ;
. . . END ;
PL/SQL Exceptions
PL/SQL Exceptions
Exceptions d´
efinies par l’utilisateur
Exemple DECLARE x number : = . . . ; x t r o p p e t i t EXCEPTION ; . . . BEGIN . . . I F x < 5 THEN RAISE x t r o p p e t i t ; END I F ; . . . EXCEPTION WHEN x t r o p p e t i t THEN
DBMS OUTPUT . PUT LINE ( ’ l a v a l e u r de x e s t t r o p p e t i t e ! ! ’ ) ; . . .
PL/SQL Exceptions
Fonctions pour capturer les exceptions
SQLCODE : Retourne la valeur num´
erique du code de l’erreur
SQLERRM : Retourne le message associ´
e au num´
ero de l’erreur
PL/SQL Exceptions
Fonctions pour capturer les exceptions
Exemple . . . v c o d e e r r e u r NUMBER; v m e s s a g e e r r e u r VARCHAR2( 2 5 5 ) ; BEGIN . . . EXCEPTION . . .
WHEN OTHERS THEN . . .
v c o d e e r r e u r := SQLCODE ; v m e s s a g e e r r e u r := SQLERRM ;
INSERT INTO e r r e u r s VALUES ( v c o d e e r r e u r , v m e s s a g e e r r e u r ) ;
PL/SQL Sous-programmes
Les sous-programmes
Un sous programme est une s´
equence d’instruction PL/SQL
qui poss`
ede un nom
On distingue deux types de sous programmes :
Les proc´edures Les fonctions
PL/SQL Sous-programmes
Les sous-programmes
Une proc´
edure : sous programme qui ne retourne des r´
esultats
seulement dans ses param`
etres
Une fonction : sous programme qui retourne des r´
esultats
dans :
Le nom de la fonction Les param`etres de la fonction
PL/SQL Sous-programmes
Les proc´
edures
Syntaxe
DECLARE . . .
PROCEDURE <Nom Proc >[( P1 , . . . , Pn ) ] I S [ D ´e c l a r a t i o n s l o c a l e s ] BEGIN . . . EXCEPTION . . . END; BEGIN /∗ A p p e l de l a p r o c ´e d u r e ∗/ . . . EXCEPTION
PL/SQL Sous-programmes
Les proc´
edures
Syntaxe des param`etres
P1,...,Pn suivent la syntaxe :
<Nom Arg> [ IN | OUT | IN OUT] <Type>
O`
u :
IN : Param`
etre d’entr´
ee
OUT : Param`
etre de sortie
IN OUT : Param`
etre d’entr´
ee/Sortie
Par d´
efaut le param`
etre est IN
PL/SQL Sous-programmes
Les proc´
edures
Exemple DECLARE
PROCEDURE N o u v S a l (PNum IN Emp . Emp Id %Type , PAug NUMBER ) I S V S a l NUMBER ( 7 , 2 ) ;
BEGIN
SELECT S a l INTO V S a l FROM Emp WHERE e m p I d=PNum ;
UPDATE Emp SET S a l = V S a l+PAug WHERE Emp Id=PNum ;
COMMIT; EXCEPTION
WHEN NO DATA FOUND THEN
DBMS OUTPUT . PUT LINE ( ’ Employ´e i n e x i s t a n t ’ ) ; END ;
BEGIN
N o u v S a l ( 7 5 5 0 , 5 0 0 ) ; EXCEPTION
PL/SQL Sous-programmes
Les proc´
edures
Exemple
DECLARE
V E r r NUMBER ;
PROCEDURE N o u v S a l (PNum Emp . Emp Id %TYPE , PAug NUMBER, P E r r OUT NUMBER ) I S
V S a l NUMBER ( 7 , 2 ) ; BEGIN
SELECT S a l INTO V S a l FROM Emp WHERE e m p I d=PNum ; UPDATE Emp SET S a l = V S a l+PAug WHERE Emp Id=PNum ; COMMIT; P E r r :=0
EXCEPTION
WHEN NO DATA FOUND THEN P E r r :=1 ;
PL/SQL Sous-programmes
Les proc´
edures
Exemple
BEGIN
N o u v S a l ( 7 5 5 0 , 5 0 0 , V E r r ) ; I F V E r r = 0 THEN
DBMS OUTPUT . PUT LINE ( ’ O p ´e r a t i o n E f f e c t u ´e e ’ ) ; ELSE DBMS OUTPUT . PUT LINE ( ’ Employ´e i n e x i s t a n t ’ ) ; END I F ;
EXCEPTION
WHEN OTHERS THEN DBMS OUTPUT . PUT LINE ( ’ E r r e u r ’ ) ; END ;
PL/SQL Sous-programmes
Les fonctions
Syntaxe DECLARE [ D ´e c l a r a t i o n s g l o b a l e s ]FUNCTION <Nom fonc > [ ( P1 , . . . , Pn ) ] RETURN Type I S [ D ´e c l a r a t i o n s l o c a l e s ] BEGIN . . . RETURN v a l e u r ; EXCEPTION . . . END ; BEGIN −− A p p e l a l a f o n c t i o n . . . . EXCEPTION . . . END ; /
PL/SQL Sous-programmes
Les fonctions
Exemple DECLARE VNomComplet VARCHAR2 ( 4 0 ) ;FUNCTION NomComplet (PNum Emp . Emp I d%TYPE , P E r r OUT NUMBER )
RETURN VARCHAR2 I S
VLastName Emp . L a s t N a m e %Type ; V F i r s t N a m e Emp . F i r s t N a m e %Type ; BEGIN
SELECT Last Name , F i r s t N a m e INTO VLastName , V F i r s t N a m e WHERE Emp Id=PNum ; P E r r : = 0 ;
RETURN VLastName | | ’ ’ | | V F i r s t N a m e ; EXCEPTION
WHEN NO DATA FOUND THEN P E r r : = 1 ; RETURN N u l l ; END ;
PL/SQL Sous-programmes
Les fonctions
Exemple BEGIN VNomComplet := NomComplet(&Num, V E r r ) ; I F V E r r = 0 THENDBMS OUTPUT . PUT LINE ( ’Nom C o m p l e t e s t : ’ | | VNomComplet ) ; ELSE DBMS OUTPUT . PUT LINE ( ’ Employ´e i n e x i s t a n t ’ ) ;
END I F ; EXCEPTION
WHEN OTHERS THEN DBMS OUTPUT . PUT LINE ( ’ E r r e u r ’ ) ; END ;
PL/SQL Sous-programmes
Le param`
etre IN OUT
Param`
etre jouant le rˆ
ole des deux param`
etre IN et OUT
Obligatoire de le sp´
ecifier
Exemple :
SQL> C r e a t e o r r e p l a c e p r o c e d u r e a f f n o m ( v nom IN OUT v a r c h a r 2 ) I S
2 BEGIN
3 v nom := UPPER ( v nom ) ;
4 END a f f n o m ;
5 /
PL/SQL Sous-programmes
Appel de affnom de SQL*Plus
D´
efinition d’une variable li´
ee
Initialisation de la variable
SQL> v a r name v a r c h a r 2 ( 1 0 ) ;
SQL> b e g i n : name := ’ mark ’ ; end ; / P r o c ´e d u r e PL/SQL t e r m i n ´e e a v e c s u c c `e s SQL> p r i n t name NAME −−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− mark
PL/SQL Sous-programmes
Appel de affnom de SQL*Plus
Ex´
ecution de la proc´
edure avec un param`
etre IN OUT
Affichage la nouvelle valeur de la variable
SQL> e x e c u t e a f f n o m ( : name ) ; P r o c ´e d u r e PL/SQL t e r m i n ´e e a v e c s u c c `e s . SQL> p r i n t name NAME −−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− MARK
PL/SQL Sous-programmes
Passage de param`
etres
Il y a plusieurs fa¸cons de passage de param`
etres :
Appel de la proc´
edure en sp´
ecifiant les param`
etres
Appel de la proc´
edure sans param`
etre si ce dernier est un
param`
etre d’entr´
ee initialis´
e
Appel de la proc´
edure en changeant la position des
param`
etres (il faut sp´
ecifier le nom du param`
etre)
PL/SQL Sous-programmes
Passage de param`
etres
Exemple
CREATE OR REPLACE PROCEDURE r e n s e i g n e t u d ( v nom IN e t u d . nom%t y p e d e f a u l t ’ i n c o n n u ’ , v a d r IN e t u d . a d r%t y p e d e f a u l t ’ i n c o n n u ’ ) I S BEGIN INSERT INTO e t u d VALUES ( e t u d e t u d i d . n e x t v a l , v nom , v a d r ) ; END;
PL/SQL Sous-programmes
Passage de param`
etres
Exemple SQL> b e g i n 2 r e n s e i g n e t u d ( ’ mark ’ , ’ p a r i s ’ ) ; 3 r e n s e i g n e t u d ; 4 r e n s e i g n e t u d ( v a d r => ’ l y o n ’ ) ; 5 end ; 6 / P r o c ´e d u r e PL/SQL t e r m i n ´e e a v e c s u c c `e s . SQL> s e l e c t ∗ from e t u d ;
ETUDID NOM ADR
−−−−−−−−−− −−−−−−−−−− −−−−−−−−−−
6 mark p a r i s
PL/SQL Sous-programmes
Les proc´
edures et les fonctions stock´
ees
Sont des blocs PL/SQL qui poss`
edent un nom
Consistent `
a ranger le block PL/SQL compil´
e dans la base de
donn´
ees (CREATE)
Peuvent ˆ
etre r´
eutilis´
ees sans ˆ
etre recompil´
ees (EXECUTE)
Peuvent ˆ
etre appel´
ees de n’importe bloc PL/SQL
PL/SQL Sous-programmes
Les proc´
edures stock´
ees
Syntaxe
CREATE [ OR REPLACE ] PROCEDURE <Nom Proc >[( P1 , . . . , Pn ) ] I S [ D ´e c l a r a t i o n s d e s v a r i a b l e s l o c a l e s ] BEGIN . . . EXCEPTION . . . END; /
Procedure Created : La proc´
edure est correcte
Ou
Procedure Created with compilation errors : Corriger
les erreurs → SHOW ERRORS;
PL/SQL Sous-programmes
Les proc´
edures stock´
ees
Exemple
CREATE [ OR REPLACE ] PROCEDURE
A j o u t P r o d ( P r e f P r o Prod . R e f P r o%TYPE , . . . P P r i U n i Prod . P r i U n i% TYPE , P E r r OUT Number ) I S BEGIN
INSERT INTO Prod VALUES( P r e f P r o , . . . , P P r i U n i ) ; COMMIT;
P E r r : = 0 ; EXCEPTION
WHEN DUP VAL ON INDEX THEN P E r r : = 1 ;
PL/SQL Sous-programmes
Appel des proc´
edures stock´
ees
Syntaxe
La proc´
edure stock´
ee est appel´
ee par les applications soit :
En utilisant son nom dans un bloc PL/SQL (autre proc´
edure)
Par execute dans SQL*Plus
Dans un bloc PL/SQL :
DECLARE BEGIN <Nom Procedure >[<P1 > , . . . , < Pn > ] ; END;Sous SQL*PLUS :
PL/SQL Sous-programmes
Appel des proc´
edures stock´
ees
Exemple ACCEPT VRefPro . . . ACCEPT V P r i U n i . . . DECLARE V E r r NUMBER; BEGIN
A j o u t P r o d (& VRefPro , . . . , & V P r i U n i , V E r r ) ; I F V E r r=0 THEN
DBMS OUTPUT . PUT LINE ( ’ O p ´e r a t i o n E f f e c t u e r ’ ) ; ELSE DBMS OUTPUT . PUT LINE ( ’ E r r e u r ’ ) ;
END I F ; END ;
PL/SQL Sous-programmes
Les fonctions stock´
ees
Syntaxe
CREATE [ OR REPLACE ] FUNCTION <Nom Fonc >[( P1 , . . . , Pn ) ] RETURN Type I S [ D ´e c l a r a t i o n s d e s v a r i a b l e s l o c a l e s ] BEGIN I n s t r u c t i o n s SQL e t PL/ S q l RETURN( V a l e u r ) EXCEPTION T r a i t e m e n t d e s e x c e p t i o n s END; /
function Created : La fonction est correcte
Ou
PL/SQL Sous-programmes
Les fonctions stock´
ees
Exemple
CREATE [ OR REPLACE ] FUNCTION NbEmp ( PNumDep Emp . D e p t I d%Type , P E r r Out Number ) R e t u r n Number I S
VNb Number ( 4 ) ; BEGIN
S e l e c t Count ( ∗ ) I n t o VNb From Emp Where D e p t I d=PNumDep ; P E r r :=0 R e t u r n VNb ; E x c e p t i o n When N o D a t a F o u n d Then P E r r : = 1 ; R e t u r n N u l l ; END ;
PL/SQL Sous-programmes
Appel des fonctions stock´
ees
Syntaxe
La fonction stock´
ee est appel´
ee par les applications soit :
Dans une expression dans un bloc PL/SQL
Dans une expression dans par la commande EXECUTE (dans
SQL*PLUS)
Dans un bloc PL/SQL :
DECLARE BEGIN <v a r > := <N o m f o n c t i o n >[<P1 > , . . . , < Pn>] END;Sous SQL*PLUS :
EXECUTE :< v a r > := <N o m f o n c t i o n > [<P1 > , . . . , < Pn>]PL/SQL Sous-programmes
Appel des fonctions stock´
ees
Exemple A c c e p t VDep . . . D e c l a r e V E r r Number ; VNb Number ( 4 ) ; Begin VNb :=NbEmp(&VDep , V E r r ) ; I f V E r r=0 Then DBMS Output . P u t L i n e ( ’ Le nombre d ’ e m p l o y ´e e s e s t : ’ | | VNb ) ; E l s e DBMS Output . P u t L i n e ( ’ E r r e u r ’ ) ; End I f ; End ;
PL/SQL Sous-programmes
Appel des fonctions stock´
ees
Exemple SQL> VARIABLE VNb SQL> EXECUTE : VNb:=NbEmp(&VDep , V E r r ) ; P r o c ´e d u r e PL/SQL t e r m i n ´e e a v e c s u c c `e s . SQL> PRINT VNb VNB −−−−−−−−−− 300
PL/SQL Sous-programmes
Suppression des proc´
edures et des fonctions stock´
ees
Syntaxe
Comme tout objet manipul´
e par Oracle, les proc´
edures et les
fonctions peuvent ˆ
etre supprim´
ees si n´
ecessaire
Cette suppression est assur´
ee par la commande suivante :
DROP PROCEDURE n o m p r o c e d u r e ; DROP FUNCTION n o m f o n c t i o n ;
PL/SQL Sous-programmes
Suppression des proc´
edures et des fonctions stock´
ees
Exemple
SQL> DROP PROCEDURE A j o u t P r o d ; P r o c e d u r e d r o p p e d .
SQL> DROP FUNCTION NbEmp ;
PL/SQL Sous-programmes
Les proc´
edures et les fonctions stock´
ees
Quelques commandes utiles :
SELECT o b j e c t n a m e , o b j e c t t y p e from o b j ;
DESC n o m p r o c e d u r e
PL/SQL Packages
Les packages
Un objet PL/SQL qui stocke d’autres types d’objet :
proc´
edures, fonctions, curseurs, variables, ...
Consiste en deux parties :
Sp´ecification (d´eclaration) Corps (impl´ementation)
Ne peut pas ˆ
etre appel´
e, ni param´
etr´
e ni imbriqu´
e
PL/SQL Packages
D´
eveloppement des packages
Sauvegarder l’´
enonc´
e de CREATE PACKAGE dans deux
fichiers diff´
erents (ancienne/derni`
ere version) pour faciliter de
´
eventuelles modifications
Le corps du package ne peut pas ˆ
etre compil´
e s’il n’est pas
d´
eclar´
e (sp´
ecifi´
e)
Restreindre les privil`
eges pour les proc´
edures `
a une personne
donn´
ee au lieu de lui donner tout les droits sur toutes les
proc´
edures
PL/SQL Packages
La sp´
ecification du package
Syntaxe
Contient la d´
eclaration des curseurs, variables, types, proc´
edures,
fonctions et exceptions
CREATE [OR REPLACE ] PACKAGE <Nom Package> I S [ D ´e c l a r a t i o n d e s v a r i a b l e s e t Types ]
[ D ´e c l a r a t i o n d e s c u r s e u r s ]
[ D ´e c l a r a t i o n d e s p r o c ´e d u r e s e t f o n c t i o n s ] [ D ´e c l a r a t i o n d e s e x c e p t i o n s ]
END[< Nom Package > ] ; /
PL/SQL Packages
La sp´
ecification du package
Exemple Create Or R e p l a c e P a c k a g e PackProd I s C u r s o r CProd I s S e l e c t R e f P r o , DesPro From P r o d u i t ; P r o c e d u r e A j o u t P r o d ( P r e f P r o Prod . R e f P r o%Type , . . . , P E r r Out Number ) ; P r o c e d u r e M o d i f P r o d ( P r e f P r o Prod . R e f P r o%Type , . . . , P E r r Out Number ) ; P r o c e d u r e SuppProd ( P r e f P r o Prod . R e f P r o%Type ,. . . , P E r r Out Number ) ; P r o c e d u r e A f f P r o d ;
EndPackProd ; /
PL/SQL Packages
Le corps du package
Syntaxe
On impl´
emente les proc´
edures et fonctions d´
eclar´
ees dans la
sp´
ecification
Create [ Or R e p l a c e ] P a c k a g e Body <Nom Package> I s [ I m p l ´e m e n t a t i o n p r o c ´e d u r e s | f o n c t i o n s ] End [< Nom Package > ] ;
PL/SQL Packages
Le corps du package
Syntaxe
Create Or R e p l a c e P a c k a g e Body PackProd I s P r o c e d u r e A j o u t P r o d ( P r e f P r o Prod . R e f P r o%Type , . . . , P E r r Out Number ) I s Begin I n s e r t I n t o Prod Values ( P r e f P r o , . . . , P P r i U n i ) ; Commit ; P E r r : = 0 ; E x c e p t i o n When D u p V a l O n I n d e x Then P E r r : = 1 ; When O t h e r s Then P E r r := 1 ;
PL/SQL Packages
Le corps du package
Syntaxe P r o c e d u r e M o d i f P r o d ( P r e f P r o Prod . R e f P r o%Type , . . . , P E r r Out Number ) I s B B o o l e a n ; Begin . . . EndPackProd ; /PL/SQL Packages
Appels des proc´
edures / fonctions du package
Syntaxe
Les proc´
edures et les fonctions d´
efinies dans un package sont
appel´
ees de la fa¸
con suivante :
<NomPackage>.<NomProcedure >[( P a r a m `e t r e s ) ] ;
PL/SQL Packages
Appels des proc´
edures / fonctions du package
Exemple A c c e p t VRef Prompt ’ . . . ’ ; A c c e p t V P r i Prompt ’ . . . ’ ; D e c l a r e V E r r Number ; Begin
PackProd . M o d i f P r o d (&VRef , . . . , &VPri , V E r r ) ; I f V E r r= 0 Then DBMS Output . P u t L i n e ( ’ T r a i t e m e n t e f f e c t u ´e ’ ) ; E l s e DBMS Output . P u t L i n e ( ’ E r r e u r ’ ) ; End I f ; End ; /
PL/SQL Packages
Packages : Exemples
Cr´
eation le corps du package suivant en mode interactif :
SQL> c r e a t e o r r e p l a c e p a c k a g e body p a c k 1 i s 2 f u n c t i o n d o u b l e x ( x number ) r e t u r n number i s 3 b e g i n 4 r e t u r n ( 2 ∗ x ) ; 5 end ; 6 end ; 7 / A v e r t i s s e m e n t : C o r p s de p a c k a g e c r ´e ´e a v e c e r r e u r s de c o m p i l a t i o n .
PL/SQL Packages
Packages : Exemples
Pour afficher les erreurs on utilise la commande SHOW ERRORS
SQL> show e r r o r s
E r r e u r s p o u r PACKAGE BODY PACK1 : LINE /COL ERROR
−−−−−−−− −−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− 0/0 PL/SQL : C o m p i l a t i o n u n i t a n a l y s i s t e r m i n a t e d 1/14 PLS −00201: l ’ i d e n t i f i c a t e u r ’ PACK1 ’ d o i t ˆe t r e d ´e c l a r ´e 1/14 PLS −00304: i m p o s s i b l e de c o m p i l e r l e c o r p s de ’ PACK1 ’ s a n s s a s p ´e c i f i c a t i o n SQL>
PL/SQL Triggers
Les triggers (D´
eclencheurs)
Un trigger est un programme PL/SQL qui s’ex´
ecute
automatiquement avant ou apr`
es une op´
eration LMD
(Insert, Update, Delete)
Contrairement aux proc´
edures, un trigger est d´
eclench´
e
automatiquement suite `
a un ordre LMD
PL/SQL Triggers
Ev´
enement-Condition-Action
Un trigger est activ´
e par un ´
ev´
enement
Insertion, suppression ou modification sur une table
Si le trigger est activ´
e, une condition est ´
evalu´
ee
Pr´edicat qui doit retourner vrai
Si la condition est vraie, l’action est ex´
ecut´
ee
PL/SQL Triggers
Composants du trigger
`
A quel moment se d´
eclenche le trigger ?
BEFORE : le code dans le corps du triggers s’ex´
ecute avant
les ´
ev`
enements de d´
eclenchement LMD
AFTER : le code dans le corps du triggers s’ex´
ecute avant les
´
PL/SQL Triggers
Composants du trigger
Les ´
ev`
enements du d´
eclenchement :
Quelles sont les op´
erations LMD qui causent l’ex´
ecution du
trigger ?
INSERT UPDATE DELETE
PL/SQL Triggers
Composants du trigger
Le corps du trigger est d´
efini par un bloc PL/SQL anonyme
[DECLARE] BEGIN
[ EXEPTION ] END;
PL/SQL Triggers
Composants du trigger
Syntaxe
Create [ Or R e p l a c e ] T r i g g e r <N o m T r i g g e r >
[ B e f o r e | A f t e r ] <O p ´e r a t i o n DML> On <Nom Table> [ F o r Each Row ] [ When <C o n d i t i o n >]
D e c l a r e Begin E x c e p t i o n End ; /