Vous êtes sur la page 1sur 109

Universit Mohamed premier Facult des sciences Dpartement de Mathmatiques et dinformatique

Anne universitaire 12/13 Licence Professionnelle : Administrateur BDs

Bases de donnes avances


Professeur : M. MOUSSI

M. Moussi

Plan du cours :

M. Moussi

Introduction. Les variables. Les tableaux. Les structures de contrle. Les curseurs. Gestion des erreurs. Fonctions et procdures. Packages. Triggers.
2

Introduction

PL/SQL(Procedural Language/Structured Query Language)


Reprsente la contribution dOracle corporation au monde de la programmation. Il sagit dune extension procdurale au langage SQL. Langage 4me gnration. Le PL/SQL est apparu initialement avec la version 6 dOracle en 1988. Sert lire des donnes, remplir des BDs, crer des objets stocks .

M. Moussi

Introduction

PL/SQL : langage de programmation dOracle


Oracle reprsente bien plus quune simple base de donnes Il inclut aussi un moteur pour de nombreux langages, parmi lesquels : Java avec JVM intgr . PL/SQL. Le code peut tre stock dans la BD puis tre excut sans quaucun produit supplmentaire ne soit ncessaire.

M. Moussi

Introduction
Serveur Oracle
Intgration SQL et PL/SQL Appels externes

Programme PL/SQL stock

Moteur PL/SQL

Moteur SQL

BDs

M. Moussi

Introduction
Le serveur reoit un appel pour excuter un programme PL/SQL . La version compile est charge en mmoire puis excute par le moteur PL/SQL. Le moteur PL/SQL gre les structures mmoire, le flux logique du programme et excute le code procdural. Le moteur SQL transmet la base de donnes les requtes de donnes.

M. Moussi

Introduction
PL/SQL est utilis dans de nombreux produits Oracle : Le serveur Oracle,Oracle forms, Oracle reports, Oracle warhouse builder, oracle portal Les programmes PL/SQL peuvent tre appels partir des environnements de dveloppement Oracle suivants : SQL*Plus, Oracle Entreprise Manager, les prcompilateurs Oracle (Pro*C, Pro*Cobol, etc.)

M. Moussi

Introduction

Jeu de caractre de PL/SQL :


Les caractres supports sont : Les lettres majuscules et minuscules, les chiffres entre 0 et 9, les symboles suivants : ()+-*/<>=!~;:.`@%, # ^ &_|{}?[]

M. Moussi

Introduction
Les oprateurs arithmtiques :
Oprateur ** * / + Signification Exponentiation multiplication Division addition, soustraction

||
:= = <> Ou != >< >= <=
M. Moussi

Concatnation
assignation gale Non gale Suprieur,infrieur Suprieur ou gale infrieur ou gale 9

Introduction

structure dun programme PL/SQL(bloc PL/SQL) :


Il

ya de la place pour des variables, pour le code et la logique du programme, des instructions de gestion derreurs. Structure de base dun programme PL/SQL :
DECLARE --dclaration des constantes et des variables BEGIN --code du programme (commandes et instructions) EXCEPTION --code de gestion des erreurs END;
M. Moussi

10

Introduction

Remarque :
Commentaires : Dlimiteurs multi-lignes dbut et fin /* et */. Dlimiteurs mono-ligne de dbut - Les sections dclaration des variables et exception sont facultatives, la section obligatoire est celle dbute par le mot cl BEGIN et termine par le mot cl END.

M. Moussi

11

Les variables PL/SQL


Sont utilises pour : Le stockage temporaire des valeurs. La manipulation des valeurs stockes. Possibilit de rutilisation. Faciliter la maintenance.

M. Moussi

12

Les variables PL/SQL


Leur traitement consiste : Dclarer et initialiser les variables dans la section de dclaration. Attribuer de nouvelles valeurs dans la section excutable. Passer des valeurs en blocks PL/SQL via des paramtres. Voir des rsultats via des variables de sortie.

M. Moussi

13

Les variables PL/SQL


Les types de variables : Scalaire. Compos. BLOB, BFILE, CLOB (objets volumineux) (Large Objects).

M. Moussi

14

Les variables PL/SQL


sont dclares dans la section de la dclaration dun programme PL/SQL Une dclaration alloue de lespace de stockage pour une valeur, spcifie son type de donnes et nomme lemplacement de stockage pour y rfrer au sein du programme Une seule variable par ligne. Les types de donnes les plus utiliss sont : VARCHAR2, NUMBER, DATE, BOOLEAN, LONG,

M. Moussi

15

Les variables PL/SQL


Syntaxe permettant dinitialiser une variable au sein de la section de dclaration : Nom_variable [CONSTANT] type_variable :=valeur ; Syntaxe daffectation dune valeur une variable dans la section dexcution Nom_variable :=valeur ; Exemple :

M. Moussi

16

Les variables PL/SQL


DECLARE l_counter NUMBER := 0 ; --initialise la variable 0 l_today DATE := sysdate ; --assigne la date systme la variable l_name VARCHAR2(50) ;--dclaration de la variable BEGIN l_counter :=l_counter+1 ;--ajoute 1 la valeur courante du compteur l_name := mohammed ; -- assigne une valeur la variable EXCEPTION WHEN OTHERS THEN RAISE_APPLICATION_ERROR(-20100,erreur no||sqlcode||desc :||sqlerrm) ; END; --sqlcode : retourne le numro de lerreur oracle et le message. sqlerrm : retourne le message derreur correspondant en cas dexception interne.

M. Moussi

17

Les variables PL/SQL


Type de donnes
BINARY_INTEGER PLS_INTEGER

Description
Utilis pour stocker des entiers signs compris dans lintervalle [-214783647..214783647] cest un sous type de BINARY_INTEGER cd le mme intervalle. les oprations sur ce type sont plus rapide que NUMBER et BINARY_INTEGER (database<10G sont plus rapide a partir de 10G cest la mme chose BINARY ou PLS) Utilis pour stocker des donnes de type (chaine) caractre, o l reprsente la longueur (taille maximale). Champ de longueur variable utilis pour stocker des donnes de type (chane) caractre, o l reprsente la longueur (taille maximale).

CHAR(l)

VARCHAR2(l)

M. Moussi

18

Les variables PL/SQL


Type de donnes NUMBER(l,d) Description Champ de longueur variable utilis pour stocker des donnes de type numrique, o l reprsente la longueur (le nombre total des chiffres) et d le nombre de dcimales (chiffres aprs la virgule). Champ de longueur variable utilis pour stocker des donnes binaires, o l reprsente la longueur. DATE Champ de longueur fixe utilis pour stocker des dates. Par dfaut oracle affiche la date au format DD-Mon-YY (14-jan-2011)

RAW(l)

M. Moussi

19

Les variables PL/SQL


Type de donnes LONG (l) Description Champ de longueur variable utilis pour stocker jusqu 2G de donnes de type (chane de) caractre. Pour stocker des valeurs logiques : TRUE, FALSE ou NULL (en PL/SQL on na pas TRUE=1 et FALSE=0).

BOOLEAN

M. Moussi

20

Les variables PL/SQL


Exemple :
DECLARE l_start_date DATE ; BEGIN --dfinit la variable avec la date du 29 septembre 2011 l_start_date := 29-sep-11 ; --dfinit la variable avec la date du 29 septembre 2020, ----appelle la fonction to_date pour spcifier lanne en 4 chiffres. l_start_date := TO_DATE(29-sep-2020,DD-MON-YYYY ); END ;

M. Moussi

21

Les variables PL/SQL


Variable rfrence une colonne dune table de la base : Nom_variable table.colonne%TYPE ; Exemple
DECLARE num_etud etudiant.NE%TYPE; BEGIN num_etud := 2; END ;

M. Moussi

22

Les variables PL/SQL


Variable rfrence une table de la base : Nom_variable table%ROWTYPE ; Exemple
DECLARE un_etudiant etudiant%ROWTYPE;
Par

reference aux champs:

BEGIN un_etudiant.NE=1; un_etudiant.nom=Ahmed; un_etudiant.ville=oujda; END;

M. Moussi

23

Les variables PL/SQL


Le nom dune variable : Est compos de lettre, chiffre, $,_ ou #. Ne peut pas excder 30 caractres. Ne doit pas contenir des mots rservs. Doit commencer avec un caractre alphabtique. La valeur dune constante ne peut pas tre modifie.

M. Moussi

24

Les variables PL/SQL


Cration de sous type : SUBTYPE nom_sous_type IS TYPE; Exemple SUBTYPE entier_court IS SMALLINT; i entier_court;

M. Moussi

25

Les variables PL/SQL


Affichage : DBMS_OUTPUT.PUT_LINE Est une procdure prdfinie. Permet dafficher des donnes. Elle est dsactiver par dfaut. Doit tre active dans SQL*Plus en utilisant SET SERVEROUTPUT ON

M. Moussi

26

Les tables PL/SQL


Permettent de dfinir et de manipuler des tableaux dynamiques Dfinis sans dimension initiale. Est une collection de mme type. Peuvent grandir dynamiquement Utilise des index non conscutifs Les fonctions pour les tableaux : nom_tableau.fonction

M. Moussi

27

Les tables PL/SQL

Syntaxe de dclaration dun tableau :


TYPE nom_type IS TABLE OF (type_colonne | variable%TYPE | table.colonne%TYPE) [NOT NULL] | table.%ROWTYPE [INDEX BY BINARY_INTEGER]. Nom_tableau nom_type ;

Exemples :

M. Moussi

28

Les tables PL/SQL


Instruction PL/SQL DECLARE TYPE c_tytab IS TABLE OF VARCHAR2 (6) INDEX BY BINARY_INTEGER; TYPE nomPilotes_tytab IS TABLE OF Pilote.nom%TYPE INDEX BY BINARY_INTEGER; TYPE pilotes_tytab IS TABLE OF Pilote%ROWTYPE INDEX BY BINARY_INTEGER; Signification Type de tableaux de chanes de six caractres. Type de tableaux de colonnes de type nom de la table Pilote. Type de tableaux denregistrements de type de la table Pilote.

M. Moussi

29

Les tables PL/SQL


Instruction PL/SQL tab_c c_tytab; tab_nomPilotes nomPilotes_tytab; tab_pilotes pilotes_tytab; BEGIN tab_c(-1) := 'PL-1'; tab_c(-2) := 'PL-2'; tab_nomPilotes(7800) := 'X'; tab_pilotes(0).brevet := 'PL-0'; END ; Signification Dclaration des tableaux.

Initialisations.

M. Moussi

30

Les tables PL/SQL

Fonctions pour les tableaux :


EXISTS (n) : retourne TRUE si le nime lment du tableau existe. COUNT : retourne le nombre dlments du tableau. FIRST / LAST : retourne le premier/dernier indice du tableau (NULL si tableau vide). PRIOR (n) / NEXT (n) : retourne llment avant/aprs le nime lment du tableau. DELETE, DELETE (n), DELETE (n, m) : supprime un ou plusieurs lments au tableau.

M. Moussi

31

Les structures de contrle des flux

On dispose des structures suivantes:


Les structures avec IF. Les expressions CASE. Les boucles.

M. Moussi

32

Les structures de contrle des flux


Les structures avec IF : IF-THEN-END IF IF-THEN-ELSE-END IF IF-THEN-ELSEIF-END IF
IF condition THEN instructions; [ELSIF condition THEN instructions;] [ELSE instructions;] END IF;
M. Moussi

33

Les structures de contrle des flux


Les structures avec IF : IF-THEN-END IF
Sert tester des conditions simples. Si la condition est value comme tant TRUE, une ou plusieurs lignes de code sont excutes. Si elle est value comme tant FALSE, aucune action na lieu. Il est possible dimbriquer des structures IF-THEN

M. Moussi

34

Les structures de contrle des flux


Exemple1 :
IF l_date>10-apr-11 THEN

l_salary :=l_salary*1.5 augmente la salaire de 50%. END IF ; Ou bien IF NOT (l_date<=10-apr-11) THEN l_salary :=l_salary*1.5 ; END IF ;

M. Moussi

35

Les structures de contrle des flux


Exemple2 :
IF l_date>10-apr-11 THEN IF l_name :=Ahmed THEN l_salary*1.5 ; END IF ; END IF ;

M. Moussi

36

Les structures de contrle des flux


IF-THEN-ELSE

Lorsque la condition est value comme tant FALSE, linstruction qui suit la clause ELSE est excute. Une instruction IF ne peut contenir quune seule ELSE Exemple :
IF l_date>10-apr-11 THEN l_salary :=l_salary*1.5 ; ELSE l_salary :=l_salary*1.55 ; END IF ;

M. Moussi

37

Les structures de contrle des flux


IF-THEN-ELSIF

Offre la possibilit de tester une autre condition lorsque la premire est value comme tant FALSE. Convenable lorsquon souhaite tester plusieurs conditions sans avoir imbriquer des instructions IF Supporte un nombre illimit de clause ELSIF.

M. Moussi

38

Les structures de contrle des flux


Exemple :
IF l_name=med THEN l_salary := l_salary*1.5 ; ELSIF l_name=Ad then l_salary :=l_salary*1.15 ; ELSE l_salary :=l_salary*1.15 ; END

Remarque : Seule linstruction IF doit tre accompagne des mots cls END IF pas l o la clause ELSIF

M. Moussi

39

Les structures de contrle des flux


Les expressions CASE A t introduit avec oracle 9i, Syntaxe :
CASE slecteur WHEN expression1 THEN rsultat1 WHEN expression2 THEN rsultat2 WHEN expression3 THEN rsultat3 ELSE resultat END ;

M. Moussi

40

Les structures de contrle des flux


La

premire clause WHEN qui correspond la valeur du slecteur dtermine la valeur de rsultat, et les clauses WHEN suivantes ne sont pas values. Une instruction CASE peut contenir un nombre illimit dexpressions.

M. Moussi

41

Les structures de contrle des flux


Exemple (ce programme affiche ou):
DECLARE Val VARCHAR2 (100) ; City VARCHAR2 (20) :=oujda ; BEGIN Val := CASE city WHEN oujda THEN ou WHEN oujda1 THEN ou1 WHEN oujda2 THEN ou2 ELSE no one END ; DBMS_OUTPUT_PUT_LINE(val) ; -- affichage lcran END ;
M. Moussi

42

Les structures de contrle des flux


Les boucles Une boucle permet dexcuter rptition une srie dinstructions. Trois types de boucles :
LOOP WHILE-LOOP FOR-LOOP

M. Moussi

43

Les structures de contrle des flux


La

boucle LOOP
Le plus simple, dbute par une instruction LOOP , se termine par les mots cls END LOOP. Syntaxe :
LOOP Instructions excutables ; END LOOP ;

M. Moussi

44

Les structures de contrle des flux


Pour que cette boucle puisse prendre fin, on doit inclure une instruction EXIT LOOP instructiont1; ... EXIT [WHEN condition]; END LOOP;

M. Moussi

45

Les structures de contrle des flux


Exemple 1 :
LOOP IF average < 10 THEN EXIT ELSE Decision :=successful ; END IF ; END LOOP ;

M. Moussi

46

Les structures de contrle des flux


Exemple 2 :
DECLARE nombre NUMBER(2) :=1 ; BEGIN LOOP DBMS_OUTPUT.PUT_LINE(nombre) ; nombre := nombre+1 ; EXIT WHEN nombre > 10 ; END LOOP ; END;

M. Moussi

47

Les structures de contrle des flux


La

boucle WHILE-LOOP

Son Excution se poursuit tant que la condition quelle dfinit est TRUE. Ds que la condition est value comme tant FALSE, la boucle se termine., Syntaxe :
WHILE condition LOOP Instructions excutables ; END LOOP ;

La condition est value au dbut de chaque itration.


M. Moussi

48

Les structures de contrle des flux


Exemple :
WHILE l_sales_total<1000 LOOP SELECT sales_amount INTO l_sale_amount FROM daily_sales ; l_sales_total := l_sales_total + l_sale_amount ; END LOOP ;

M. Moussi

49

Les structures de contrle des flux


La

boucle FOR-LOOP

Lune des boucles les plus utilises en PL/SQL. Son avantage est quon peut contrler le nombre de fois o elle sera excute. Syntaxe :
FOR compteur IN val_debut ..val_fin LOOP Instructions ; END LOOP ;

Le compteur est dclar implicitement.

M. Moussi

50

Les structures de contrle des flux


On peut aussi imposer que le comptage se fasse en sens inverse au moyen de la clause REVERSE. Exemple :
DECLARE l_counter number ; BEGIN FOR l_counter IN REVERSE 1..5 LOOP DBMS_OUTPUT.PUT_LINE(l_counter) ; END LOOP ; END ;

M. Moussi

51

Les structures de contrle des flux


La valeur de sortie de la boucle peut tre obtenue partir de la base de donnes ou dune autre source. Exemple :
DECLARE l_emp_count NUMBER ; I number ; --variable de compteur BEGIN --rcupre le nombre des employs dans la variable --l_emp_count SELECT COUNT (*) INTO l_emp_count FROM employee ; FOR i IN 1..l_emp_count LOOP DBMS_OUTPUT.PUT_LINE(employe|| i) ; END LOOP ; END ;
M. Moussi

52

Les curseurs
Le moyen le plus simple dinclure des donnes dans un programme est de les slectionner dans BD. Structure de donnes permettant de stocker le rsultat dune requte qui retourne plusieurs lignes. Lorsquon utilise un ordre SQL, un curseur implicite est automatiquement ouvert pour le grer. Leur utilisation peut ralentir le programme. Une mthode plus efficace consiste utiliser un curseur explicite.

M. Moussi

53

Les curseurs
Un curseur est dfini dans la section de dclaration dun programme. Il reoit un nom linstar dune variable. Oracle peut ainsi prparer lavance le traitement de linstruction, ce qui permet au programme dexploiter au mieux la mmoire.

M. Moussi

54

Les curseurs
Dclaration dun curseur : Syntaxe
CURSOR nom_curseur IS requteSQL;
Exemple

DECLARE CURSOR get_employe IS SELECT numero, nom, salaire FROM employee WHERE salaire >1000 ; BEGIN END ;

M. Moussi

55

Les curseurs
Ouverture dun curseur : Syntaxe
OPEN Nom_curseur;
Il

n'est pas permis d'ouvrir un curseur dj ouvert. Exemple


DECLARE CURSOR get_employe IS SELECT numero, nom, salaire FROM employee WHERE salaire >1000 ; BEGIN OPEN get_employe; END ;
M. Moussi

56

Les curseurs
Fermeture dun curseur :
Seffectue

dans les sections BEGIN ou EXCEPTION. Elle libre les ressources utilises par le curseur Syntaxe :
CLOSE Nom_curseur;
La

non fermeture du curseur peut provoquer des problmes de mmoire ou bien peut donner des rsultats non attendus.

M. Moussi

57

Les curseurs
Traitement des lignes dun curseur : Il est ncessaire de dclarer et douvrir le curseur avant son utilisation. Syntaxe
FETCH Nom_curseur INTO Liste_de_variables; FETCH Nom_curseur INTO variables_type_enregistrement;

M. Moussi

58

Les curseurs
Exemple :
DECLARE l_emp_count NUMBER ; i number ; --Dclare le curseur explicite pour la slection CURSOR get_emp_data IS SELECT COUNT (*) FROM employee ; BEGIN --ouvre le curseur OPEN get_emp_data ; --place le rsultat dans une variable FETCH get_emp_data INTO l_emp_count ; FOR i IN 1..l_emp_count LOOP Dbms_output.put_line(employe||i) ; END LOOP ; --ferme le curseur CLOSE get_emp_data ; END ; M. Moussi

59

Les curseurs
Remarques : Dans cet exemple, oracle extrait seulement une ligne de la base de donnes. Pour en rcuprer davantage, il est possible dassocier un curseur explicite une boucle.

M. Moussi

60

Les curseurs
La structure CURSOR-FOR-LOOP : Permet dassocier un curseur une boucle. Permet dextraire plusieurs lignes de la base de donnes, Plus simple programmer
Il nest pas ncessaire douvrir et de fermer le curseur Cest oracle qui sen charge dans la boucle.

M. Moussi

61

Les curseurs
Exemple :
DECLARE CURSOR get_emp_data IS SELECT emp_name, salary FROM employee ORDER BY emp_name ; BEGIN FOR c1_rec IN get_emp_data LOOP DBMS_OUTPUT.PUT_LINE(employe :|| c1_rec.emp_name || salaire :|| c1_rec.salary) ; END LOOP ; END ;

M. Moussi

62

Les curseurs
Les attributs dun curseur : L'attribut %FOUND
Prend la valeur TRUE Si la commande FETCH a ramen une ligne. Utilis avec la syntaxe
Nom_curseur%FOUND pour un curseur explicite SQL%FOUND pour un curseur implicite

Exemple : Avec lexemple prcdent et les dclarations suivantes :


nom_emp employee.emp_name %TYPE; sal_emp employee.salary%TYPE;

M. Moussi

63

Les curseurs
BEGIN OPEN get_emp_data; LOOP FETCH get_emp_data INTO nom_emp, sal_emp IF get_emp_data %FOUND THEN DBMS_OUTPUT.PUT_LINE('Nom:'||nom_emp||'-Salaire:' ||sal_emp); ELSE EXIT; END IF; END LOOP CLOSE get_emp_data; END; /
M. Moussi

64

Les curseurs
L'attribut

%NOTFOUND

Prend la valeur TRUE Si la dernire commande FETCH na pas a ramen une ligne. Utilis avec la syntaxe
Nom_curseur%NOTFOUND pour un curseur explicite. SQL%NOTFOUND pour un curseur implicite.

Exemple : mettre jour le salaire dun employ et afficher un message si cet employ nexiste pas

M. Moussi

65

Les curseurs
SQL> ACCEPT emp_nom PROMPT 'entrer un nom : ' entrer un nom : jamal SQL> BEGIN UPDATE employee SET salary=2000 WHERE nom ='&emp_nom'; IF SQL%NOTFOUND THEN DBMS_OUTPUT.PUT_LINE('Cet employ nexiste pas') ; END IF; END;

M. Moussi

66

Les curseurs
L'attribut

%ROWCOUNT

est de type numrique contient le nombre de lignes ramenes par la commande FETCH Utilis avec la syntaxe
Nom_curseur%ROWCOUNT pour un curseur explicite. SQL%ROWCOUNT pour un curseur implicite.

Exemple : augmenter le salaire infrieur 1500 et afficher le nombre demploys pour lesquels le salaire a t augment

M. Moussi

67

Les curseurs
SET SERVEROUTPUT ON BEGIN UPDATE employee SET salary = salaire + 120 WHERE salary < 1500 ; DBMS_OUTPUTPUT_LINE('Nombre demploys augments:' || SQL%ROWCOUNT); END;

M. Moussi

68

Les curseurs
L'attribut

%ISOPEN

est de type boolen Utilis pour dterminer Si un curseur est ouvert ou ferm Utilis avec la syntaxe
Nom_curseur%ISOPEN pour un curseur explicite. SQL%ISOPEN pour un curseur implicite.

M. Moussi

69

Les exceptions
Les sources d'erreurs lors de l'excution d'une application sont multiples : Erreur du code, Erreur systme, Violation d'une rgle Oracle, Dpassement des limites du systme d'exploitation. Chaque erreur Oracle gnre par le noyau a un code erreur.

M. Moussi

70

Les exceptions
En PL/SQL, les erreurs de programme sont gres au moyen de gestionnaires dexceptions. Lorsquune erreur survient pendant lexcution dun programme, ce dernier dtermine si on a anticip le problme laide dun code. Oracle dispose dun certain nombre de gestionnaires dexceptions prdfinis quon peut utiliser. Une exception permet de grer une erreur pour laquelle oracle na pas prvu de gestionnaire.

M. Moussi

71

Les exceptions
Un nom d'exception est: Soit prdfini en interne par le noyau Oracle Soit dfini par l'utilisateur. Il peut tre associ un code d'erreur. Le dveloppeur peut galement dfinir ses propres erreurs qu'il doit dclencher explicitement et auxquelles il attribue un nom personnalis.

M. Moussi

72

Les exceptions
Deux mthodes pour grer les erreurs: Si le nom d'exception existe:
BEGIN EXCEPTION WHEN Nom_exception THEN

-- Instructions;
END; /

M. Moussi

73

Les exceptions
Si le nom d'exception n'existe pas:
BEGIN EXCEPTION WHEN OTHERS THEN IF SQLCODE =Numero_code1 THEN

-- Instructions;
END IF; IF SQLCODE Numero_code2 THEN -- Instructions; END IF; END;

M. Moussi

74

Les exceptions
La commande RAISE interrompt l'excution normale du bloc PL/SQL et transfre la suite des oprations au gestionnaire d'exception. Exemple : Grer un seuil de stock:
DECLARE Stock_alert EXCEPTION ;

Stock_Seuil NUMBER(4);
Qte_stock BEGIN IF Qte_stock <Stock_seuil THEN RAISE Stock_alert ; END IF ; EXCEPTION WHEN Stock_alert THEN END; M. Moussi NUMBER(4);

75

Les exceptions
Quelques erreurs quoracle peut aider grer :
Exception NO_DATA_FOUND Description N derreur Est produite lorsquune instruction ORA-01403 SELECT INTO ne retourne aucune ligne.

TOO_MANY_ROWS

Est produite lorsquune instruction ORA-01422 SELECT INTO retourne plusieurs lignes.
ORA-00001

DUP_VAL_ON_INDEX Est produite lorsquun INSERT tente dinsrer une valeur en double dans une colonne sur laquelle une contrainte dindex unique a t dfinie.
M. Moussi

76

Les exceptions
Quelques erreurs quoracle peut aider grer :
Exception VALUE_ERROR Description Est produite lorsquon tente de placer une valeur dans une variable de type non compatible. Sert intercepter nimporte quelle erreur qui nest pas prise en charge par un gestionnaire spcifique. Elle doit apparatre en dernier dans la section des exceptions, car oracle ne traitera plus aucune exception aprs celle-ci. 77 N derreur ORA-06502

OTHERS

M. Moussi

Les exceptions
Exemple

DECLARE L_emp_count NUMBER ; i number ; l_row employe%ROWTYPE ; BEGIN SELECT * INTO l_row FROM employee ORDER BY emp_name ; EXCEPTION WHEN NO_DATA_FOUND THEN RAISE_APPLICATION_ERROR (-20000,desole, aucune donne dans ||cette table Essayez a nouveau !) ; WHEN OTHERS THEN RAISE_APPLICATION_ERROR (-20999, il y a un probleme) ; END ;
M. Moussi

78

Les exceptions
PRAGMA EXCEPTION_INIT est une directive compile qui demande au compilateur d'associer le nom d'une exception avec le numro d'une erreur Oracle de la faon suivante:
PRAGMA EXCEPTION_INIT(Nom_exception, Numero_erreur_Oracle);

M. Moussi

79

Les exceptions
Exemple

: Dclarer l'exception Privilges_insuffisants et l'associer l'erreur -1031:


DECLARE Privileges_insuffisants EXCEPTION; PRAGMA EXCEPTION_INIT(PriviIeges_insuffisants,-1O31); BEGIN EXCEPTION WHEN Privilges_insuffisants THEN Traitements; END ;

M. Moussi

80

Les exceptions
Il est possible de crer ses propres erreurs avec numro de code et message associ en utilisant la syntaxe suivante :
RAISE_APPLICATION_ERROR( numro_erreur, message) o numro_erreur est compris entre -20000 et -20999.

M. Moussi

81

Les exceptions
Exemple

DECLARE nom_emp e_emp.nom% TYPE; BEGIN SELECT nom INTO nom_emp FROM e_emp WHERE no =&p_no; IF nom_emp = 'IDRISSI' THEN RAISE_APPLICATION_ERROR( -20200, 'C "EST IDRISSI! '); ELSE DBMS_OUTPUT.PUT_LINE(nom_emp); END IF ; END;

M. Moussi

82

Les exceptions
La fonction SQLCODE retourne le numro de l'erreur Oracle. Ce nombre est ngatif sauf pour l'erreur NO_DATA_FOUND : (SQLCODE = +100). La fonction SQLERRM retourne le texte du message d'erreur. Ce message commence avec le code Oracle de l'erreur.

M. Moussi

83

Les exceptions
Exemple : afficher les messages pour les numros derreurs allant de -20 -30
DECLARE Message_erreur VARCHAR2(100); BEGIN FOR Numero_erreur IN 20.. 30 LOOP Message_erreur : = SQLERRM( - Numero_erreur); DBMS_OUTPUT.PUT_LlNE(message_erreur); END LOOP; END;

M. Moussi

84

Les traitements stocks


Les traitements sont dfinis avec le langage PL/SQL et sont stocks dans les tables du dictionnaire de donnes On peut crer quatre types de programmes stocks : des procdures, des fonctions, des paquetages et des triggers.

M. Moussi

85

Les traitements stocks


Les avantages des traitements stocks : Rutilisation des programmes : toutes les applications peuvent accder au programme. Permettre leur partage entre des utilisateurs et des applications. Faciliter la gestion de la confidentialit : donner le droit de lancer un traitement sans donner le droit daccs direct aux donnes.

M. Moussi

86

Les procdures
Les procdures stockes sont des programmes entiers qui peuvent tre excuts dune faon indpendante ou partir dun autre programme, Remarque : Bien que les fonctions et les paquetages soient eux aussi stockes dans la base de donnes, habituellement seules les procdures sont dites stockes.

M. Moussi

87

Les procdures
Syntaxe de cration dune procdure :
CREATE [OR REPLACE] PROCEDURE nom_procedure [(nom_argument1 [IN|OUT] type, (nom_argument2 {IN|OUT} type,)] AS | IS [partie dclaration] BEGIN ... [EXCEPTION...] END [nom procedure];

M. Moussi

88

Les procdures
Avec:

Partie dclaration est similaire celle dun bloc PL/SQL. IN : argument en entre, non modifi par la procdure. OUT : argument en sortie, peut tre modifi par la procdure, transmis au programme appelant. IN OUT : la fois en entre et en sortie.

M. Moussi

89

Les procdures
Exemple

1:

CREATE OR REPLACE PROCEDURE list_employes IS BEGIN DECLARE l_emp_count NUMBER ; CURSOR get_emp_data IS SELECT emp_name, salary FROM employee ORDER BY emp_name ; BEGIN FOR c1_rec IN get_emp_data LOOP DBMS_OUTPUT.PUT_LINE(employe :|| c1_rec.emp_name || salaire :|| c1_rec.salary) ; END LOOP ; END ; END;

M. Moussi

90

Les procdures
Exemple

2:

CREATE OR REPLACE PROCEDURE employes_cont (in_prov IN VARCHAR2,out_emp_count OUT NUMBER) IS BEGIN DECLARE L_emp_count NUMBER ; i number ; CURSOR get_emp_data IS SELECT COUNT (*) FROM employee WHERE province=in_province ; BEGIN OPEN get_emp_data; FETCH get_emp_data INTO i; Out_emploe_count:=i; END ; END;

M. Moussi

91

Les procdures
Remarques

Il peut tre utile de dcrire une procdure avant de lexcuter laide de la commande DESCRIBE:
DESCRIBE nom_procedure

Excution dune procdure stocke Sous sql*Plus :


EXECUTE nom_procedure [(liste arguments)]

Appel dune procdure dans un programme PL/SQL :


nom_procedure [(liste arguments effectifs)];

M. Moussi

92

Les procdures
Recherche dune procdure dans la base :
SELECT object_name FROM user_objects WHERE object_type=PROCEDURE

M. Moussi

93

Les procdures
Recherche du code source dune procdure dans la base :
SELECT text FROM user_source WHERE name=nom_procedure ORDER BY LINE ;

Suppression dune procdure :


DROP PROCEDURE nom_procedure;

M. Moussi

94

Les fonctions
Sont aussi des objets stocks dans la base, Une fonction retourne un resultat Il est possible de les utiliser dans des instructions SQL.

M. Moussi

95

Les fonctions
Syntaxe de cration dune fonction :
CREATE OR REPLACE FUNCTION nom_function [(liste parametres)] RETURN type_val {IS|AS} [partie dclaration] BEGIN {contenu du bloc PL} RETURN variable_a_retourner; [EXCEPTION...] END [nom_function];

M. Moussi

96

Les fonctions
Avec:

Partie dclaration est similaire celle dun bloc PL/SQL. Type_val : le type de la valeur retourne par la fonction. Liste parametres : similaire une procdure.

M. Moussi

97

Les fonctions
Exemple

1:

CREATE OR REPLACE FUNCTION count_all_employes RETURN NUMBER IS BEGIN DECLARE i NUMBER ; CURSOR get_emp_data IS SELECT COUNT (*) FROM employee; BEGIN OPEN get_emp_data; FETCH get_emp_data INTO i; RETURN i; END; END;
M. Moussi

98

Les fonctions
Exemple

2:

CREATE OR REPLACE FUNCTION f_service(p_no IN e_emp. Service_no% TYPE ) RETURN NUMBER IS v_no NUMBER(3) ; BEGIN SELECT COUNT(no) INTO v_no FROM e_emp WHERE service_no=p_no ; RETURN (v_no) ; END ;

M. Moussi

99

Les fonctions
Remarques

Excution dune fonction Sous sql*Plus :


SELECT nom_fonction [(liste arguments)] FROM DUAL;

Appel dune fonction dans un programme PL/SQL :


Variable:=nom_fonction [(liste arguments effectifs)];

M. Moussi

100

Les fonctions
Recherche dune fonction dans la base :
SELECT object_name FROM user_objects WHERE object_type=FUNCTION

M. Moussi

101

Les fonctions
Recherche du code source dune fonction dans la base :
SELECT text FROM user_source WHERE name=nom_function ORDER BY LINE ;

Suppression dune fonction :


DROP FUNCTION nom_fonction;

M. Moussi

102

Les packages
Un package est lencapsulation dobjets, dans une mme unit logique de traitement, comme
Procdures Fonctions Exceptions Variables, curseurs, constantes

M. Moussi

103

Les packages
Un package comprend deux parties Une partie spcification
Contient la dclaration des objets visibles de lextrieur Cette partie est appele aussi partie publique.
Un

corps

Contient la dfinition des objets dclars dans la spcification et ceux qui ne sont pas visibles qu lintrieur. Cette partie est appele aussi partie prive

M. Moussi

104

Les packages
Parmi les avantages des packages
Modifier le corps sans recompiler la spcification ou changer les programmes qui font appel aux objets du package. Dfinir des variables globales et des curseurs communs toutes les procdures ou fonctions du package. Grer plus efficacement les privilges accorder

M. Moussi

105

Les packages
Syntaxe de la partie spcification:
CREATE [OR REPLACE] PACKAGE nom_Package [IS | AS] -- Dclaration END [ nomPackage ]; Dclarations : Objets du paquetage : Procdures et fonctions (prototype).

M. Moussi

106

Les packages
Syntaxe de la partie corps
CREATE [OR REPLACE] PACKAGE BODY nom [IS | AS] [Dclaration objets privs] [Dfinition des procdures et des fonctions] [BEGIN Instructions [EXCEPTION Bloc exception END [nomPackage];

M. Moussi

107

Les packages
Exemple

Partie spcification :

CREATE OR REPLACE PACKAGE Statistiques AS FUNCTION PlusDeNFilms (nbFilms NUMBER) RETURN NUMBER; FUNCTION nbFilmsActeur (numActeur Individu.numIndividu%TYPE) RETURN NUMBER; END Statistiques ;

Partie corps

CREATE OR REPLACE PACKAGE Statistiques AS FUNCTION PlusDeNFilms (nbFilms NUMBER) RETURN NUMBER AS
M. Moussi

108

Les packages
partie dclarations BEGIN Corps de la fonction EXCEPTION Traitement des exceptions END PlusDeNFilms; FUNCTION nbFilmsActeur(numAct Individu.numInd%TYPE) RETURN NUMBER AS Partie declaration BEGIN Corps de la fonction EXCEPTION Traitement des exceptions END nbFilmsActeur; END statistiques ;
M. Moussi

109