Vous êtes sur la page 1sur 170

Bases de Donn ees Avanc ees PL/SQL

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

Communication avec un SGBD utilisant SQL

2/170

PL/SQL Introduction

Solution compl` ete Oracle

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)

Langage de D enition de Donn ees (LDD)

Langage de Contr ole de Donn ees (LCD)

Contr ole de transaction

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

Traitements complexes (cas particuliers, erreurs) Traitements des exceptions ...

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

PL/SQL Structure de blocs PL/SQL

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

PL/SQL Structure de blocs PL/SQL

Structure dun bloc PL/SQL


S e c t i o n d eclarative , optionnelle DECLARE Variables , curseurs , exceptions , ...

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

PL/SQL Structure de blocs PL/SQL

Type de blocs

Bloc anonyme Pr ec edure Fonction

14/170

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 linstruction NULL)
[ DECLARE ]

BEGIN Instructions [ EXCEPTION ] END ; /

15/170

PL/SQL Structure de blocs PL/SQL

Type de blocs
Bloc anonyme Exemple 1

DECLARE x INTEGER ; BEGIN x := 1 ; END ;

16/170

PL/SQL Structure de blocs PL/SQL

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

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 IS

BEGIN Instructions [ EXCEPTION ] END ; /

18/170

PL/SQL Structure de blocs PL/SQL

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

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

PL/SQL Structure de blocs PL/SQL

Type de blocs
Fonction

Fonction : proc edure retournant une valeur


FUNCTION nom RETURN BEGIN Instructions RETURN v a l e u r ; [ EXCEPTION ] END ; / type donn ees IS

21/170

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

22/170

PL/SQL Structure de blocs PL/SQL

Type de blocs
Fonction

Remarques : Utilisation de fonction au sein dune requ ete SQL Exemple :


SQL> SELECT solde(1000) FROM dual ; Solde(1000) ----------12024,50

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

PL/SQL Structure de blocs PL/SQL

Types de variables

Variables locales
Constantes Composites R ef erences

Variables de lenvironnement ext erieur ` a PL/SQL


Attach ees (Bind) H otes (Host)

24/170

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

PL/SQL Structure de blocs PL/SQL

Assignation des variables


Syntaxe
Identificateur := expr ;

Exemples
Aecter la date de naissance du ls dun employ es v datenaissance := 23SEP 2004 ;

Fixer le nom dun employ e` a Cl ement v nom := Cl e ment ;

26/170

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

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

PL/SQL Structure de blocs PL/SQL

D eclaration des variables scalaires


Exemples

v v v v v v

job count sal total date tauxtaxe valide

VARCHAR2 ( 9 ) . BINARY INTEGER := 0 ; NUMBER( 9 , 2 ) . DATE := SYSDATE +7; CONSTANT NUMBER( 3 , 2 ) := 8 . 2 5 ; BOOLEAN NOT NULL := TRUE ;

29/170

PL/SQL Structure de blocs PL/SQL

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

PL/SQL Structure de blocs PL/SQL

Types de donn ees composites

Types : Les tables PL/SQL Les records PL/SQL (voir plus loin)

31/170

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 danalyse de la requ ete, donc gain de temps pour Oracle M ecanisme consid er e par certains comme le point cl e de performance dOracle

32/170

PL/SQL Variables attach ees

Variables attach ees/Bind variables


D eclaration

D eclaration, en SQL*Plus, dune 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 ; VARIABLE g s a l m e n s u e l NUMBER( 7 , 2 ) ;

33/170

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 Pr ec eder la r ef erence par un :

34/170

PL/SQL Variables attach ees

Variables attach ees/Bind variables


Exemple dutilisation optimisation

Exemple de requ ete SELECT g en er ees des milliers de fois :


SELECT fname , lname , pcode FROM c u s t WHERE i d = 6 7 4 ; SELECT fname , lname , pcode FROM c u s t WHERE i d = 2 3 4 ; SELECT fname , lname , pcode FROM c u s t WHERE i d = 3 3 2 ; ...

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

PL/SQL Variables attach ees

Variables attach ees/Bind variables


Exemple dutilisation optimisation

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

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 Identicateurs Litt eraux (ou constantes) Commentaires

37/170

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


V s a l a i r e := 1500 + 300 ;

38/170

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 sal 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 e

39/170

PL/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

40/170

PL/SQL Bloc PL/SQL

Exemples de fonctions SQL en PL/SQL


Exemples : Recomposer ladresse dun employ e:
V A drC om pl et e : = V Rue | | CHR( 3 2 ) | | V V i l l e V CodePostal ; | | CHR( 3 2 ) | |

Convertir le nom en majuscule


V Nom := UPPER ( V Nom ) ;

Extraction dune partie de la cha ne


V c h r := Substr ( PL/SQL , 4 , 3 ) ;

Replacement dune cha ne par une autre


V c h r := R e p l a c e ( S e r v 1 / Prod / t b c l i e n t , Prod , V a l i d ) ;

41/170

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

42/170

PL/SQL Op erateurs

Op erateurs dans PL/SQL

Identique ` a SQL
Logique Arithm etique Concat enation Parenth` eses pour contr oler lordre des op erations

Op erateur suppl ementaire : Op erateur dexponentiation **

43/170

PL/SQL Op erateurs

Utilisation des variables li ees

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

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 Eectuer 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)

45/170

PL/SQL Instructions

Instruction SELECT dans PL/SQL

R ecup erer une donn ee de la BD avec SELECT. Syntaxe


SELECT INTO FROM WHERE election liste s { nom var [ , nom var ] . . . | nom record } table condition ;

46/170

PL/SQL Instructions

Instruction SELECT dans PL/SQL


La clause INTO est obligatoire Exemple
DECLARE v deptno v loc BEGIN SELECT INTO FROM WHERE ... END ; deptno , l o c v deptno , v l o c dept nom d = INFORMATIQUE ; NUMBER( 2 ) ; VARCHAR2 ( 1 5 ) ;

47/170

PL/SQL Instructions

Instruction SELECT dans PL/SQL


Retourne la somme des salaires de tous les employ es dun d epartement donn e. Exemple
DECLARE v som sal v deptno BEGIN SELECT INTO FROM WHERE END ; emp . s a l%TYPE ; NUMBER NOT NULL := 1 0 ;

sum ( s a l ) f o n c t i o n d a g r e v som sal emp deptno = v deptno ;

48/170

PL/SQL Manipulation de donn ees

Manipulation de donn ees en PL/SQL

Eectuer des mises ` a jour des tables de la BD utilisant les commandes du LMD :
INSERT UPDATE DELETE

49/170

PL/SQL Manipulation de donn ees

Insertion de donn ees

Ajouter les informations dun 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 ement , D i r e c t e u r , 1 0 ) ; END ;

50/170

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 denseignant. Exemple
DECLARE v augm sal BEGIN UPDATE SET WHERE END ; 1 emp s a l := s a l + v a u g m s a l job = Enseignant ; emp . s a l%TYPE := 2 0 0 0 ;

51/170

PL/SQL Manipulation de donn ees

Suppression de donn ees


Suppression des lignes appartenant au d epartement 10 de la table emp Exemple
DECLARE v BEGIN DELETE WHERE END ; FROM emp deptno = v deptno ; deptno emp . d e p t n o%TYPE := 1 0 ;

52/170

PL/SQL Structure de contr ole

Structure de contr ole dans PL/SQL


IF conditionnel :
IF IF IF THEN THEN THEN END I F ; ELSE ELSIF END I F ; END I F ;

Les boucles :
LOOP FOR WHILE END LOOP ; LOOP LOOP END LOOP ; END LOOP ;

53/170

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 es ; [ ELSIF c o n d i t i o n THEN e n o n c es ; ] [ ELSE e n o n c es ; ] END I F ;

54/170

PL/SQL Structure de contr ole

Instruction IF
Exemple de IF simple

Mettre le ID de lemploy e MARK ` a 101.


I F v nom = MARK THEN v I D := 1 0 1 ; END I F ;

55/170

PL/SQL Structure de contr ole

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

PL/SQL Structure de contr ole

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

PL/SQL Structure de contr ole

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

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 dune condition

59/170

PL/SQL Structure de contr ole

Boucle de base
Syntaxe

LOOP e n o n c e 1; .... EXIT [ WHEN c o n d i t i o n ] ; END LOOP ;

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

PL/SQL Structure de contr ole

Boucle de base
Exemple

Ins erer 10 articles avec la date daujourdhui.


... v Date DATE ; v compteur 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 ; ...

61/170

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 dun nombre dit erations. Ne pas d eclarer lindice, il est d eclar e implicitement.

62/170

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

63/170

PL/SQL Structure de contr ole

Boucle WHILE
Syntaxe

condition e n o n c e 1; e n o n c e 2; ..... END LOOP ;

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

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

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.

66/170

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 deux 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 ; ... END LOOP b o u c e x t ; END ; ...
67/170

PL/SQL Types de donn ees complexes

Types de donn ees complexes

Types :
RECORDS TABLES

Contiennent des composants internes Sont r eutilisables

68/170

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

69/170

PL/SQL Types de donn ees complexes

Cr eation dun record PL/SQL


Syntaxe
TYPE <Nom Enreg> I S RECORD ( Champ1 Type1 . . ChampN TypeN ) ;

Exemple
TYPE TProd ( VRefPro VDesPro VPriUni ); I S RECORD NUMBER( 4 ) , VARCHAR2 ( 3 0 ) , NUMBER( 7 , 2 )

70/170

PL/SQL Types de donn ees complexes

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

PL/SQL Types de donn ees complexes

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

PL/SQL Tables PL/SQL

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

PL/SQL Tables PL/SQL

Cr eation dune table PL/SQL


Syntaxe
TYPE < Nom table > I S TABLE OF < t y p e > INDEX BY BINARY INTEGER ;

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

PL/SQL Tables PL/SQL

Structure dune table PL/SQL


en m emoire

Cl e primaire 1 2 3 ... ... BINARY INTEGER

Colonne Ritchie Marvin Dennis ... ... Scalaire

75/170

PL/SQL Tables PL/SQL

Cr eer une table PL/SQL


SQL> DECLARE 2 TYPE type etud nom I S TABLE OF v a r c h a r 2 ( 1 0 ) INDEX BY BINARY INTEGER ; type etud nom ;

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

PL/SQL Tables PL/SQL

TABLE de RECORDS en PL/SQL

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

PL/SQL Tables PL/SQL

TABLE de RECORDS PL/SQL


Exemple 1

DECLARE TYPE

type etud nom

etud nom BEGIN SELECT nom INTO etud nom ( 1 ) . nom FROM etud ... END ;

I S TABLE OF e t u d%r o w t y p e INDEX BY BINARY INTEGER ; type etud nom ;

78/170

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

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

80/170

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 SQL%FOUND Nombre de lignes aect e par l enonc e SQL le plus r ecent (renvoie un entier). attribut bool een qui prend la valeur TRUE si l enonc e SQL le plus r ecent aecte une ou plusieurs lignes. attribut bool een qui prend la valeur TRUE si l enonc e SQL le plus r ecent naecte aucune ligne. Prend toujours la valeur FALSE parce que PL/SQL ferment les curseurs implicites imm ediatement apr` es leur ex ecution.

SQL%NOTFOUND

SQL%ISOPEN

81/170

PL/SQL Curseurs

Les attributs des curseurs SQL


Supprimer de la table ITEM des lignes ayant un ordre sp eci e. Acher le nombre de lignes supprim ees. Exemple
DECLARE v BEGIN DELETE FROM i t e m WHERE ordid = v ordid ; DBMS OUTPUT . PUT LINE ( SQL% ROWCOUNT | | L i g n e s supprim ees ) ; END ; ordid NUMBER := 6 0 5 ;

Remarque : ne pas oublier Set ServerOutput on (sous SQLPLUS)

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

Contr ole des curseurs explicites

84/170

PL/SQL Curseurs

Contr ole des curseurs explicites

85/170

PL/SQL Curseurs

D eclaration des curseurs


Syntaxe

CURSOR

nom du curseur un e n o n c e SELECT ;

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

D eclaration des curseurs


Exemple

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

Recherche des donn ees dans le curseur


Syntaxe

FETCH nom du curseur INTO [ v a r i a b l e 1 , [ v a r i a b l e 2 , . . . ] | nom de record ] ;

Rechercher les informations de la ligne en cours et les mettre dans des variables.

89/170

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 LOOP

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

Les attributs du curseur explicite


Obtenir les informations d etat du curseur (CUR EXP) Attribut CUR EXP%ISOPEN CUR EXP%NOTFOUND Type BOOLEAN BOOLEAN Description Prend la valeur TRUE si le curseur est ouvert Prend la valeur TRUE si le FETCH le plus r ecent ne retourne aucune ligne Prend la valeur TRUE si le FETCH le plus r ecent retourne une ligne Retourne le nombre de lignes trait ees jusquici

CUR EXP%FOUND

BOOLEAN

CUR EXP%ROWCOUNT

NUMBER

92/170

PL/SQL Curseurs

Contr ole des recherches multiples

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

END I F ; LOOP FETCH C1 . . .

94/170

PL/SQL Curseurs

Attributs %FOUND, %NOTFOUND et %ROWCOUNT

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

Attributs %FOUND, %NOTFOUND et NOTFOUND%ROWCOUNT


Exemple

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

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 | | gagne | | salaire || dollars ); END LOOP ; CLOSE C1 ; END ;

97/170

PL/SQL Curseurs

Les curseurs et les Records


Traitement des lignes de lensemble actif par laectation des valeurs ` a des records PL/SQL. Exemple
... CURSOR Etud Curs IS SELECT etudno , nom , age , a r d FROM etud WHERE age < 2 6 ; Etud Record E t u d C u r s% ROWTYPE; BEGIN OPEN Etud Curs ; ... FETCH E t u d C u r s INTO Etud Record ; ... END ;

98/170

PL/SQL Curseurs

Les boucles FOR des curseurs


Syntaxe

nom record IN nom curseur 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 ; ...

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

Les boucles FOR des curseurs


Exemple

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

Manipulation des exceptions en PL/SQL

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

Types des exceptions

D eclench ees implicitement


Exceptions Oracle pr ed enies Exceptions Oracle Non-pr ed enies

D eclench ees explicitement


Exceptions d enies par lutilisateur

102/170

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

Capture des exceptions pr ed enies

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

Capture des exceptions d enies par lutilisateur

106/170

PL/SQL Exceptions

Capture des exceptions non-pr ed enies


Exemple

Capture de lerreur

2291 (violation de la contrainte int egrit e).

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

Capture des exceptions d enies par lutilisateur

108/170

PL/SQL Exceptions

Exceptions d enies par lutilisateur


Exemple

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

Fonctions pour capturer les 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

Fonctions pour capturer les exceptions


Exemple

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

Les proc edures


Syntaxe

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

Les proc edures


Syntaxe des param` etres

P1,...,Pn suivent la syntaxe :


<Nom Arg> [ IN | OUT | IN OUT] <Type>

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

Les proc edures


Exemple
DECLARE PROCEDURE NouvSal (PNum IN Emp . Emp Id %Type , PAug 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 ; EXCEPTION WHEN NO DATA FOUND THEN e inexistant ); DBMS OUTPUT . PUT LINE ( Employ END ; BEGIN NouvSal ( 7 5 5 0 , 5 0 0 ) ; EXCEPTION WHEN OTHERS THEN DBMS OUTPUT . PUT LINE ( E r r e u r ) ; END ; /

116/170

PL/SQL sous-Programmes

Les proc edures


Exemple

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

Les proc edures


Exemple

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

Le param` etre IN OUT

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

Appel de anom de SQL*Plus


D enition dune variable li ee Initialisation de la variable
SQL> v a r name v a r c h a r 2 ( 1 0 ) ; SQL> begin : name := mark ; end ; / 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

123/170

PL/SQL sous-Programmes

Appel de anom de SQL*Plus

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

Passage de param` etres

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

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

Passage de param` etres


Exemple

SQL> 2 3 4 5 6

begin r e n s e i g n e t u d ( mark , p a r i s ) ; renseign etud ; r e n s e i g n e t u d ( v a d r => l y o n ) ; end ; /

P r o c e d u r e PL/SQL t e r m i n ee avec succ` es . SQL> s e l e c t from e t u d ; ETUDID 6 7 8 SQL>


127/170

NOM mark inconnu inconnu

ADR paris inconnu lyon

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 nimporte bloc PL/SQL Peuvent etre regroup ees dans un package

128/170

PL/SQL sous-Programmes

Les proc edures stock ees


Syntaxe

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

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, PErr OUT Number ) I S BEGIN INSERT INTO COMMIT ; PErr : = 0 ;

Prod VALUES ( P r e f P r o , . . . , P P r i U n i ) ;

EXCEPTION WHEN DUP VAL ON INDEX PErr : = 1 ; END ; /

THEN

130/170

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 :
EXECUTE <Nom Procedure >[<P1 > , . . . , < Pn > ] ;

131/170

PL/SQL sous-Programmes

Appel des proc edures stock ees


Exemple

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

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

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 IS 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 ; Exception When No Data Found Then PErr :=1; Return Null ; END ; /

134/170

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

135/170

PL/SQL sous-Programmes

Appel des fonctions stock ees


Exemple

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

Appel des fonctions stock ees


Exemple

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

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 DROP PROCEDURE FUNCTION nomprocedure ; nomfonction ;

138/170

PL/SQL sous-Programmes

Suppression des proc edures et des fonctions stock ees


Exemple

SQL> DROP PROCEDURE Procedure dropped . SQL> DROP FUNCTION Function dropped .

AjoutProd ;

NbEmp ;

139/170

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 DESC n o m f o n c t i o n

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

D eveloppement des 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

Appels des proc edures / fonctions du package


Syntaxe

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

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

Les triggers (D eclencheurs)

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

Un trigger est activ e par un ev enement


Insertion, suppression ou modication 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, laction est ex ecut ee


Insertion, suppression ou modication de la base de donn ees

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

Le corps du trigger est d eni par un bloc PL/SQL anonyme


[ DECLARE ] BEGIN [ EXEPTION ] END ;

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

Manipulation des triggers

Activer ou d esactiver un Trigger:


A l t e r T r i g g e r < Nom Trigger > [ E n a b l e | D i s a b l e ] ;

Supprimer un Trigger:
Drop T r i g g e r < Nom Trigger > ;

D eterminer les triggers de votreBD:


S e l e c t T r i g g e r N a m e From U s e r T r i g g e r s

159/170

PL/SQL Triggers

Les attributs :Old et :New


Ces deux attributs permettent de g erer lancienne et la nouvelle valeurs manipul ees Insert(...) ... New Delete ... Where(...) ... Old Update ... Set ( ...) ... New Where(...) ... Old

160/170

PL/SQL Triggers

Les attributs :Old et :New


Exemple :
E t u d i a n t ( Matr Etu , Nom , . . . , C o d C l a ) C l a s s e ( Cod Cla , N b r E t u )

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

Les pr edicats inserting, updating et deleting


Inserting:
True: Le trigger est d eclench e suite ` a une insertion False: Sinon

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

Les pr edicats inserting, updating et deleting


Exemple

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

Auto-incr ementation dune colonne ( evite les doublons) D enition :


CREATE SEQUENCE s e q u e n c e n a m e [ INCREMENT BY #] [ START WITH #] [MAXVALUE # | NOMAXVALUE] [ MINVALUE # | NOMINVALUE ] [ CYCLE | NOCYCLE ]

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

PL/SQL SQL dynamique

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

PL/SQL SQL dynamique

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

PL/SQL Contr ole de transactions

Contr ole de transactions


Commandes COMMIT et ROLLBACK

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

PL/SQL Contr ole de transactions

Commande ROLLBACK

169/170

PL/SQL Contr ole de transactions

Contr ole de transactions


D eterminer le traitement des transactions pour le bloc PL/SQL suivant
BEGIN INSERT INTO temp ( num col1 , num col2 , c h a r c o l ) VALUES ( 1 , 1 , ROW 1 ) ; SAVEPOINT a ; INSERT INTO temp ( num col1 , num col2 , c h a r c o l ) VALUES ( 2 , 2 , ROW 2 ) ; SAVEPOINT b ; INSERT INTO temp ( num col1 , num col2 , c h a r c o l ) VALUES ( 3 , 3 , ROW 3 ) ; SAVEPOINT c ; ROLLBACK TO SAVEPOINT b ; COMMIT ; END ;

170/170