Documente Academic
Documente Profesional
Documente Cultură
Thierry Hamon
Bureau H202 - Institut Galil ee T el. : 33 1.48.38.35.53 Bureau 150 LIM&BIO EA 3969 Universit e Paris 13 - UFR L eonard de Vinci 74, rue Marcel Cachin, F-93017 Bobigny cedex T el. : 33 1.48.38.73.07, Fax. : 33 1.48.38.73.55 thierry.hamon@univ-paris13.fr http://www-limbio.smbh.univ-paris13.fr/membres/hamon/BDA-20102011
INFO2 BDA
1/170
PL/SQL Introduction
2/170
PL/SQL Introduction
3/170
PL/SQL Introduction
Clauses SQL
SELECT INSERT UPDATE DELETE CREATE ALTER DROP RENAME TRUNCATE GRANT REVOKE COMMIT ROLLBACK SAVEPOINT Interrogation des donn ees Langage de Manipulation de Donn ees (LMD)
4/170
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 ...
5/170
PL/SQL Introduction
Environnement PL/SQL
6/170
PL/SQL Introduction
Avantages de PL/SQL
PL/SQL compl ement de SQL (qui nest pas proc edural) M ecanismes oerts 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 Aectation de valeurs aux variables Branchements : GOTO, EXIT Exceptions : EXCEPTION
7/170
PL/SQL Introduction
Avantages de PL/SQL
Int egration
Meilleure coh erence du code avec les donn ees Utilisation de librairies standards pr ed enies (biblioth` eques partag ees )
8/170
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)
9/170
PL/SQL Introduction
Avantages de PL/SQL
Ex ecution de programmes modulaires
10/170
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 Cr eation dordre SQL dynamique
11/170
Utilisation de PL/SQL
3 formes : Bloc de code, execut e comme une commande SQL (utilisation dun interpr eteur standard SQL+ ou iSQL*PLus) Fichier de commande PL/SQL Programme stock e : proc edure, fonction, package ou trigger
12/170
S e c t i o n e x ecutable , 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 Possibilit 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 Traitement des e x c e p t i o n s ( g e s t i o n des 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 ; /
13/170
Type de blocs
14/170
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 linstruction NULL)
[ DECLARE ]
15/170
Type de blocs
Bloc anonyme Exemple 1
16/170
Type de blocs
Bloc anonyme Exemple 2
DECLARE var x VARCHAR2 ( 5 ) . BEGIN SELECT n o m c o l o n n e INTO var x FROM nom table EXCEPTION WHEN n o m e x c e p t i o n THEN ... END ; /
17/170
Type de blocs
Proc edure
18/170
Type de blocs
Proc edure Exemple PROCEDURE proc exemple IS
var x VARCHAR2 ( 5 ) . BEGIN SELECT n o m c o l o n n e INTO var x FROM nom table 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 compile et stocke dans la base le bloc PL/SQL compris entre le BEGIN et le END, r ef erenc e par proc exemple
19/170
Type de blocs
Proc edure
Remarques : Ex ecution (auto) de la proc edure : SQL> EXECUTE proc_exemple Pas dex ecution de proc edure (ou dinstructions) en n de transaction (COMMIT, ROLLBACK, Ordre DDL) D ecision denregistrement ou dannulation de la transaction en cours : ` a r ealiser par le programme appelant la proc edure
20/170
Type de blocs
Fonction
21/170
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 ; /
22/170
Type de blocs
Fonction
Appel dune fonction comme une proc edure provoque une erreur Exemple : fonction mdp(INTEGER)
SQL> execute mdp(2); BEGIN mdp(2); END; * ERREUR a la ligne 1 : ORA-06550: line 1, column 7: PLS-00221: MDP is not a procedure or is undefined ORA-06550: line 1, column 7:
23/170
Types de variables
Variables locales
Constantes Composites R ef erences
24/170
Exemple
DECLARE v datenaissance v departement v ville c cumul DATE ; NUMBER( 2 ) NOT NULL := 1 0 ; VARCHAR2( 1 3 ) := P a r i s ; CONSTANT NUMBER := 1 0 0 0 ;
25/170
Exemples
Aecter la date de naissance du ls dun employ es v datenaissance := 23SEP 2004 ;
26/170
VARCHAR2(n)/NVARCHAR2(n) : Cha ne de n caract` eres (n < 4000octets ) longueur variable (pr exe N : prise en compte de la localisation NLS /National Language Support ) CHAR(n)/NCHAR(n) : Cha ne de n caract` eres (n < 2000octets ) longueur xe, rempli par des espaces LONG/RAW/LONG RAW : Cha ne de caract` ere ou de donn ees binaires (raw ) de longueur variable ( < 2000octets )
27/170
NUMBER (n , m) : R eel avec n chires signicatifs 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 nest donc pas possible
de stocker un bool een dans une table de s electionner un el ement de table dans un variable bool eenne dutiliser un bool een dans une requ ete SQL ou une fonction PL/SQL appel ee dans une requ ete SQL (param` etre en entr ee ou valeur de retour)
28/170
v v v v v v
VARCHAR2 ( 9 ) . BINARY INTEGER := 0 ; NUMBER( 9 , 2 ) . DATE := SYSDATE +7; CONSTANT NUMBER( 3 , 2 ) := 8 . 2 5 ; BOOLEAN NOT NULL := TRUE ;
29/170
Attribut %TYPE
D enition : d eclaration dune variable associ ee ` a Une colonne dune table dans la BD Une variable pr ec edemment d enie Exemples :
v nom v sal annuel v sal mensuel emp . nom%TYPE ; NUMBER( 7 , 2 ) ; v s a l a n n u e l %TYPE := 2 0 0 0 ;
30/170
Types : Les tables PL/SQL Les records PL/SQL (voir plus loin)
31/170
32/170
33/170
34/170
A chaque soumission dun requ ete, V erication si la requ ete a d ej` a et e et e soumise Si oui, r ecup eration du plan dex ecution de la requ ete, et ex ecution de la requ ete
35/170
Si non,
analyse syntaxique de la requ ete d enition des di erentes possibilit es dex ecution d enition du plan dex ecution optimal
Processus co uteux en temps CPU, alors que seule la valeur de id change ! Solution : r eutiliser le plan dex ecution existant N ecessite dutiliser 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 :
SELECT fname , lname , p c o d e FROM c u s t WHERE i d = : c u s t n o ;
36/170
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 Identicateurs Litt eraux (ou constantes) Commentaires
37/170
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 ) ) ;
38/170
39/170
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
40/170
41/170
42/170
PL/SQL Op erateurs
Identique ` a SQL
Logique Arithm etique Concat enation Parenth` eses pour contr oler lordre des op erations
43/170
PL/SQL Op erateurs
Pour r ef erencer une variable en PL/SQL, on doit pr exer son nom par un : Exemple :
: c o d e r e t o u r := 0 ; IF v erifier cr e d i t o k ( compt no ) THEN : c o d e r e t o u r := 1 ; END I F ;
44/170
PL/SQL Instructions
45/170
PL/SQL Instructions
46/170
PL/SQL Instructions
47/170
PL/SQL Instructions
48/170
Eectuer des mises ` a jour des tables de la BD utilisant les commandes du LMD :
INSERT UPDATE DELETE
49/170
50/170
51/170
52/170
Les boucles :
LOOP FOR WHILE END LOOP ; LOOP LOOP END LOOP ; END LOOP ;
53/170
Instruction IF
Syntaxe
54/170
Instruction IF
Exemple de IF simple
55/170
IF simple
Si le nom de lemploy e est CLEMENT, lui attribuer le poste Enseignant, le d epartement n 102 et une commission de 25 Exemple
... e ment THEN I F v nom = Cl 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 ; ...
56/170
IF-THEN-ELSE
Si le nom de lemploy e est CLEMENT, lui attribuer le poste Enseignant, le d epartement n 102 et une commission de 25 Exemple
... I F v nom = Cl e ment 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 ; ELSE DBMS OUTPUT . PUT LINE ( Employ e inexistant ); END I F ; ...
57/170
IF-THEN-ELSIF
Pour une valeur donn ee en entr ee, retourner une valeur calcul ee. Exemple
... THEN RETURN ( 2 v d e b u t ) ; IF v d e b u t > 100 THEN RETURN ( 5 v d e b u t ) ; ELSIF v d e b u t >= 50 ELSE RETURN ( 1 v d e b u t ) ; END I F ; ...
58/170
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 dune condition
59/170
Boucle de base
Syntaxe
d elimiteur e n o n c e e n o n c e EXIT
When : condition est une variable bool eenne ou expression (TRUE, FALSE, ou NULL);
60/170
Boucle de base
Exemple
61/170
Boucle FOR
Syntaxe
Utiliser la boucle FOR pour raccourcir le test dun nombre dit erations. Ne pas d eclarer lindice, il est d eclar e implicitement.
62/170
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 ; ...
63/170
Boucle WHILE
Syntaxe
WHILE
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
64/170
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 Date DATE ; v compteur 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 ( 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 ; END LOOP ;
65/170
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.
66/170
Types :
RECORDS TABLES
68/170
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
69/170
Exemple
TYPE TProd ( VRefPro VDesPro VPriUni ); I S RECORD NUMBER( 4 ) , VARCHAR2 ( 3 0 ) , NUMBER( 7 , 2 )
70/170
Attribut %ROWTYPE
D eclaration dune 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
71/170
Attribut %ROWTYPE
Exemples
D eclarer une variable pour stocker les m emes informations concernant une personne telles quelles sont stock ees dans la table PERS
personne P e r s% ROWTYPE;
D eclarer une variable pour stocker les m emes informations concernant un article telles quelles sont stock ees dans la table ART
article A r t% ROWTYPE;
72/170
Tables PL/SQL
Le type de donn ees complexe TABLE ore 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
73/170
Exemple
TYPE type etud nom I S TABLE OF e t u d . nom%TYPE INDEX BY BINARY INTEGER ; type etud nom ;
etud nom
74/170
75/170
3 etud nom 4 BEGIN 5 s e l e c t nom 6 i n t o etud nom ( 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 ( etud nom ( 1 ) ) ; 10 d b m s o u t p u t . p u t l i n e ( etud nom ( 2 ) ) ; 11 end ; 12 / mark DECLARE ERREUR ` a la ligne 1 : ORA 01403: Aucune d o n n ee t r o u v ee ORA 06512: ` a l i g n e 10
76/170
D enit une table dont la deuxi` eme colonne est un enregistrement au lieu dun scalaire Pour d enir la deuxi` eme colonne :
Soit en utilisant lattribut %ROWTYPE Soit en utilisant un record d ej` a d eni
77/170
DECLARE TYPE
etud nom BEGIN SELECT nom INTO etud nom ( 1 ) . nom FROM etud ... END ;
78/170
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 type etud nom I S TABLE OF r e c e t u d% ROWTYPE INDEX BY BINARY INTEGER ; etud nom type etud nom ; BEGIN SELECT nom INTO etud nom ( 1 ) . nom FROM etud ... END ;
79/170
PL/SQL Curseurs
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
80/170
PL/SQL Curseurs
SQL%NOTFOUND
SQL%ISOPEN
81/170
PL/SQL Curseurs
82/170
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 Curseurs explicites : d eclar es et nomm es par le programmeur
83/170
PL/SQL Curseurs
84/170
PL/SQL Curseurs
85/170
PL/SQL Curseurs
CURSOR
IS
Ne pas inclure la clause INTO dans la d eclaration du curseur Si le traitement des lignes doit etre fait dans un ordre sp ecique, on utilise la clause ORDER BY dans la requ ete
86/170
PL/SQL Curseurs
DECLARE CURSOR C1 I S SELECT RefArt , NomArt , QteArt FROM Article WHERE QteArt < 5 0 0 ;
87/170
PL/SQL Curseurs
Ouverture du curseur
Syntaxe
OPEN
nom du curseur ;
Ouvrir le curseur pour ex ecuter la requ ete et identier lensemble actif Si la requ ete ne renvoie aucune ligne, aucune exception naura lieu Utiliser les attributs des curseurs pour tester le r esultat du FETCH
88/170
PL/SQL Curseurs
Rechercher les informations de la ligne en cours et les mettre dans des variables.
89/170
PL/SQL Curseurs
FETCH
c1
INTO
v R e f A r t , v NomArt , v Q t e A r t ;
Cur Etud ;
FETCH C u r E t u d INTO Rec Etud ; { t r a i t e m e n t s d e s d o n n ees r e c h e r c h ees } ... END LOOP ; ...
90/170
PL/SQL Curseurs
Fermeture du curseur
Syntaxe
CLOSE
nom du curseur ;
Fermer le curseur apr` es la n 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
91/170
PL/SQL Curseurs
CUR EXP%FOUND
BOOLEAN
CUR EXP%ROWCOUNT
NUMBER
92/170
PL/SQL Curseurs
Traitement de plusieurs lignes dun 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
93/170
PL/SQL Curseurs
Attribut %ISOPEN
La recherche des lignes nest possible que si le curseur est ouvert Utiliser lattribut %ISOPEN avant un FETCH pour tester si le curseur est ouvert ou non Exemple :
I F NOT C1%ISOPEN OPEN C1 THEN
94/170
PL/SQL Curseurs
Utiliser lattribut %ROWCOUNT pour fournir le nombre exact des lignes trait ees Utiliser les attributs %FOUND et %NOT FOUND pour formuler le test darr et de la boucle
95/170
PL/SQL Curseurs
LOOP FETCH c u r s 1 INTO v e t u d i d , v nom ; IF c u r s 1% ROWCOUNT > 20 THEN ... EXIT WHEN c u r s 1% NOTFOUND; ... END LOOP ;
96/170
PL/SQL Curseurs
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 | | gagne | | salaire || dollars ); END LOOP ; CLOSE C1 ; END ;
97/170
PL/SQL Curseurs
98/170
PL/SQL Curseurs
FOR
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
99/170
PL/SQL Curseurs
DECLARE CURSOR C u r E t u d I S SELECT FROM Etud ; BEGIN IN Cur Etud LOOP FOR R e c E t u d 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 ; /
100/170
PL/SQL Exceptions
Le traitement des exceptions PL/SQL : m ecanisme pour manipuler les erreurs rencontr ees lors de lex ecution Possibilit e de continuer lex ecution si lerreur nest pas susamment 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
101/170
PL/SQL Exceptions
102/170
PL/SQL Exceptions
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 e1 ; e n o n c e2 ; ... [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 e3 ; e n o n c e4 ; ...] [WHEN OTHERS e n o n c e5 ; e n o n c e6 ; ...] THEN
103/170
PL/SQL Exceptions
Faire r ef erence au nom dans la partie traitement des exceptions Quelques exceptions pr ed enies :
NO DATA FOUND TOO MANY ROWS INVALID CURSOR ZERO DIVIDE DUP VAL ON INDEX
104/170
PL/SQL Exceptions
Exceptions pr ed enies
Exemple
BEGIN ... EXCEPTION WHEN NO DATA FOUND THEN e n o n c e1 ; e n o n c e2 ; 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 e3 ; e n o n c e4 ; DBMS OUTPUT . PUT LINE ( Donn e es i n v a l i d e s ) ; WHEN OTHERS THEN e n o n c e5 ; e n o n c e6 ; DBMS OUTPUT . PUT LINE ( A u t r e s e r r e u r s ) ;
105/170
PL/SQL Exceptions
106/170
PL/SQL Exceptions
Capture de lerreur
DECLARE cont integrit viol EXCEPTION ; PRAGMA EXCEPTION INIT ( c o n t i n t e g r i t v i o l , 2291); ... BEGIN ... EXCEPTION THEN WHEN c o n t i n t e g r i t v i o l 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 int egrit e ); ... END ;
107/170
PL/SQL Exceptions
108/170
PL/SQL Exceptions
DECLARE x number : = . . . ; x trop petit EXCEPTION ; ... BEGIN ... IF 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 est trop pe tite ! ! ) ; ... END ;
109/170
PL/SQL Exceptions
SQLCODE : Retourne la valeur num erique du code de lerreur SQLERRM : Retourne le message associ e au num ero de lerreur
110/170
PL/SQL Exceptions
... v code erreur NUMBER; VARCHAR2 ( 2 5 5 ) ; v message erreur 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 message erreur ); END ;
111/170
PL/SQL sous-Programmes
Les sous-programmes
Un sous programme est une s equence dinstruction PL/SQL qui poss` ede un nom On distingue deux types de sous programmes :
Les proc edures Les fonctions
112/170
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
113/170
PL/SQL sous-Programmes
DECLARE ... PROCEDURE <Nom Proc > [( P1 , . . . , Pn ) ] I S [ D eclarations locales ] BEGIN ... EXCEPTION ... END ; BEGIN / A p p e l de l a p r o c e d u r e / ... EXCEPTION ... END ; /
114/170
PL/SQL sous-Programmes
O` u: IN : Param` etre dentr ee OUT : Param` etre de sortie IN OUT : Param` etre dentr ee/Sortie Par d efaut le param` etre est IN
115/170
PL/SQL sous-Programmes
116/170
PL/SQL sous-Programmes
DECLARE VErr NUMBER ; PROCEDURE NouvSal (PNum Emp . Emp Id %TYPE , PAug NUMBER, P E r r OUT NUMBER ) I S VSal NUMBER ( 7 , 2 ) ; BEGIN SELECT S a l INTO VSal FROM Emp WHERE e m p I d=PNum ; UPDATE Emp SET S a l = VSal+PAug WHERE Emp Id=PNum ; COMMIT ; P E r r :=0 EXCEPTION WHEN NO DATA FOUND THEN P E r r :=1 ; END ;
117/170
PL/SQL sous-Programmes
BEGIN NouvSal ( 7 5 5 0 , 5 0 0 , VErr ) ; I F VErr = 0 THEN DBMS OUTPUT . PUT LINE ( O p eration Effectu ee ); ELSE DBMS OUTPUT . PUT LINE ( Employ e inexistant ); END I F ; EXCEPTION WHEN OTHERS THEN DBMS OUTPUT . PUT LINE ( E r r e u r ) ; END ; /
118/170
PL/SQL sous-Programmes
Les fonctions
Syntaxe
DECLARE [ D eclarations globales ] FUNCTION <Nom fonc > [( P1 , . . . , Pn ) ] RETURN Type I S [ D eclarations locales ] 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 ; /
119/170
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 . Last Name %Type ; VFirstName 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 , VFirstName WHERE Emp Id=PNum ; P E r r : = 0 ; RETURN VLastName | | | | VFirstName ; EXCEPTION WHEN NO DATA FOUND THEN P E r r : = 1 ; RETURN N u l l ; END ;
120/170
PL/SQL sous-Programmes
Les fonctions
Exemple
BEGIN VNomComplet:= NomComplet(&Num, VErr ) ; I F VErr = 0 THEN DBMS OUTPUT . PUT LINE ( Nom Complet e s t : | | VNomComplet ) ; ELSE DBMS OUTPUT . PUT LINE ( Employ e inexistant ); END I F ; EXCEPTION WHEN OTHERS THEN DBMS OUTPUT . PUT LINE ( E r r e u r ) ; END ;
121/170
PL/SQL sous-Programmes
Param` etre jouant le r ole des deux param` etre IN et OUT Obligatoire de le sp ecier 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 / Proc edure cr e ee .
122/170
PL/SQL sous-Programmes
123/170
PL/SQL sous-Programmes
Ex ecution de la proc edure avec un param` etre IN OUT Achage la nouvelle valeur de la variable
SQL> execute a ff no m ( : name ) ; P r o c e d u r e PL/SQL t e r m i n ee avec succ` es . SQL> p r i n t name NAME MARK
124/170
PL/SQL sous-Programmes
Il y a plusieurs fa cons de passage de param` etres : Appel de la proc edure en sp eciant les param` etres Appel de la proc edure sans param` etre si ce dernier est un param` etre dentr ee initialis e Appel de la proc edure en changeant la position des param` etres (il faut sp ecier le nom du param` etre)
125/170
PL/SQL sous-Programmes
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 adr IN e t u d . a d r%t y p e d e f a u l t inconnu ) IS 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 ;
126/170
PL/SQL sous-Programmes
SQL> 2 3 4 5 6
PL/SQL sous-Programmes
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 nimporte bloc PL/SQL Peuvent etre regroup ees dans un package
128/170
PL/SQL sous-Programmes
CREATE [ OR REPLACE ] PROCEDURE <Nom Proc > [( P1 , . . . , Pn ) ] [ D e c l a r a t i o n s des 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;
129/170
PL/SQL sous-Programmes
Prod VALUES ( P r e f P r o , . . . , P P r i U n i ) ;
THEN
130/170
PL/SQL sous-Programmes
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 :
EXECUTE <Nom Procedure >[<P1 > , . . . , < Pn > ] ;
131/170
PL/SQL sous-Programmes
ACCEPT VRefPro . . . ACCEPT V P r i U n i . . . DECLARE VErr NUMBER; BEGIN A j o u t P r o d (&VRefPro , . . . , & VPriUni , VErr ) ; I F VErr=0 THEN DBMS OUTPUT . PUT LINE ( O p eration E f f e c tu e r ) ; ELSE DBMS OUTPUT . PUT LINE ( E r r e u r ) ; END I F ; END ; /
132/170
PL/SQL sous-Programmes
CREATE [ OR REPLACE ] FUNCTION <Nom Fonc > [( P1 , . . . , Pn ) ] RETURN Type I S [ D e c l a r a t i o n s des 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 Traitement des e x c e p t i o n s END ; /
function Created : La fonction est correcte Ou function Created with compilation errors : Corriger les erreurs SHOW ERRORS;
133/170
PL/SQL sous-Programmes
134/170
PL/SQL sous-Programmes
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 > ]
135/170
PL/SQL sous-Programmes
A c c e p t VDep . . . Declare VErr Number ; VNb Number ( 4 ) ; Begin VNb :=NbEmp(&VDep , VErr ) ; I f VErr=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 ) ; Else DBMS Output . P u t L i n e ( E r r e u r ) ; End I f ; End ; /
136/170
PL/SQL sous-Programmes
SQL> VARIABLE VNb SQL> EXECUTE : VNb:=NbEmp(&VDep , VErr ) ; P r o c e d u r e PL/SQL t e r m i n ee avec succ` es . SQL> PRINT VNb VNB 300
137/170
PL/SQL sous-Programmes
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 DROP PROCEDURE FUNCTION nomprocedure ; nomfonction ;
138/170
PL/SQL sous-Programmes
SQL> DROP PROCEDURE Procedure dropped . SQL> DROP FUNCTION Function dropped .
AjoutProd ;
NbEmp ;
139/170
PL/SQL sous-Programmes
140/170
PL/SQL Packages
Les packages
Un objet PL/SQL qui stocke dautres types dobjet : proc edures, fonctions, curseurs, variables, ... Consiste en deux parties :
Sp ecication (d eclaration) Corps (impl ementation)
Ne peut pas etre appel e, ni param etr e ni imbriqu e Permet ` a Oracle de lire plusieurs objets ` a la fois en m emoire
141/170
PL/SQL Packages
Sauvegarder l enonc e de CREATE PACKAGE dans deux chiers di erents (ancienne/derni` ere version) pour faciliter de eventuelles modications Le corps du package ne peut pas etre compil e sil nest pas d eclar e (sp eci 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
142/170
PL/SQL Packages
La sp ecication du package
Syntaxe
Contient la d eclaration des curseurs, variables, types, proc edures, fonctions et exceptions
CREATE [ OR REPLACE ] PACKAGE <Nom Package> IS [ 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 des c u r s e u r s ] [ D e c l a r a t i o n des proc edures et fonctions ] [ D e c l a r a t i o n des e x c e p t i o n s ] END[ < Nom Package > ] ; /
143/170
PL/SQL Packages
La sp ecication du package
Exemple
Create Or R e p l a c e Package PackProd I s C u r s o r CProd I s S e l e c t RefPro , 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 , . . . , PErr Out Number ) ; P r o c e d u r e ModifProd ( P r e f P r o Prod . R e f P r o%Type , . . . , PErr 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 , . . . , PErr Out Number ) ; Procedure AffProd ; EndPackProd ; /
144/170
PL/SQL Packages
Le corps du package
Syntaxe
On impl emente les proc edures et fonctions d eclar ees dans la sp ecication
Create [ Or R e p l a c e ] Package Body <Nom Package> [ Impl ementation proc edures | fonctions ] End [ < Nom Package > ] ; / Is
145/170
PL/SQL Packages
Le corps du package
Syntaxe
Create Or R e p l a c e Package Body PackProd Is 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 , . . . , PErr Out Number ) Is 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 ; PErr : = 0 ; Exception When D u p V a l O n I n d e x Then PErr : = 1 ; When O t h e r s Then PErr := 1 ; End ;
146/170
PL/SQL Packages
Le corps du package
Syntaxe
P r o c e d u r e ModifProd ( P r e f P r o Prod . R e f P r o%Type , . . . , PErr Out Number ) I s B Boolean ; Begin ... EndPackProd ; /
147/170
PL/SQL Packages
Les proc edures et les fonctions d enies dans un package sont appel ees de la fa con suivante :
<NomPackage >.< NomProcedure > [( P a r a m` etres ) ] ; Var := <NomPackage >.< NomFonction > [( P a r a m` etres ) ] ;
148/170
PL/SQL Packages
A c c e p t VRef Prompt . . . . . . ; A c c e p t V P r i Prompt . . . . . . ; Declare VErr Number ; Begin PackProd . ModifProd (&VRef , . . . , &VPri , VErr ) ; I f VErr= 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 ); Else DBMS Output . P u t L i n e ( E r r e u r ) ; End I f ; End ; /
149/170
PL/SQL Packages
Packages : Exemples
Cr eation le corps du package suivant en mode interactif :
SQL> c r e a t e or r e p l a c e p a c k a g e body pack1 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 begin 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 avec e r r e u r s de c o m p i l a t i o n .
150/170
PL/SQL Packages
Packages : Exemples
Pour acher 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 0/0 1/14 1/14
ERROR 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 PLS 00201: l i d e n t i f i c a t e u r PACK1 d o i t etre d eclar e 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 sp ecification
SQL>
151/170
PL/SQL Triggers
Un trigger est un programme PL/SQL qui sex 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
152/170
PL/SQL Triggers
Ev enement-Condition-Action
153/170
PL/SQL Triggers
Composants du trigger
` quel moment se d A eclenche le trigger ? BEFORE : le code dans le corps du triggers sex ecute avant les ev` enements de d eclenchement LMD AFTER : le code dans le corps du triggers sex ecute avant les ev` enements de d eclenchement LMD
154/170
PL/SQL Triggers
Composants du trigger
Les ev` enements du d eclenchement : Quelles sont les op erations LMD qui causent lex ecution du trigger ?
INSERT UPDATE DELETE La combinaison des ces op erations
155/170
PL/SQL Triggers
Composants du trigger
156/170
PL/SQL Triggers
Composants du trigger
Syntaxe
Create [ Or R e p l a c e ] T r i g g e r < Nom Trigger > [ B e f o r e | A f t e r ] < O p e r a t i o n DML > On <Nom Table > [ For Each Row ] [ When < C o n d i t i o n > ] Declare Begin Exception End ; /
157/170
PL/SQL Triggers
Composants du trigger
Exemple
Cr eation dun trigger qui remplit la table statistique (Nom Table Nb Insert) lors dune insertion dans la table facture
Create Or R e p l a c e T r i g g e r S t a r t F a c t u r e A f t e r I n s e r t On F a c t u r e For Each Row Declare V N b I n s e r t Number ; Begin Select N b I n s e r t Into VNbInsert From S t a t i s t i q u e Where Nom Table= F a c t u r e ; Update S t a t i s t i q u e Set N b I n s e r t = V N b I n s e r t+1 Where Nom Table= F a c t u r e ; Exception When No Data Found Then I n s e r t I n t o S t a t i s t i q u e Values ( 1 , F a c t u r e ) ;
158/170
PL/SQL Triggers
Supprimer un Trigger:
Drop T r i g g e r < Nom Trigger > ;
159/170
PL/SQL Triggers
160/170
PL/SQL Triggers
Trigger mettant ` a jour la table classe suite ` a une insertion dun nouvel etudiant
Create or R e p l a c e T r i g g e r MajNbEtud A f t e r I n s e r t On E t u d i a n t For Each Row Begin Update C l a s s e Set Nbr Etud = Nbr Etud+1 Where C o d C l a =:New . C o d C l a ; End ; /
161/170
PL/SQL Triggers
Updating:
True: le trigger est d eclench e suite ` a une mise ` a jour False: sinon
Deleting:
True: le trigger est d eclench e suite ` a une suppression False: sinon
162/170
PL/SQL Triggers
Create Or R e p l a c e T r i g g e r MajNbEtud A f t e r I n s e r t Or Delete On E t u d i a n t For Each Row Begin I f I n s e r t i n g Then Update C l a s s e Set Nbr Etud = Nbr Etud+1 Where C o d C l a =:New . C o d C l a ; End I f ; I f D e l e t i n g Then Update C l a s s e Set Nbr Etud = Nbr Etud 1 Where C o d C l a =: Old . C o d C l a ; End I f ; End ; /
163/170
PL/SQL S equences
S equences
Syntaxe
Suppression
DROP SEQUENCE s e q u e n c e n a m e
Pseudo-colonne CURRVAL : Valeur courante de la s equence Pseudo-colonne NEXTVAL : Incr ementation de la s equence et retourne la nouvelle valeur
164/170
PL/SQL S equences
S equences
Exemple
drop s e q u e n c e SEQ ANNOTATION ; c r e a t e s e q u e n c e SEQ ANNOTATION s t a r t with 1 i n c r e m e n t by 1 nocycle m a x v a l u e 30000 INSERT INTO p r o f ( prof num , prof nom , p r o f p r e n o m ) VALUES (SEQ ANNOTATION . NEXTVAL, Dupond M i c h e l ) SELECT s e q a n n o t a t i o n . CURRVAL from d u a l ;
165/170
SQL dynamique
Construction dans un programme une requ ete SQL avant de lex ecuter Possibilit e de cr eation dun code g en erique et r eutilisable (sinon simple param` etrage de valeur de remplacement de la clause where) Execute immediate chaine_de_caract` eres ; chaine_de_caract` eres est une commande sql donn ee entre ...
166/170
SQL dynamique
Exemple 1 :
Begin E x e c u t e immediate c r e a t e t a b l e t e s t ( c o l 1 : number ) ; ; End ;
Exemple 2 :
Declare W req v a r c h a r 2 ( 4 0 0 0 ) ; Begin w r e q := c r e a t e t a b l e t e s t ( c o l 1 : number ) ; ; Execute i m m e d a i t e w r e q ; End ;
167/170
Lancer une transaction avec la premi` ere commande du LMD ` a la suite dun COMMIT ou un ROLLBACK Utiliser le COMMIT ou le ROLLBACK de SQL pour terminer une transaction
168/170
Commande ROLLBACK
169/170
170/170