Vous êtes sur la page 1sur 44

Programmer avec PL/SQL

Institut Supérieur d’Informatique et de Gestion (ISIG)


Année académique 2005 - 2006
Classe : IT3
Enseignant : Roland Olivier KYEDREBEOGO, Oracle Certified Profesional

Sommaire

z 0. Présentation du langage PL/SQL


z 1. Déclarer des variables
z 2. Ecrire des instructions exécutables
z 3. Interagir avec le serveur ORACLE
z 4. Ecrire des structures de contrôle
z 5. Ecrire des curseurs explicites
z 6. Traiter les exceptions
z Compléments
2
(c) 2006, KROS, nextStep Technologies

Présentation de PL/SQL

0 3

<Course name> <Lesson number>-1


Objectifs

A la fin de ce chapitre, vous pourrez:


z Décrire la finalité du Langage PL/SQL
z Décrire l’utilisation du LPL pour le développeur
d’applications et l’administrateur de bases de
données
z Présenter les avantages liés à l’utilisation du
LPL/SQL

4
(c) 2006, KROS, nextStep Technologies

Environnement PL/SQL

Moteur PL/SQL Prog. d’exécution


PL/SQL des instructions
Bloc
procédurales
PL/SQL

Bloc
SQL
PL/SQL

Programme d’exécution
des instructions SQL
Serveur ORACLE

5
(c) 2006, KROS, nextStep Technologies

Avantages de PL/SQL

z INTEGRATION
z Rôle essentiel aussi bien pour le serveur Oracle
(procédures et fonctions stockées, packages,
déclencheurs de base de données) et les outils de
développement (déclencheurs d’applications)
z Les applications utilisent des bibliothèques partagées
accessibles localement ou à distance
z Types de données SQL utilisables
z Exécution du code PL dans le moteur interne des
outils et du code SQL sur le serveur Oracle

6
(c) 2006, KROS, nextStep Technologies

<Course name> <Lesson number>-2


Avantages de PL/SQL

z AMELIORATION DES PERFORMANCES


z Envoi des instructions SQL au serveur Oracle en un
seul appel Î réduction du traffic réseau

z Sans PL/SQL les instructions SQ sont envoyées une


à une au serveur

z Possibilité d’utilisation des structures de contrôle


pour identifier les blocs à exécuter

7
(c) 2006, KROS, nextStep Technologies

Avantages de PL/SQL

DECLARE
….
BEGIN
….
EXCEPTION
z MODULARITE …
END ;
z PORTABILITE
z DECLARATION DE VARIABLES
z STRUCTURES DE CONTROLES
z TRAITEMENT DES EXCEPTIONS
8
(c) 2006, KROS, nextStep Technologies

Avantages de PL/SQL

SQL
Application AUTRES
SGBD
SQL

SQL
IF…THEN
SQL
ELSE
Oracle et
Application SQL
PL/SQL
END IF;
SQL

9
(c) 2006, KROS, nextStep Technologies

<Course name> <Lesson number>-3


Synthèse

z Le langage PL/SQL est une extension du


langage SQL
z Les blocs de code PL/SQL sont transmis à un
moteur PL/SQL et sont traités par celui-ci
z Avantages liés à l’utilisation de PL/SQL :
z Intégration
z Modularité
z Portabilité
z Optimisation du développement

10
(c) 2006, KROS, nextStep Technologies

Déclarer des variables

1 11

Objectifs

A la fin de ce chapitre, vous pourrez:


z Reconnaître un bloc PL/SQL de base et ses
différentes sections
z Décrire la signification des variables en PL/SQL
z Déclarer des variables PL/SQL
z Exécuter un bloc PL/SQL

12
(c) 2006, KROS, nextStep Technologies

<Course name> <Lesson number>-4


Structure d’un bloc PL/SQL
DECLARE (facultatif)
User defined variables, cursors, exceptions

BEGIN (obligatoire)
SQL Statements
PL/SQL Statements
DECLARE
EXCEPTION (facultatif)
….
What to do on when errors occur BEGIN
….
END ; (obligatoire) EXCEPTION

END ;

13
(c) 2006, KROS, nextStep Technologies

Exécuter des blocs PL/SQL

DECLARE
v_variable VARCHAR2(5);

BEGIN
SELECT column_name
INTO v_variable
DECLARE
FROM table_name ; ….
BEGIN
EXCEPTION ….
WHEN exception_name THEN EXCEPTION
… …
END ; END ;

14
(c) 2006, KROS, nextStep Technologies

Exécuter des blocs PL/SQL

z Un point-virgule (;) à la fin d’une instruction (SQL,


PL/SQL)
z Procedure PL/SQL exécutée avec succès !
DECLARE, BEGIN et EXCEPTION ne sont pas suivis
de ;
z END est suivi de ;
z CONSEIL : Clarté et facilité d’édition de vos
programmes Î une instruction par ligne !
z MODULARITE : Aller du simple au compliqué Î créer
les blocs, sous-programmes, packages appropriés
pour la résolution
15
(c) 2006, KROS, nextStep Technologies

<Course name> <Lesson number>-5


Types de blocs PL/SQL

[DECLARE]
PROCEDURE name
….
IS FUNCTION name
BEGIN
…. RETURN datatype
….
BEGIN IS
[EXCEPTION]
…. ….

[EXCEPTION] BEGIN
END ;
… ….
END ; RETURN value ;
Anonyme [EXCEPTION]
Procédure …
-Applicative END ;
-Stockée
Fonction
- Applicative
16
- Stockée
(c) 2006, KROS, nextStep Technologies

Structures de programme

DECLARE
OUTILS …. SERVEUR
BEGIN
Anonymous …. Anonymous
EXCEPTION
Proc. Func. Applicatives … Proc. Func. Stockées
END ;
Packages applicatifs Packages Stockés

Déclencheurs applicatifs Déclencheurs de base


de données
Types d’objet Types d’objet

17
(c) 2006, KROS, nextStep Technologies

Using & processing variables

z Stockage temporaire de données


z Manipulation de valeurs stockées
z Possibilité de réutilisation
z Facilité de maintenance (%TYPE)
USING

z Déclaration - section déclarative


z Affectation de valeurs – section exécutable
z Transmission aux blocs – paramètres (IN,
OUT, IN OUT)
z Affichage – variables de sortie
PROCESSING 18
(c) 2006, KROS, nextStep Technologies

<Course name> <Lesson number>-6


Déclaration de variables

identifier [CONSTANT] datatype [NOT NULL] [:=


| DEFAULT expression ];

DECLARE
v_hiredate DATE := ’04/03/2006’;
v_deptno NUMBER(2) NOT NULL := 4 ;
v_location VARCHAR2(13) := ‘IT30506’;
c_comm CONSTANT NUMBER := 336 ;

19
(c) 2006, KROS, nextStep Technologies

Déclaration de variables - Règles

z Suivre les conventions d’appellation


z Initialiser les variables NOT NULL et CONSTANT
z Déclarer 1 identificateur par ligne
z Initialiser les identificateurs
z Deux variables peuvent porter le même nom si dans
deux blocs distincts
z Nom de variable <> Nom des colonnes des tables
utilisées dans le bloc. Adopter la convention v_%
z Longueur max = 30 ; Premier caractère UNE
LETTRE suivie de lettres, nombres ou car. spéciaux

20
(c) 2006, KROS, nextStep Technologies

Types de variables

z Variables PL/SQL
z Scalaires : reçoivent une valeur unique
z Composites : manipulent des groupes de champs
z Référencées : pointeurs (NON TRAITEES)
z LOB (Large Object) : pointeurs indiquant l’emplacement
des objets volumineux stockés à l’extérieur des tables
(cf. chapitre dédié)
z Variables NON PL/SQL
z Variables déclarées dans les précompilateurs
z Champs d’écran des formulaires
z Variables hôtes iSQL*Plus

21
(c) 2006, KROS, nextStep Technologies

<Course name> <Lesson number>-7


Types de données scalaires

z Stockent une seule valeur


z Numériques, Caractères, Dates et Booléens
z Types de données scalaires de base :
z CHAR [ (max_length)] Longueur par défaut = 1
z VARCHAR2 (max_length)
z LONG
z LONG RAW : données binaires (pas interprété par PL)
z NUMBER [ (precision, scale) ]
z BINARY_INTEGER
z PLS_INTEGER
z BOOLEAN > Cf. Paper-PLSQL-1-18-21
22
(c) 2006, KROS, nextStep Technologies

Types de données scalaires

z Types de données scalaires de base :


z DATE
z TIMESTAMP Î Date + A+M+J+H+M+S
z TIMESTAMP WITH TIME ZONE Î TIMESTAMP +
décalage horaire
z TIMESTAMP WITH LOCAL TIME ZONE
z INTERVAL YEAR TO MONTH
z INTERVAL DAY TO SECOND

> Cf. Paper-PLSQL-1-18-21

23
(c) 2006, KROS, nextStep Technologies

Attribut %TYPE

z Déclarer une variable dont le type se base :


z Sur celui d’une colonne de table de la BD
z Sur celui d’une autre variable précédemment déclarée

z Faire précéder %TYPE


z Des noms de la table et de la colonne concernées
z Du nom de la variable précédente

QUEL PEUT ËTRE L’INTERET DE %TYPE ?


24
(c) 2006, KROS, nextStep Technologies

<Course name> <Lesson number>-8


Déclarer des variables avec %TYPE

identifier Table.Column_name%TYPE ;

DECLARE
v_name employees.last_name%TYPE;
v_bidon1 NUMBER(5,3) ;
v_bidon2 v_bidon1%TYPE := 10 ;

25
(c) 2006, KROS, nextStep Technologies

Déclarer des variables booléennes

z Attributs autorisés : TRUE, FALSE,


NULL
z Variables comparées avec AND, OR et
NOT
z Variables renvoient TOUJOURS TRUE,
FALSE ou NULL
z Des expressions peuvent être utilisées

26
(c) 2006, KROS, nextStep Technologies

Types de données composites

z Encore appelées Collections


z Possèdent des composants internes pouvant être
manipulés individuellement
z TABLE : Réferencer des collections comme objet
unique
z RECORD : Données liéés mais dissemblables
z NESTED TABLES et VARRAY (Cf. Advanced PL/SQL)

27
(c) 2006, KROS, nextStep Technologies

<Course name> <Lesson number>-9


Variables de type LOB

Stockage de blocs de données non structurés dont la taille


peut atteindre 4 Go
z CLOB : Character LOB : grands blocs de caractères à simple
octet dans la BD, à l’intérieur ou à l’extérieur de la ligne de la
table
z BLOB : Binary LOB : Objets binaires volumineux dans la BD,
à l’intérieur ou en dehors de la ligne de la table
z BFILE : Binary File : Objets binaires volumineux dans les
fichiers de l’OS, à l’extérieur de la BD
z NCLOB : NLS Character LOB : grands blocs de données
Unicode NCHAR à simple ou multiple octets de longueur fixe
dans la BD, à l’intérieur ou à l’extérieur ou en dehors de la
ligne de la table
28
(c) 2006, KROS, nextStep Technologies

Variables attachées (bind)


z Variables NON PL/SQL déclarées HORS DU BLOC
z Utiliser la fonction VARIABLE pour les initialiser !
z Utiliser : pour les réferencer
z Utiliser PRINT pour les afficher !

VARIABLE RESULTAT NUMBER ;


-----
BEGIN

?
SELECT (salary*12)
INTO :RESULTAT
WHERE employee_id = 144 ;
END ;
/
PRINT RESULTAT

29
(c) 2006, KROS, nextStep Technologies

DMBS_OUTPUT.PUT_LINE

z Procédure de package fournie par Oracle


z 2e méthode d’affichage
VARIABLE v_result NUMBER
SET SERVEROUTPUT ON
----
SET SERVEROUTPUT OFF
DECLARE
v_result NUMBER(9,2) := 150000 ;
BEGIN
v_result := v_result/30 ;
DBMS_OUTPUT.PUT_LINE(‘Le résultat est
‘|| TO_CHAR(v_result));
END ;
/
----
PRINT v_result ;
30
(c) 2006, KROS, nextStep Technologies

<Course name> <Lesson number>-10


Variables de substitution
z Utilisées dans le passage d’argument à un bloc ou à un script
PL/SQL
z Utiliser la fonction DEFINE pour les initialiser !
z Utiliser & pour les réferencer
z Utiliser DEFINE pour les afficher !
DEFINE p_id = 144 ;
VARIABLE RESULTAT NUMBER ;
-----
BEGIN
SET VERIFY OFF
SELECT (salary*12)
SET VERIFY ON
INTO :RESULTAT
WHERE employee_id = &p_id ;
END ;
/
DEFINE p_id
PRINT RESULTAT 31
(c) 2006, KROS, nextStep Technologies

Synthèse
Ce chapitre vous a appris les règles suivantes :
z Les identificateurs PL/SQL
z Sont définis dans la section déclarative
z Peuvent être de type scalaire, composite, reférencé
ou LOB
z Peuvent être basés sur la structure d’une autre
variable ou d’un autre objet de BD
z Peuvent être initialisés
z Variables d’environnement externe = variables hôtes
z DBMS_OUTPUT.PUT_LINE permet…

32
(c) 2006, KROS, nextStep Technologies

Exercice 1
1. Evaluer chacune des expressions suivantes. Déterminer celles qui NE SONT PAS
valides et expliquer pourquoi
a. v_id1 NUMBER(4)
b. v_id2 NUMBER(4, 2)
c. v_x, v_y, v_z VARCHAR2(30)
d. v_birthdate DATE NOT NULL ;
e. v_in_stock BOOLEAN := 1 ;

2. Dans chacune des affectations suivantes, indiquez si l’instruction est valide et préciser
le type de données du résultat
a. v_date2 := v_date1 + sysdate ;
b. v_truc = “Bonjour” || TO_CHAR(v_numero);
c. v_somme := 1000$ + 3.500$
d. v_machin := ‘TRUE’
e. v_n1 := v_n2 > (2*v_n3) ;

3. Créer un bloc PL/SQL qui affiche HELLO IT3. Enregistrer ce script sous et lancez le en
ligne de commande avec RUN !
- avec PRINT
- avec DBMS_OUTPUT
33
(c) 2006, KROS, nextStep Technologies

<Course name> <Lesson number>-11


Ecrire des instructions exécutables

2 34

Objectifs

A la fin de ce chapitre, vous pourrez:


z Comprendre l’utilité de la section exécutable
z Utiliser correctement les identificateurs
z Ecrire des instructions exécutables
z Décrire les règles des blocs imbriqués
z Exécuter et tester un bloc PL/SQL
z Utiliser les conventions de codage

35
(c) 2006, KROS, nextStep Technologies

Syntaxe et remarques

z Barre / permet d’exécuter les blocs PL/SQL


z Les instructions des blocs PL/SQL peuvent
s’étendre sur plusieurs lignes
z Les unités lexicales se répartissent comme suit :
z Délimiteurs (symboles simples et composés)
z Identificateurs (incluent les mots réservés)
z Littéraux
z Commentaires
ƒ Séparer les unités lexicales par des espaces
ƒ Ne pas scinder les mots clés !
ƒ Mettre les littéraux entre apostrophes
36
(c) 2006, KROS, nextStep Technologies

<Course name> <Lesson number>-12


Délimiteurs PL/SQL

z SYMBOLES SIMPLES : +, -, *, /, =, @, ;

z SYMBOLS COMPOSES : <>, !=, ||, --, /*, */, :=

Les mots réservés ne peuvent pas être utilisés


comme identificateurs, à moins de les mettre entre
guillemets (exemple "SELECT")

37
(c) 2006, KROS, nextStep Technologies

Identificateurs PL/SQL

z Jusqu’à 30 caractères
z Doivent commencer par valeur alphabétique
z Peuvent contenur des valeurs numériques, des
traits de soulignement, des signes $ et #
z Ne doivent pas contenir de traits d’unions, de
barres obliques ni d’espaces

Exemples valides : money$$$tree__, SN#, try_again


Exemples non valides : r&b, debit-credit, on/off, user id

38
(c) 2006, KROS, nextStep Technologies

Commentez votre code !

z Faire précéder les commentaires monolignes de


deux tirets (--)
z Placer les commentaires multilignes entre les
symboles /* et */

39
(c) 2006, KROS, nextStep Technologies

<Course name> <Lesson number>-13


Fonctions SQL en PL/SQL
z Disponibles
z Fonctions monolignes
z Numériques
z De type caractère
z Fonctions de conversion de type de données
z Fonctions de dates
z Fonctions d’horodatage
z Non-disponibles
z Fonction DECODE
z Fonctions de groupe

40
(c) 2006, KROS, nextStep Technologies

Fonctions de conversion
z Convertir des données en types de données
comparables
z Mélanger les types de données peut provoquer
des erreurs ou nuire aux performances
z Fonctions de conversion :
z TO_CHAR(value, fmt)
z TO_DATE(value, fmt)
z TO_NUMBER(value, fmt)

Exemples :
-v_date1 = TO_CHAR(sysdate, ‘DD/MM/YYYY’);
- v_date2 = ‘8 Mars 2006’;
41
(c) 2006, KROS, nextStep Technologies

Blocs imbriqués – Portée des variables

z Les blocs PL/SQL peuvent être imbriqués,


même dans le traitement des exceptions
z Tout bloc imbriqué devient une instruction
z Portée d’un identificateur = région du
programme dans laquelle il peut être référencé
z 1 bloc peut réferencer le bloc englobant
z 1 bloc ne peut référencer les blocs qu’il
englobe

42
(c) 2006, KROS, nextStep Technologies

<Course name> <Lesson number>-14


Opérateurs en PL/SQL

z Idems en SQL
z Opérateur logique
z Opérateurs arithmétiques
z Opérateurs de concaténation

z Parenthèses de contrôle de l’ordre

z Opérateur exponentiel (**)

43
(c) 2006, KROS, nextStep Technologies

Conseils pour la programmation

z Commenter le code
z Utiliser les conventions typographiques ORACLE (convention de
nommage pour l’utilisation de la casse, les identificateurs et
autres objets
z Indenter le code
DECLARE
v_sal NUMBER(9,2); -- variable de récupération
BEGIN
-- Sélectionner le salaire de l’employé 144
-- dans ma variable v_sal
SELECT salary
INTO v_sal
WHERE employee_id = 144 ;
-- Voici la fin de mon bloc
END ;

44
(c) 2006, KROS, nextStep Technologies

Conventions typographiques

Convention Objet ou terme Exemple


Majuscules Commandes et SELECT last_name
fonctions FROM employees ;

Minuscules Variables CREATE ROLE role ;


v_salary
NUMBER(5,2);

Initiale en majuscule Déclencheurs Oracle When-Validate-Item


Forms
Minuscules Noms de colonne, SELECT last_name
noms de table, noms FROM employees ;
de fichiers, objets
PL/SQL

45
(c) 2006, KROS, nextStep Technologies

<Course name> <Lesson number>-15


Conventions typographiques (2)

Convention Catégorie Exemple


Majuscules Instruction SQL, types SELECT, INSERT,
de données NUMBER,

Majuscules Mots-clés PL/SQL, DECLARE, BEGIN, END ;

Minuscules Identificateurs et v_salary ; c_name


paramètres
Minuscules Noms de colonne, employees ; employee_id ;
noms de table, departments ; dept_no

46
(c) 2006, KROS, nextStep Technologies

Synthèse

Ce chapitre vous a appris les règles suivantes :


z Syntaxe et remarques sur les blocs PL/SQL
z Utilisation correcte des identificateurs
z Structure des blocs PL/SQL : imbrication des
blocs et portée des identificateurs
z Programmation en PL/SQL
z Fonctions
z Fonctions de conversion de types de données
z Opérateurs
z Conventions et remarques
z Exo-PLSQL2 47
(c) 2006, KROS, nextStep Technologies

Exercice 2
1. Créez et exécutez un bloc PL/SQL qui accepte deux valeurs numériques
via des variables de substitution SQL*PLUS. Sauvegarder ce script en tant que
script21.sql
Utilisez la commande DEFINE pour indiquer les deux valeurs
DEFINE p_num1 = 2
DEFINE p_num1 = 4
Transmettez au bloc PL/SQL, via les variables de substitution les deux valeurs
définies en a). Divisez la première valeur par la seconde, et ajouter cette dernière
au résultat qui doit être stocké dans une variable PL/SQL qui s’affiche à l’écran
Résultat attendu :
4.5
Procédure PL/SQL terminée avec succès.

2. Modifiez script21.sql pour obtenir le résultat suivant


(Enregistrer sous script22.sql):
Le résultat est : 4.5
Procédure PL/SQL terminée avec succès.

3. Modifiez script22.sql pour passer les deux valeurs en paramètre. L’appel du


script doit être de la forme START script22.sql valeur1 valeur2
48
(c) 2006, KROS, nextStep Technologies

<Course name> <Lesson number>-16


Interagir avec le serveur Oracle

3 49

Objectifs

A la fin de ce chapitre, vous pourrez:


z Ecrire une instruction SELECT correcte en
PL/SQL
z Ecrire des instructions LMD en PL/SQL
z Contrôler des transactions en PL/SQL
z Déterminer le résultat de l’exécution d’instructions
SQL LMD

50
(c) 2006, KROS, nextStep Technologies

Instructions SQL en PL/SQL

z Extraire des lignes de données à l’aide de


SELECT
z Utiliser des commandes LMD
z Contrôler les transactions à l’aide de COMMIT,
ROLLBACK, SAVEPOINT
z Exploiter des curseurs implicites

51
(c) 2006, KROS, nextStep Technologies

<Course name> <Lesson number>-17


Instructions SELECT en PL/SQL

SYNTAXE
SELECT select_list
INTO {variable_name[, variable_name]… |
record_name }
FROM table
[WHERE condition] ;

> La clause INTO est OBLIGATOIRE !


> Indiquer une variable pour chaque expression renvoyée
> Les interrogations doivent renvoyer UNE et UNE SEULE LIGNE !

52
(c) 2006, KROS, nextStep Technologies

Extraire des données (1)

z Exemple : Extraire la date d’embauche


et le salaire de l’employé N° 100 !
DECLARE
v_date_emb employees.hire_date%TYPE ;
v_salaire employees.salary%TYPE;
BEGIN
SELECT hire_date, salary
INTO v_date_emb, v_salaire
FROM employees
WHERE employee_id = 100 ;
END ;
/

53
(c) 2006, KROS, nextStep Technologies

Extraire des données (2)

z Exemple : Renvoyer la somme des


salaires des employés d’un service !
DECLARE
v_sum NUMBER(10,2);
v_dept_no NUMBER NOT NULL := 10 ;
BEGIN
SELECT SUM(salary)
INTO v_sum
FROM employees
WHERE department_id = v_dept_no;
DBMS_OUTPUT.PUT_LINE(‘Total des salaires =’ || TO_CHAR(v_sum));
END ;
/
54
(c) 2006, KROS, nextStep Technologies

<Course name> <Lesson number>-18


Manipuler des données

z INSERT : ajout de nouvelles lignes


z UPDATE : maj de lignes existantes
z DELETE : suppression de lignes
z MERGE : maj de lignes si existantes et
ajout dans le cas contraire*

MERGE Î Privilèges INSERT et UPDATE !

55
(c) 2006, KROS, nextStep Technologies

Insérer des données

z Ajouter un nouvel employé :


BEGIN

INSERT INTO employees(employee_id, first_name, last_name, email,


hire_date, job_id, salary)

VALUES(221,'KYEDREBEOGO', 'Roland Olivier', 'toto@yahoo.fr',


SYSDATE, 'IT_PROG', 1000) ;
END ;

Possibilités avec INSERT/ Dans un bloc PL/SQL :


-Utiliser des fonctions SQL (USER, SYSDATE, …)
-Générer des séquences (numérotation automatique)

56
(c) 2006, KROS, nextStep Technologies

Mettre à jour des données

z Augmenter de 1000 le salaire l’employé


que vous venez de créer
DECLARE
v_sal_new NUMBER := 1000;
BEGIN
UPDATE employees
SET salary = salary + v_sal_plus
WHERE employee_id = VOTRE_ID ;
END ;
/ SELECT last_name, salary
FROM hr.employees
WHERE employee_id = ID_DE_VOTRE_VOISIN ;

57
(c) 2006, KROS, nextStep Technologies

<Course name> <Lesson number>-19


Supprimer des données

z Supprimez-vous de la table employés !

BEGIN
DELETE FROM hr.employees
WHERE employee_id = VOTRE_ID ;
END ;
/

58
(c) 2006, KROS, nextStep Technologies

Fusionner des lignes : MERGE

z MERGE permet d’insérer ou de mettre à


jour des lignes dans une table, en
utilisant les données d’une autre.
z Exemple :
z Si copy_emp.employee_id =
employees.employee_id Alors Î MAJ
z Sinon Î Insertion
z Finsi

z Cf. Paper 3-15


59
(c) 2006, KROS, nextStep Technologies

Conventions d’appellation

z Éviter les ambiguïtés dans la clause


WHERE
z Noms des colonnes de BD <> Noms des
identificateurs
z Noms des variables locales prioritaires
sur noms des tables de la BD
z Noms des colonnes de BD prioritaires
sur noms des variables locales
60
(c) 2006, KROS, nextStep Technologies

<Course name> <Lesson number>-20


Conventions d’appellation 2)
Identificateur Convention Exemple
Variable v_name v_salary
Constante c_name c_emp_name
Curseur name_cursor emp_cursor
Exception e_name e_too_many
Type de table name_table_type total_table_type

Table name countries


Type d’enregistrement name_record_type emp_record_type
Enregistrement name_record dept_record
Variable de substitution p_name p_job_id
Variable hôte g_name g_year_sal
61
(c) 2006, KROS, nextStep Technologies

Notion de curseur SQL

z Zone de travail réservée à SQL


z 2 types :
z Curseur implicites : utilisés par le serveur
Oracle pour analyser et exécuter les
instructions SQL
z Curseur explicite : déclarés de manière
explicite par le programmeur
>> A chaque instruction SQL, le Serveur Oracle ouvre une zone de
Mémoire dans laquelle la commande est analysée et exécutée !
62
(c) 2006, KROS, nextStep Technologies

Attributs d’un curseur SQL


ATTRIBUT DEFINITION

SQL%ROWCOUNT Nombre de lignes affectées par la dernière


instruction SQL
SQL%FOUND Attribut booléen qui prend la valeur TRUE
si la dernière instruction SQL affecte une
ou plusieurs lignes
SQL%NOTFOUND Attribut booléen qui prend la valeur TRUE
si la dernière instruction SQL n’affecte
aucune ligne
SQL%ISOPEN Prend toujours la valeur FALSE car
PL/SQL ferme les curseurs implicites
immédiatement après leur exécution
Attributs valides UNIQUEMENT dans PL/SQL et non SQL ! 63
(c) 2006, KROS, nextStep Technologies

<Course name> <Lesson number>-21


Attributs de curseur - Exemple

z Supprimer les lignes possédant l’ID


indiqué et renvoyer le nombre de lignes
VARIABLE v_msg_suppr VARCHAR2(30);
---
DECLARE
v_employee_id employees.employe_id%TYPE := 176;
BEGIN
DELETE FROM employees
WHERE employee_id = v_employee_id;
:v_msg_suppr := (SQL%ROWCOUNT || ‘ lignes supprimées !’);
END ;
/
PRINT v_msg_suppr ;

64
(c) 2006, KROS, nextStep Technologies

Gestion des transactions

z Transaction : commence à la première


commande qui suit COMMIT ou
ROLLBACK et s’achève à la prochaine
commande COMMIT ou ROLLBACK
correctement exécutée !
z Pour définir des points intermédiaires,
utiliser SAVEPOINT

65
(c) 2006, KROS, nextStep Technologies

Synthèse

Ce chapitre vous a permis de savoir


z Intégrer du code SQL dans un bloc
PL/SQL
z Intégrer des instructions de gestion des
transactions
z Les fonctions des 2 types de curseur
z Les attributs des curseurs implicites
z Exo-PLSQL3
66
(c) 2006, KROS, nextStep Technologies

<Course name> <Lesson number>-22


Exercice 3
1.Créez un bloc PL/SQL qui sélectionne dans la table DEPARTMENTS le plus grand numéro de
service et le stocke dans une variable SQL*Plus et l’affiche. Enregistrez ce script sous
script31.sql

2. Modifiez script31.sql pour insérer un nouveau département dans la table DEPARTMENTS


en utilisant la commande DEFINE pour définir son nom. Ajoutez 10 à la valeur maximale
trouvée dans script31.sql et affectez cette valeur comme numéro de service de votre
département. Affichez le numéro et le nom de votre nouveau département. Enregistrez ce
script sous script32.sql

3. Modifiez script32.sql pour mettre à jour le numéro de location du nouveau département.


Utilisez la commande DEFINE pour définir le nouveau numéro. Consultez les valeurs
distinctes des locations disponibles pour respecter les contraintes. Affichez le numéro, le
nom et la location de votre département. Enregistrez ce script sous script33.sql

4. Modifiez script33.sql pour supprimer le département que vous venez de créer.


Enregistrez ce script sous script34.sql. Utilisez la commande DEFINE pour passer son
numéro en argument et affichez à l’écran le message suivant : Département(s) que j’ai
supprimé(s) : 1
67
(c) 2006, KROS, nextStep Technologies

Ecrire des structures de contrôle

4 68

Objectifs

A la fin de ce chapitre, vous pourrez:


z Identifier les types de structure de contrôle et leurs
utilisations
z Ecrire une instruction IF
z Utiliser des expressions CASE
z Ecrire et identifier les types d’instructions LOOP
z Utiliser des tables logiques

69
(c) 2006, KROS, nextStep Technologies

<Course name> <Lesson number>-23


Flux d’exécution PL/SQL

z Utiliser des instructions conditionnelles


z IF – THEN – END IF
z IF – THEN – ELSE - END IF
z IF – THEN – ELSIF - END IF

z Et des structures de contrôle LOOP

70
(c) 2006, KROS, nextStep Technologies

Instructions IF
IF condition THEN
instructions ; IF SIMPLES

[ELSIF condition THEN …

instructions; ] IF v_ename = ‘TOTO’ THEN


v_salary := 1000 ;
[ELSE
END IF ;
instructions; ]

END IF ;
IF COMPOSES

IF v_ename = ‘TOTO’ AND v_salary < 1000 THEN
v_salary := 1000 ;
END IF ;
….

71
(c) 2006, KROS, nextStep Technologies

Flux d’exécution IF-THEN-ELSE

TRUE FALSE
IF condition

THEN actions ELSE actions


(incluant d’autres IF) (incluant d’autres IF)

72
(c) 2006, KROS, nextStep Technologies

<Course name> <Lesson number>-24


Flux d’exécution IF-THEN-ELSIF

IF condition
NOT TRUE
TRUE

THEN ELSIF condition


actions TRUE NOT TRUE

THEN ELSE
actions actions

73
(c) 2006, KROS, nextStep Technologies

Remarques sur ELSIF

z Utiliser ELSIF autant que faire se peut :


z Pour éviter les instructions IF imbriquées
z Pour rendre votre code plus facile à lire et
sa structure plus claire
z Si l’action associée à ELSE consiste en une
autre instruction IF
z Pour éviter les nombreux END IF imbriqués

74
(c) 2006, KROS, nextStep Technologies

Expression CASE
> CASE sélectionner un résultat et le renvoie

> Effectue un choix parmi plusieurs possibilités

CASE selecteur
WHEN expression 1 THEN result1
WHEN expression 2 THEN result2

WHEN expression N THEN resultN
[ELSE resultN+1;]
END;

75
(c) 2006, KROS, nextStep Technologies

<Course name> <Lesson number>-25


Exemple d’utilisation de CASE
DECLARE
v_moyenne NUMBER(2,2) := &p_moyenne ;
v_mention VARCHAR2(20);
BEGIN
-- Afficher la mention d’un étudiant
IF v_moyenne >= 10 THEN
v_mention :=
CASE v_moyenne
WHEN < 12 THEN ‘Passable’
WHEN < 14 THEN ‘Assez bien’
WHEN < 16 THEN ‘Bien’
WHEN < 18 THEN ‘Très bien’
ELSE ‘Excellent’
END ;
DBMS_OUTPUT.PUT_LINE(‘La mention correspondante à une moyenne
de ‘ || v_moyenne || ‘ est : ‘ || v_mention );
END IF;
END;
76
(c) 2006, KROS, nextStep Technologies

Traitement des valeurs NULL

z Eviter les erreurs fréquentes avec NULL :


z Une comparaison simple impliquant NULL
renvoie NULL !
z NOT appliqué à NULL renvoie NULL !

z Dans une instruction de contrôle conditionnel,


si la condition est NULL, le bloc
correspondant n’est PAS EXECUTE !

Cf Paper 4-16 (Tables logiques) !


77
(c) 2006, KROS, nextStep Technologies

Tables logiques
AND TRUE FALSE NULL OR TRUE FALSE NULL

TRUE TRUE FALSE NULL TRUE TRUE TRUE TRUE

FALSE FALSE FALSE FALSE FALSE TRUE FALSE NULL

NULL NULL FALSE NULL NULL TRUE NULL NULL

NOT REMARQUES :
TRUE FALSE
FALSE est prioritaire dans une cond. AND
FALSE TRUE
TRUE est prioritaire dans une cond. OR
NULL NULL

78
(c) 2006, KROS, nextStep Technologies

<Course name> <Lesson number>-26


Contrôle d’itérations

z Boucle : permet l’exécution à plusieurs


reprises d’une instruction ou d’une
séquence d’instructions
z 3 types de boucles
z Boucle de base : LOOP
z Boucle FOR

z Boucle WHILE

79
(c) 2006, KROS, nextStep Technologies

Boucle de base : LOOP

LOOP -- délimiteur
instruction; -- instructions
….
EXIT [WHEN condition]; -- condition de sortie
END LOOP; -- délimiteur

Variable ou expression booléenne !

80
(c) 2006, KROS, nextStep Technologies

Boucle WHILE

WHILE condition LOOP Condition est évalué au début


de chaque itération !

statement1;
Utiliser la boucle WHILE pour répéter
statement2; des instructions TANT QU’UNE
CONDITION RENVOIE TRUE !
….
END LOOP ;

81
(c) 2006, KROS, nextStep Technologies

<Course name> <Lesson number>-27


Boucle FOR

FOR cpt IN [REVERSE] mincpt..maxcpt


statement1;
statement2;
….
END LOOP ;
-FOR simplifie le contrôle du nombre d’itérations

-La déclaration du compteur est IMPLICITE !

-PAY ATTENTION TO THE SYNTAX : mincpt..maxcpt !

-REVERSE indique que le compteur décroît à chaque itération !


82
(c) 2006, KROS, nextStep Technologies

Exemples d’utilisation

z Insérerla table de multiplication par 3


dans une table
z CREATE TABLE multiplication3
(
multipliant NUMBER(1),
compteur NUMBER(2),
resultat NUMBER(2)
);
83
(c) 2006, KROS, nextStep Technologies

Exemple avec LOOP


DECLARE
v_cpt NUMBER NOT NULL := 1 ;
BEGIN
LOOP
INSERT INTO multiplication3 VALUES (3,v_cpt, 3*v_cpt);
v_cpt := v_cpt + 1 ;
Résultat attendu :
EXIT WHEN v_cpt > 10 ;
3*1=3;
END LOOP ;
3*2=6;
END ;
….
/
3 * 10 = 30 ;

84
(c) 2006, KROS, nextStep Technologies

<Course name> <Lesson number>-28


Exemple avec WHILE
DECLARE
v_cpt NUMBER NOT NULL := 1 ;
BEGIN
WHILE v_cpt < 11 LOOP
INSERT INTO multiplication3 VALUES (3,v_cpt, 3*v_cpt);
v_cpt := v_cpt + 1 ;
Résultat attendu :
END LOOP ;
3*1=3;
END ;
3*2=6;
/
….
3 * 10 = 30 ;

85
(c) 2006, KROS, nextStep Technologies

Exemple avec FOR


BEGIN
FOR v_cpt IN 1 .. 10 LOOP
INSERT INTO multiplication3 VALUES (3,v_cpt, 3*v_cpt);
END LOOP ;
END ;
/
Résultat attendu :
3*1=3;
3*2=6;
….
3 * 10 = 30 ;

86
(c) 2006, KROS, nextStep Technologies

Remarques sur les boucles

z Utiliser la boucle LOOP lorsque ses


instructions doivent s’exécuter au moins
une (01) fois !
z Utiliser la boucle WHILE si la condition
doit être évaluée au début de chaque
itération
z Utiliser la boucle FOR si le nombre
d’itérations est connu
87
(c) 2006, KROS, nextStep Technologies

<Course name> <Lesson number>-29


Synthèse
Ce chapitre vous a permis de savoir :
z Modifier l’enchaînement logique en utilisant des
structures de contrôle
z Instructions conditionnelles IF

z Expressions CASE

z Boucles

z LOOP

z WHILE

z FOR

z Exo-PLSQL4

88
(c) 2006, KROS, nextStep Technologies

Exo-PLSQL-4 (1)
1. Créez un bloc PL/SQL qui calcule le montant de la commission d’un
employé donné, en fonction de son salaire
•UTILISEZ la fonction DEFINE pour fournir le numéro d’employé.
•Transmettez cette valeur au bloc PL/SQL à l’aide d’une variable de
substitution : DEFINE p_empno = 100
•Si le salaire de l’emloyé est inférieur à 5000$, affichez le montant de la
prime de l’employé, soit 10% du salaire.
•Si le salaire de l’employé est compris entre 5000$ et 10000$, affichez le
montant de la prime de l’employé, soit 15% du salaire.
•Si le salaire de l’employé est supérieur à 10000$, affichez le montant de la
prime de l’employé, soit 20% du salaire.
•Sil le salaire de l’employé a la valeur NULL, affichez la valeur 0 en tant que
montant de la prime de l’employé.
Testez votre bloc PL/SQL avec chacun des cas ci-dessous, et vérifiez le
montant de la prime !
Enregistrez ce script sous script41.sql et lancez-le à l’aide START :
START c:\script41.sql 100
START c:\script41.sql 144
89
(c) 2006, KROS, nextStep Technologies

Exo-PLSQL-4 (2)
2. A FAIRE : Créez un bloc PL/SQL qui récompense les employés en leur
attribuant un astérisque dans une colonne que vous appellerez STARS, par
tranche de salaire de 1000 $.
‰UTILISEZ la fonction DEFINE pour fournir le numéro d’employé.
‰Transmettez cette valeur au bloc PL/SQL à l’aide d’une variable de
substitution : DEFINE p_empno = 104
‰Si l’employée touche 8000$, vous afficherez 8 astérisques ; si l’employé
touche 11300$, vous afficherez 11 astérisques ; si l’emloyé touche 12600$, vous
afficherez 13 astérisques

Résultat attendu :
EMPLOYEE_ID SALARY STARS
104 6000 ******
174 11300 ***********
176 12600 *************

Enregistrez ce script sous script42.sql et lancez-le à l’aide START :


START c:\script41.sql 104 ou START c:\script41.sql 174
90
(c) 2006, KROS, nextStep Technologies

<Course name> <Lesson number>-30


Ecrire des curseurs explicites

5 91

Objectifs

A la fin de ce chapitre, vous pourrez:


z Faire la différence entre un curseur implicite et un
curseur explicite
z Savoir quand et pourquoi utiliser un curseur
explicite
z Utiliser une variable de type RECORD en PL/SQL
z Ecrire une boucle FOR de curseur

92
(c) 2006, KROS, nextStep Technologies

A propos des curseurs…


z Le serveur Oracle utilise des zones de travail
(curseurs) pour analyser et exécuter les
instructions SQL.
z Il est possible d’utiliser des curseurs PL/SQL
pour nommer ces zones et traiter les
informations qu’elles contiennent !
z On distingue les curseurs :
z Implicites : déclarés par le serveur Oracle pour
toute instruction LMD et PL/SQL
z Explicites : déclarés et nommés par les
développeurs d’applications
93
(c) 2006, KROS, nextStep Technologies

<Course name> <Lesson number>-31


Les curseurs explicites

z Fonction principale : Traiter


individuellement chaque ligne renvoyée
par une instruction SELECT multiligne

100 Dindon 3000


101 Poulet 1500
… … …
174 Canard 2500
CURSEUR
Lignes de la table

Ensemble actif
94
(c) 2006, KROS, nextStep Technologies

Contrôler les curseurs explicites

DECLARE
1
OPEN

2
NON
FETCH

1 Î Créer une zone SQL nommée 3


VIDE ?
2 Î Identifier l’ensemble actif
3 Î Charger la ligne en cours
4 Î Tester l’existence d’une autre ligne OUI 4
CLOSE
5 Î Libérer l’ensemble actif
5 95
(c) 2006, KROS, nextStep Technologies

Contrôler les curseurs explicites

z Utilisez les instructions :


z OPEN : exécute l’interrogation associée au
curseur, identifie l’ensemble actif et positionne le
curseur sur la PREMIERE LIGNE
z FETCH : extrait la ligne en cours et place le curseur
sur la ligne suivante jusqu’à ce qu’il n y ait plus de
lignes ou que la condition définie soit remplie
z CLOSE : fermer le curseur lorsque la dernière ligne
a été traitée et désactive le curseur (Pour y faire de
nouveau référence, il faut à nouveau l’ouvrir)

96
(c) 2006, KROS, nextStep Technologies

<Course name> <Lesson number>-32


Déclarer un curseur

z Syntaxe : CURSOR nom_du_curseur IS


instruction_select
z Remarques :
z Ne pas inclure la clause INTO dans la
déclaration du curseur
z S’il existe un ordre précis de traitement des
lignes, utiliser la clause ORDER BY dans
l’interrogation

97
(c) 2006, KROS, nextStep Technologies

Exemple de déclaration
DECLARE
CURSOR emp_cursor IS
SELECT employee_id, last_name
FROM hr.employees ;
CURSOR dept_cursor IS
SELECT *
FROM hr.departments
WHERE location_id = 170 ;
BEGIN

END;
98
(c) 2006, KROS, nextStep Technologies

Ouvrir un curseur

z OPEN nom_du_curseur ;
z Ouvrir le curseur pour référencer l’ensemble
actif
z Si l’interrogation ne renvoie aucune ligne,
aucune exception n’est déclenchée
z Utiliser les attributs de curseurs pour tester
le résultat après une extraction.

99
(c) 2006, KROS, nextStep Technologies

<Course name> <Lesson number>-33


Extraire les données du curseur

z Syntaxe : FETCH nom_du_curseur INTO [


variable1, variable2, …] | record_name ];
z Extraire les valeurs de la ligne en cours
et les placer dans des vriables
z Ajuster la position des variables par
rapport aux colonnes
z Vérifier si le curseur contient des lignes !

100
(c) 2006, KROS, nextStep Technologies

Exemple d’extraction de données


DECLARE
v_empno hr.employees.employee_id%TYPE ;
v_ename hr.employees.last_name%TYPE;
CURSOR emp_cursor IS
SELECT employee_id, last_name
FROM hr.employees ;
BEGIN
OPEN emp_cursor ;
FOR i IN 1..10 LOOP
FETCH emp_cursor INTO v_empno, v_ename ;
DBMS_OUTPUT.PUT_LINE(v_empno || ‘ - ‘ || v_ename);
END LOOP ;
END;

101
(c) 2006, KROS, nextStep Technologies

Fermer le curseur

z CLOSE nom_du_curseur ;
z Fermer le curseur après avoir terminé le
traitement des lignes
z L’ensemble actif n’est donc plus défini

z Rouvrir le curseur si nécessaire

z Ne pas essayer d’extraire les données d’un


curseur s’il a été fermé (exception
INVALID_CURSOR)

102
(c) 2006, KROS, nextStep Technologies

<Course name> <Lesson number>-34


Remarques sur les curseurs

z Prendre l’habitude de fermer les


curseurs explicites ouverts, afin de
LIBERER les ressources
z La limite maximale du nombre de
curseurs ouverts est définie par le
paramètre OPEN_CURSORS (elle est
de 50 par défaut)

103
(c) 2006, KROS, nextStep Technologies

Attributs d’un curseur explicite


Attribut Type Description

%ISOPEN Booléen TRUE si le curseur est ouvert

%NOTFOUND Booléen TRUE si la dernière extraction ne


renvoie aucune ligne

%FOUND Booléen TRUE si la dernière extraction


renvoie une ligne

%ROWCOUNT Nombre Nombre total de lignes renvoyées


jusqu’à présent
104
(c) 2006, KROS, nextStep Technologies

Utilisation des attributs de curseur

z Utiliser %ISOPEN pour vérifier qu’un


curseur est déjà ouvert
z Utiliser %ROWCOUNT pour extraire un
nombre exact de lignes
z Utiliser %NOTFOUND pour déterminer
les conditions de sortie de la boucle

105
(c) 2006, KROS, nextStep Technologies

<Course name> <Lesson number>-35


Exemples d’utilisation
LOOP
FETCH c1 INTO my_name, my_salary
EXIT WHEN c1%NOTFOUND ;
….
END LOOP ;

LOOP
FETCH c1 INTO my_name, my_salary
IF c1%ROWCOUNT > 10 THEN
……
END IF;
….
END LOOP ;

Remarque : Référencer un curseur fermé avec %ROWCOUNT déclenche l’exception


INVALID_CURSOR 106
(c) 2006, KROS, nextStep Technologies

Synthèse
Ce chapitre vous a permis de savoir
z Différencier les types de curseurs :
z Curseurs implicites : LMD et interrogations
monolignes
z Curseurs explicites : interrogations portant sur
ZERO, UNE ou PLUSIEURS lignes
z Manipuler les curseurs explicites
z Evaluer l’état du curseur en utilisant des attributs de
curseur
z Utiliser les boucles FOR de curseur
z Exo-PLSQL5
107
(c) 2006, KROS, nextStep Technologies

Traiter les Exceptions

6 108

<Course name> <Lesson number>-36


Objectifs
A la fin de ce chapitre, vous pourrez:
z Définir des exceptions PL/SQL
z Reconnaître les exceptions non traitées
z Lister et utiliser les différents types de
traitement des exceptions PL/SQL
z Intercepter les erreurs non prédéfinies
z Décrire l’effet de la propagation des
exceptions
z Personnaliser les messages d’erreur
109
(c) 2006, KROS, nextStep Technologies

Exceptions en PL/SQL

z Une exception désigne un identificateur


détecté durant l’exécution d’un bloc
z Elle est déclenchée :
z A la suite d’une erreur Oracle
z Explicitement par le programmeur

z Elle est traitée :


z En l’interceptant avec le gestionnaire
z En la propageant à l’environnement appelant
110
(c) 2006, KROS, nextStep Technologies

Exemple d’exception

z Lorsque l’instruction SELECT n’extrait


aucune ligne de la BD, l’erreur ORA-
01403 survient, et l’exception
NO_DATA_FOUND est déclenchée par
PL/SQL.
z Vous pouvez déclencher explicitement
une exception en utilisant l’instruction
RAISE dans le bloc !
111
(c) 2006, KROS, nextStep Technologies

<Course name> <Lesson number>-37


Traiter les exceptions

z Intercepter l’exception :
z Déclenchement de l’exception
z Branchement sur le gestionnaire d’exceptions dans
la section EXCEPTION
z 2 cas de figure se présentent :
z Si Exception traitée par PL/SQL Alors
Exécution normale du bloc
z Sinon
-- Absence de gestionnaire approprié
Exception propagée dans l’environnement appelant
z Finsi
112
(c) 2006, KROS, nextStep Technologies

Types d’exception

Exception Description Que faire ?


Erreur prédéfinie du Une des 20 erreurs les Ne pas déclarer ces
Serveur Oracle plus fréquentes en PL/SQL exceptions, mais autoriser
le serveur Oracle à les
déclencher implicitement
Erreur non prédéfinie du Toute autre erreur Déclarer ces exceptions
Serveur Oracle standard du serveur dans la section déclarative
Oracle et autoriser le serveur
Oracle à les déclencher
implicitement
Erreur définie par le Condition anormale définie Déclarer ces exceptions
programmeur par le développeur dans la section déclarative
et déclenchez-les
explicitement

113
(c) 2006, KROS, nextStep Technologies

Intercepter les exceptions


EXCEPTION
WHEN exception1 [or exception2…] THEN
instruction 1 ;
instruction 2 ; …
[ WHEN exception3 [or exception4…] THEN
instruction 3 ;
instruction 4 ; …]
[ WHEN OTHERS THEN
instruction 1 ;
instruction 2 ; …]
114
(c) 2006, KROS, nextStep Technologies

<Course name> <Lesson number>-38


Règles d’interception

z Le mot clé EXCEPTION débute la


section de traitement des exceptions
z Plusieurs gestionnaires d’exception sont
permis
z Un seul gestionnaire est exécuté avant
la sortie du bloc
z WHEN OTHERS est la dernière clause

115
(c) 2006, KROS, nextStep Technologies

Interception : Erreur prédéfinie

z Utiliser le nom standard à l’intérieur du sous-


programme de traitement des exceptions des
20 erreurs les plus fréquentes
z Exemples :
z NO_DATE_FOUND
z TOO_MANY_ROWS
z INVALID_CURSOR
z ZERO_DIVIDE
Paper-PLSQL-Exceptions
z DUP_VAL_ON_INDEX

116
(c) 2006, KROS, nextStep Technologies

Interception : Erreur non prédéfinie

z La déclarer ou utiliser WHEN OTHERS


z Lorsqu’elle est déclarée, elle se
déclenche implicitement
z Utiliser la clause PRAGMA
EXCEPTION_INIT qui indique au
compilateur d’associer un nom
d’exception à un code d’erreur !

117
(c) 2006, KROS, nextStep Technologies

<Course name> <Lesson number>-39


Exemple de traitement
DEFINE p_deptno = 10
-- -
DECLARE
e_emp EXCEPTION ;
PRAGMA EXCEPTION_INIT (e_emp, -2292);
BEGIN
DELETE FROM departments
WHERE department_id = &p_deptno ;
COMMIT ;
EXCEPTION
WHEN e_emp THEN
DBMS_OUTPUT.PUT_LINE(‘Impossible de supprimer le dépt
’||&p_deptno || ‘. Des employés existent !’);
END;

118
(c) 2006, KROS, nextStep Technologies

Fonctions d’interception

z SQLCODE : renvoie la valeur numérique


du code d’erreur
z SQLERRM : renvoie le message associé
au code d’erreur
z Exemples de valeurs SQLCODE
z 0 Î Aucune exception détectée
z 1 Î Exception définie par l’utilisateur
z +100 Î Exception NO_DATA_FOUND
z Nombre négatif : autre code d’erreur !
119
(c) 2006, KROS, nextStep Technologies

Exemple d’utilisation - Fonctions


DECLARE
v_error_code NUMBER ;
v_error_message VARCHAR2(255);
BEGIN

EXCEPTION
WHEN OTHERS THEN
ROLLBACK ;
v_error_code := SQLCODE ;
v_error_message := SQLERRM ;
INSERT INTO mes_erreurs VALUES(v_error_code, v_error_message);
END;
120
(c) 2006, KROS, nextStep Technologies

<Course name> <Lesson number>-40


Interception : Exception Utilisateur

z La déclarer dans la section déclarative :


mon_exception EXCEPTION ;
z Utiliser l’instruction RAISE pour
déclencher explicitement l’exception
dans la section exécutable :
RAISE mon_exception ;
z Faites référence à l’exception déclarée
dans le sous-programme correspondant
de traitement des exceptions !
121
(c) 2006, KROS, nextStep Technologies

Exemple
DEFINE p_dept_name = ‘Informatique de Gestion’
DEFINE p_id = 124500001459
---
DECLARE
e_department_invalide EXCEPTION ;
BEGIN
UPDATE departements
SET department_name = ‘&p_dept_name’
WHERE department_id = &p_dept_id ;
IF SQL%NOTFOUND THEN
RAISE e_employee_invalide ;
END IF;
COMMIT ;
EXCEPTION
WHEN e_department_invalide THEN
DBMS_OUTPUT.PUT_LINE(‘ Aucun département n’’a cet ID !’);
122
END;
(c) 2006, KROS, nextStep Technologies

RAISE_APPLICATION_ERROR

z Procédure permettant de délivrer des messages


définis par l’utilisateur à partir de sous-
programmes stockés
z Permet de signaler les erreurs à l’application et
d’éviter le renvoi d’exceptions non traitées.
z Peut être utilisé dans la section exécutable ou
dans la section de traitement des exceptions
z Renvoie à l’utilisateur les conditions de l’erreur
de manière cohérente par rapport aux autres
erreurs du serveur Oracle !
123
(c) 2006, KROS, nextStep Technologies

<Course name> <Lesson number>-41


Syntaxe

z Syntaxe :
raise_application_error(error_number,
message [, {TRUE | FALSE }]);
z error_number : valeur numérique définie par
l’utilisateur (entre -20000 et -20999)
z message : message défini pour l’exception

z TRUE | FALSE : si True, l’erreur est rangée


dans la pile des erreurs précédentes !

124
(c) 2006, KROS, nextStep Technologies

Exemples

BEGIN

DELETE FROM hr.employees
WHERE manager_id = v_manager_id ;
IF SQL%NOTFOUND THEN
RAISE_APPLICATION_ERROR (-20202, ‘Id de manager invalide !’) ;
END IF;

END;


EXCEPTION
WHEN NO_DATA_FOUND THEN
RAISE_APPLICATION_ERROR (-20202, ‘Id de manager invalide !’) ;
END;

125
(c) 2006, KROS, nextStep Technologies

Synthèse
Ce chapitre vous a permis de savoir
z Reconnaître les <> types d’exception
z Erreur prédéfinie du serveur Oracle

z Erreur non prédéfinie du serveur Oracle

z Erreur définie par l’utilisateur

z Intercepter une exception


z Traiter une exception
z Intercepter l’exception dans le bloc PL/SQL
z Propager l’exception
z Exercice : Exo-8-25-26
126
(c) 2006, KROS, nextStep Technologies

<Course name> <Lesson number>-42


Exercice 6
Créez un bloc PL/SQL qui affiche le nombre d’employés qui gagnent 100 $ de plus ou de
moins que le montant du salaire défini par une variable de substitution SQL*Plus.
UTILISEZ la fonction DEFINE pour fournir le salaire
Transmettez cette valeur au bloc PL/SQL à l’aide d’une variable de substitution : DEFINE
p_salaire = 6000
1. S’il n’existe pas d’employés dans cette tranche de salaire, affichez un message à
l’utilisateur à l’aide d’une exception.
2. S’il existe au moins un employé dans cette tranche de salaire, le message doit indiquer le
nombre d’employé(s).
3. Traitez toutes les autres exceptions à l’aide d’un gestionnaire approprié. Le message doit
indiquer quel type d’erreur est survenu

Valeurs d’exécution
DEFINE p_salaire = 7000
DEFINE p_salaire = 150000

Résultat attendu :
Il y a 4 employés ayant un salaire compris entre 6900 et 7100 !
Il n’y a pas employés ayant un salaire compris entre 1499000 et 150100 !
Enregistrez ce script sous script61.sql et lancez-le à l’aide START :
START c:\script41.sql 7000
START c:\script41.sql 2500
127
(c) 2006, KROS, nextStep Technologies

Compléments

> Procédures et fonctions PL/SQL


> Trucs et astuces

128

Credits - Sources
Sources
www.oracle.com
www.labo-oracle.com

© 2006 - Roland Olivier KYEDREBEOGO, Oracle 9i Certified Professionnal


nextStep technologies
Email : roland.kyedrebeogo@gmail.com
Dernière mise à jour le 25 mars 2006

129

<Course name> <Lesson number>-43


Annexes

130

<Course name> <Lesson number>-44