• Aucun résultat trouvé

[PDF] Support de cours général du langage PL SQL | Formation informatique

N/A
N/A
Protected

Academic year: 2021

Partager "[PDF] Support de cours général du langage PL SQL | Formation informatique"

Copied!
170
0
0

Texte intégral

(1)

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/

(2)

PL/SQL Introduction

(3)

PL/SQL Introduction

(4)

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

(5)

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

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

(6)

PL/SQL Introduction

(7)

PL/SQL Introduction

Avantages de PL/SQL

PL/SQL compl´

ement de SQL (qui n’est pas proc´

edural)

ecanismes offerts par PL/SQL :

Structures it´

eratives : WHILE *** LOOP, FOR *** LOOP,

LOOP ***

Structures conditionnelles :

IF *** THEN *** ELSE | ELSEIF *** ENDIF, CASE ***

eclaration des curseurs et des tableaux

eclaration de variables

Affectation de valeurs aux variables

Branchements : GOTO, EXIT

Exceptions : EXCEPTION

(8)

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)

(9)

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)

(10)

PL/SQL Introduction

Avantages de PL/SQL

Ex´ecution de programmes modulaires

Traitements complexes (cas particuliers, erreurs)

Traitements des exceptions

(11)

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

(12)

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

(13)

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 ;

(14)

PL/SQL Structure de blocs PL/SQL

Type de blocs

Bloc anonyme

Proc´

edure

Fonction

(15)

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

(16)

PL/SQL Structure de blocs PL/SQL

Type de blocs

Bloc anonyme – Exemple 1

DECLARE x INTEGER ; BEGIN

x := 1 ; END;

(17)

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

(18)

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

(19)

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

(20)

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)

ecision d’enregistrement ou d’annulation de la transaction en

cours : `

a r´

ealiser par le programme appelant la proc´

edure

(21)

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

(22)

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;

(23)

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

(24)

PL/SQL Structure de blocs PL/SQL

Types de variables

Variables locales

Constantes Composites R´ef´erences

Variables de l’environnement ext´

erieur `

a PL/SQL

Attach´ees (Bind) Hˆotes (Host)

(25)

PL/SQL Structure de blocs PL/SQL

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

(26)

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’

(27)

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)

(28)

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

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

(29)

PL/SQL Structure de blocs PL/SQL

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 ;

(30)

PL/SQL Structure de blocs PL/SQL

Attribut %TYPE

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

(31)

PL/SQL Structure de blocs PL/SQL

Types de donn´

ees composites

Types :

Les tables PL/SQL

Les records PL/SQL

(voir plus loin)

(32)

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

(33)

PL/SQL Variables attach´ees

Variables attach´

ees/Bind variables

D´eclaration

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 ;

(34)

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

(35)

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,

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

(36)

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 :

(37)

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

(38)

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

(39)

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 e

(40)

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

(41)

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

(42)

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

(43)

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

(44)

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 ;

(45)

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

eterminer les r´

esultats du LMD avec des curseurs implicites

(voir plus loin)

(46)

PL/SQL Instructions

Instruction SELECT dans PL/SQL

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

(47)

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 t

WHERE nom d = ’INFORMATIQUE ’ ;

. . . END;

(48)

PL/SQL Instructions

Instruction SELECT dans PL/SQL

Retourne la somme des salaires de tous les employ´

es d’un

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;

(49)

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

(50)

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 ;

(51)

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

(52)

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

(53)

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 ;

(54)

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 ;

(55)

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 ;

(56)

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

(57)

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

DBMS OUTPUT . PUT LINE ( ’ Employ´e i n e x i s t a n t ’ ) ; END I F ;

(58)

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

(59)

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

(60)

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

(61)

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 ;

(62)

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

(63)

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

(64)

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

(65)

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 ;

(66)

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

(67)

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

(68)

PL/SQL Types de donn´ees complexes

Types de donn´

ees complexes

Types :

RECORDS TABLES

Contiennent des composants internes

Sont r´

eutilisables

(69)

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

(70)

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 )

(71)

PL/SQL Types de donn´ees complexes

Attribut %ROWTYPE

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

(72)

PL/SQL Types de donn´ees complexes

Attribut %ROWTYPE

Exemples

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;

eclarer une variable pour stocker les mˆ

emes informations

concernant un article telles qu’elles sont stock´

ees dans la table

ART

(73)

PL/SQL Tables PL/SQL

Tables PL/SQL

Le type de donn´

ees complexe TABLE offre au d´

eveloppeur un

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

(74)

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 ;

(75)

PL/SQL Tables PL/SQL

Structure d’une table PL/SQL

en m´emoire

Cl´

e primaire

Colonne

1

Ritchie

2

Marvin

3

Dennis

. . .

. . .

. . .

. . .

(76)

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 :

(77)

PL/SQL Tables PL/SQL

TABLE de RECORDS en PL/SQL

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

(78)

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 ;

(79)

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 ;

(80)

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

(81)

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

(82)

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)

(83)

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

(84)

PL/SQL Curseurs

(85)

PL/SQL Curseurs

(86)

PL/SQL Curseurs

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

(87)

PL/SQL Curseurs

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 ;

(88)

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

(89)

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.

(90)

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

(91)

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

(92)

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

(93)

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

(94)

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

(95)

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

(96)

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 ;

(97)

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 ;

(98)

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 ;

(99)

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

(100)

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

(101)

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

ecision de continuer une proc´

edure apr`

es erreur : d´

ecision

que le d´

eveloppeur doit faire en fonction des erreurs possibles

(102)

PL/SQL Exceptions

Types des exceptions

eclench´

ees implicitement

Exceptions Oracle pr´ed´efinies Exceptions Oracle Non-pr´ed´efinies

eclench´

ees explicitement

(103)

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 ;

(104)

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

(105)

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

(106)

PL/SQL Exceptions

(107)

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 ;

(108)

PL/SQL Exceptions

(109)

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 ! ! ’ ) ; . . .

(110)

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

(111)

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

(112)

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

(113)

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

(114)

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

(115)

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

(116)

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

(117)

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 ;

(118)

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 ;

(119)

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

(120)

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 ;

(121)

PL/SQL Sous-programmes

Les fonctions

Exemple BEGIN VNomComplet := NomComplet(&Num, V E r r ) ; I F V E r r = 0 THEN

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

(122)

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 /

(123)

PL/SQL Sous-programmes

Appel de affnom de SQL*Plus

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

(124)

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

(125)

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)

(126)

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;

(127)

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

(128)

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

(129)

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;

(130)

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 ;

(131)

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 :

(132)

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 ;

(133)

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

(134)

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 ;

(135)

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

(136)

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 ;

(137)

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

(138)

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 ;

(139)

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 ;

(140)

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

(141)

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

(142)

PL/SQL Packages

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

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

(143)

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

(144)

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

(145)

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

(146)

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 ;

(147)

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

(148)

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

(149)

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

(150)

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 .

(151)

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>

(152)

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

(153)

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

(154)

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

´

(155)

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

(156)

PL/SQL Triggers

Composants du trigger

Le corps du trigger est d´

efini par un bloc PL/SQL anonyme

[DECLARE] BEGIN

[ EXEPTION ] END;

(157)

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

Références

Documents relatifs

Por isso, foram conduzidos levantamentos das cochonilhas e seus inimigos naturais no Espírito Santo, como parte das pesquisas para o desenvolvimento do manejo integrado de pragas

Vidéo 13, page 353 : Marlène Samoun au chant, Rachid Brahim-Djelloul au violon, Pascal. Storch à la guitare et percussions, Olivier Hutman

Ayant ainsi mis en relief la relation entre traduction et entrepreneuriat au moyen d’une étude pilote et d’une analyse critique des résultats, le moins que l’on puisse

Ainsi, même si des auteurs comme Roy (1999, 2005), Bousquet (2005b) et Bousquet et Morrissette (2009) ont démontré que les problèmes d’alcoolisme et de santé

Embora haja um padrão biológico distinto de absorção dos nutrientes pelo cafeeiro em função das fases fenológicas e do tipo de órgão amostrado (CATANI; MORAES, 1958; CATANI et

« Quand la maxime d’après laquelle j’ai l’intention de rendre témoignage est examinée par la raison pratique, je cherche toujours ce qu’elle serait, si elle avait la

Nous avons aussi tenu compte des indicateurs sociaux, notamment, l’âge de la femme 

Dans ce chapitre, sur la base d’un café participatif réalisé avec comme public des professionnels de la recherche, nous nous interrogerons sur ce que le processus fait