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
0. Présentation du langage PL/SQL 1. Déclarer des variables 2. Ecrire des instructions exécutables 3. Interagir avec le serveur ORACLE 4. Ecrire des structures de contrôle 5. Ecrire des curseurs explicites 6. Traiter les exceptions Compléments
2
(c) 2006, KROS, nextStep Technologies

Présentation de PL/SQL

0
3

Objectifs
A la fin de ce chapitre, vous pourrez: Décrire la finalité du Langage PL/SQL Décrire l’utilisation du LPL pour le développeur d’applications et l’administrateur de bases de données Présenter les avantages liés à l’utilisation du LPL/SQL

4
(c) 2006, KROS, nextStep Technologies

Environnement PL/SQL

Moteur PL/SQL Bloc PL/SQL Bloc PL/SQL

PL/SQL

Prog. d’exécution des instructions procédurales

SQL Programme d’exécution des instructions SQL Serveur ORACLE 5
(c) 2006, KROS, nextStep Technologies

Avantages de PL/SQL
INTEGRATION
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) Les applications utilisent des bibliothèques partagées accessibles localement ou à distance Types de données SQL utilisables 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

Avantages de PL/SQL
AMELIORATION DES PERFORMANCES
Envoi des instructions SQL au serveur Oracle en un seul appel réduction du traffic réseau Sans PL/SQL les instructions SQ sont envoyées une à une au serveur 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 … END ;

MODULARITE PORTABILITE DECLARATION DE VARIABLES STRUCTURES DE CONTROLES TRAITEMENT DES EXCEPTIONS

8
(c) 2006, KROS, nextStep Technologies

Avantages de PL/SQL
SQL Application SQL AUTRES SGBD

Application

SQL IF…THEN SQL ELSE SQL END IF; SQL

Oracle et PL/SQL

9
(c) 2006, KROS, nextStep Technologies

Synthèse
Le langage PL/SQL est une extension du langage SQL Les blocs de code PL/SQL sont transmis à un moteur PL/SQL et sont traités par celui-ci Avantages liés à l’utilisation de PL/SQL :
Intégration Modularité Portabilité 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: Reconnaître un bloc PL/SQL de base et ses différentes sections Décrire la signification des variables en PL/SQL Déclarer des variables PL/SQL Exécuter un bloc PL/SQL

12
(c) 2006, KROS, nextStep Technologies

Structure d’un bloc PL/SQL DECLARE (facultatif) User defined variables. BEGIN …. nextStep Technologies . packages appropriés pour la résolution 15 (c) 2006. KROS. sous-programmes. CONSEIL : Clarté et facilité d’édition de vos programmes une instruction par ligne ! MODULARITE : Aller du simple au compliqué créer les blocs. exceptions BEGIN (obligatoire) SQL Statements PL/SQL Statements EXCEPTION (facultatif) What to do on when errors occur END . 14 (c) 2006. 13 (c) 2006. KROS. DECLARE …. PL/SQL) Procedure PL/SQL exécutée avec succès ! DECLARE. nextStep Technologies Exécuter des blocs PL/SQL Un point-virgule (. EXCEPTION … END . END est suivi de .) à la fin d’une instruction (SQL. nextStep Technologies Exécuter des blocs PL/SQL DECLARE v_variable VARCHAR2(5). EXCEPTION WHEN exception_name THEN … END . BEGIN SELECT column_name INTO v_variable FROM table_name . KROS. EXCEPTION … END . BEGIN …. (obligatoire) DECLARE …. BEGIN et EXCEPTION ne sont pas suivis de . cursors.

KROS. [EXCEPTION] … END . [EXCEPTION] … END . Fonction . Func. nextStep Technologies 18 .Types de blocs PL/SQL [DECLARE] …. Procédure -Applicative -Stockée FUNCTION name RETURN datatype IS …. Func. SERVEUR Anonymous Proc.Stockée (c) 2006.section déclarative Affectation de valeurs – section exécutable Transmission aux blocs – paramètres (IN. KROS.Applicative 16 . nextStep Technologies Structures de programme OUTILS Anonymous Proc. Applicatives Packages applicatifs Déclencheurs applicatifs Types d’objet DECLARE …. IN OUT) Affichage – variables de sortie PROCESSING (c) 2006. Anonyme PROCEDURE name IS …. BEGIN …. nextStep Technologies Using & processing variables Stockage temporaire de données Manipulation de valeurs stockées Possibilité de réutilisation Facilité de maintenance (%TYPE) USING Déclaration . RETURN value . [EXCEPTION] … END . EXCEPTION … END . OUT. BEGIN …. KROS. BEGIN …. BEGIN …. Stockées Packages Stockés Déclencheurs de base de données Types d’objet 17 (c) 2006.

KROS. NUMBER(2) NOT NULL := 4 . nextStep Technologies Déclaration de variables . KROS. VARCHAR2(13) := ‘IT30506’.Règles Suivre les conventions d’appellation Initialiser les variables NOT NULL et CONSTANT Déclarer 1 identificateur par ligne Initialiser les identificateurs Deux variables peuvent porter le même nom si dans deux blocs distincts Nom de variable <> Nom des colonnes des tables utilisées dans le bloc. spéciaux 20 (c) 2006. DECLARE v_hiredate v_deptno v_location c_comm DATE := ’04/03/2006’. Premier caractère UNE LETTRE suivie de lettres. nextStep Technologies Types de variables Variables PL/SQL Scalaires : reçoivent une valeur unique Composites : manipulent des groupes de champs Référencées : pointeurs (NON TRAITEES) LOB (Large Object) : pointeurs indiquant l’emplacement des objets volumineux stockés à l’extérieur des tables (cf. 19 (c) 2006.Déclaration de variables identifier [CONSTANT] datatype [NOT NULL] [:= | DEFAULT expression ]. CONSTANT NUMBER := 336 . KROS. nextStep Technologies . Adopter la convention v_% Longueur max = 30 . nombres ou car. chapitre dédié) Variables NON PL/SQL Variables déclarées dans les précompilateurs Champs d’écran des formulaires Variables hôtes iSQL*Plus 21 (c) 2006.

Paper-PLSQL-1-18-21 23 (c) 2006. nextStep Technologies Attribut %TYPE Déclarer une variable dont le type se base : Sur celui d’une colonne de table de la BD Sur celui d’une autre variable précédemment déclarée Faire précéder %TYPE Des noms de la table et de la colonne concernées Du nom de la variable précédente QUEL PEUT ËTRE L’INTERET DE %TYPE ? 24 (c) 2006. Paper-PLSQL-1-18-21 22 (c) 2006. KROS. nextStep Technologies Types de données scalaires Types de données scalaires de base : DATE TIMESTAMP Date + A+M+J+H+M+S TIMESTAMP WITH TIME ZONE TIMESTAMP + décalage horaire TIMESTAMP WITH LOCAL TIME ZONE INTERVAL YEAR TO MONTH INTERVAL DAY TO SECOND > Cf.Types de données scalaires Stockent une seule valeur Numériques. KROS. KROS. Caractères. Dates et Booléens Types de données scalaires de base : CHAR [ (max_length)] Longueur par défaut = 1 VARCHAR2 (max_length) LONG LONG RAW : données binaires (pas interprété par PL) NUMBER [ (precision. scale) ] BINARY_INTEGER PLS_INTEGER BOOLEAN > Cf. nextStep Technologies .

DECLARE v_name v_bidon1 v_bidon2 employees. nextStep Technologies .last_name%TYPE.Column_name%TYPE . OR et NOT Variables renvoient TOUJOURS TRUE. KROS. nextStep Technologies Déclarer des variables booléennes Attributs autorisés : TRUE. NUMBER(5. 25 (c) 2006.Déclarer des variables avec %TYPE identifier Table. FALSE ou NULL Des expressions peuvent être utilisées 26 (c) 2006. v_bidon1%TYPE := 10 . nextStep Technologies Types de données composites Encore appelées Collections Possèdent des composants internes pouvant être manipulés individuellement TABLE : Réferencer des collections comme objet unique RECORD : Données liéés mais dissemblables NESTED TABLES et VARRAY (Cf. KROS.3) . KROS. NULL Variables comparées avec AND. FALSE. Advanced PL/SQL) 27 (c) 2006.

DBMS_OUTPUT. KROS. à l’extérieur de la BD NCLOB : NLS Character LOB : grands blocs de données Unicode NCHAR à simple ou multiple octets de longueur fixe dans la BD. / ---PRINT v_result . nextStep Technologies . nextStep Technologies 28 Variables attachées (bind) Variables NON PL/SQL déclarées HORS DU BLOC Utiliser la fonction VARIABLE pour les initialiser ! Utiliser : pour les réferencer Utiliser PRINT pour les afficher ! VARIABLE RESULTAT NUMBER .2) := 150000 . KROS. nextStep Technologies DMBS_OUTPUT. / PRINT RESULTAT ? 29 (c) 2006.PUT_LINE Procédure de package fournie par Oracle 2e méthode d’affichage VARIABLE v_result NUMBER ---DECLARE v_result NUMBER(9. KROS. BEGIN v_result := v_result/30 .Variables de type LOB Stockage de blocs de données non structurés dont la taille peut atteindre 4 Go CLOB : Character LOB : grands blocs de caractères à simple octet dans la BD. END . à l’intérieur ou en dehors de la ligne de la table BFILE : Binary File : Objets binaires volumineux dans les fichiers de l’OS. END .PUT_LINE(‘Le résultat est ‘|| TO_CHAR(v_result)). ----BEGIN SELECT (salary*12) INTO :RESULTAT WHERE employee_id = 144 . à l’intérieur ou à l’extérieur ou en dehors de la ligne de la table (c) 2006. à l’intérieur ou à l’extérieur de la ligne de la table BLOB : Binary LOB : Objets binaires volumineux dans la BD. SET SERVEROUTPUT ON SET SERVEROUTPUT OFF 30 (c) 2006.

Evaluer chacune des expressions suivantes.PUT_LINE permet… 32 (c) 2006. Déterminer celles qui NE SONT PAS valides et expliquer pourquoi a. nextStep Technologies . nextStep Technologies Exercice 1 1. KROS. v_date2 := v_date1 + sysdate . nextStep Technologies SET VERIFY OFF SET VERIFY ON 31 Synthèse Ce chapitre vous a appris les règles suivantes : Les identificateurs PL/SQL Sont définis dans la section déclarative Peuvent être de type scalaire. v_in_stock BOOLEAN := 1 . VARIABLE RESULTAT NUMBER . v_id2 NUMBER(4. v_somme := 1000$ + 3. v_birthdate DATE NOT NULL .avec PRINT . 2. v_y. / DEFINE p_id PRINT RESULTAT (c) 2006. 2) c.Variables de substitution Utilisées dans le passage d’argument à un bloc ou à un script PL/SQL Utiliser la fonction DEFINE pour les initialiser ! Utiliser & pour les réferencer Utiliser DEFINE pour les afficher ! DEFINE p_id = 144 . v_n1 := v_n2 > (2*v_n3) . indiquez si l’instruction est valide et préciser le type de données du résultat a. Dans chacune des affectations suivantes.500$ d.avec DBMS_OUTPUT 33 (c) 2006. v_x. KROS. Enregistrer ce script sous et lancez le en ligne de commande avec RUN ! . END . e. b. ----BEGIN SELECT (salary*12) INTO :RESULTAT WHERE employee_id = &p_id . 3. v_truc = “Bonjour” || TO_CHAR(v_numero). v_machin := ‘TRUE’ e. c. Créer un bloc PL/SQL qui affiche HELLO IT3. v_z VARCHAR2(30) d. v_id1 NUMBER(4) b. composite. reférencé ou LOB Peuvent être basés sur la structure d’une autre variable ou d’un autre objet de BD Peuvent être initialisés Variables d’environnement externe = variables hôtes DBMS_OUTPUT. KROS.

nextStep Technologies . nextStep Technologies Syntaxe et remarques Barre / permet d’exécuter les blocs PL/SQL Les instructions des blocs PL/SQL peuvent s’étendre sur plusieurs lignes Les unités lexicales se répartissent comme suit : Délimiteurs (symboles simples et composés) Identificateurs (incluent les mots réservés) Littéraux 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. vous pourrez: Comprendre l’utilité de la section exécutable Utiliser correctement les identificateurs Ecrire des instructions exécutables Décrire les règles des blocs imbriqués Exécuter et tester un bloc PL/SQL Utiliser les conventions de codage 35 (c) 2006. KROS.Ecrire des instructions exécutables 2 34 Objectifs A la fin de ce chapitre. KROS.

à moins de les mettre entre guillemets (exemple "SELECT") 37 (c) 2006. de barres obliques ni d’espaces Exemples valides : money$$$tree__. /*. KROS. on/off. try_again Exemples non valides : r&b. *. KROS. ||. des traits de soulignement. !=. nextStep Technologies . des signes $ et # Ne doivent pas contenir de traits d’unions. debit-credit. /. @. -. =. nextStep Technologies Identificateurs PL/SQL Jusqu’à 30 caractères Doivent commencer par valeur alphabétique Peuvent contenur des valeurs numériques. user id 38 (c) 2006. SYMBOLS COMPOSES : <>.Délimiteurs PL/SQL SYMBOLES SIMPLES : +. . nextStep Technologies Commentez votre code ! Faire précéder les commentaires monolignes de deux tirets (--) Placer les commentaires multilignes entre les symboles /* et */ 39 (c) 2006. --. */. KROS. SN#. := Les mots réservés ne peuvent pas être utilisés comme identificateurs.

(c) 2006. ‘DD/MM/YYYY’). nextStep Technologies 41 Blocs imbriqués – Portée des variables Les blocs PL/SQL peuvent être imbriqués. fmt) Exemples : -v_date1 = TO_CHAR(sysdate. même dans le traitement des exceptions Tout bloc imbriqué devient une instruction Portée d’un identificateur = région du programme dans laquelle il peut être référencé 1 bloc peut réferencer le bloc englobant 1 bloc ne peut référencer les blocs qu’il englobe 42 (c) 2006. KROS. . nextStep Technologies Fonctions de conversion Convertir des données en types de données comparables Mélanger les types de données peut provoquer des erreurs ou nuire aux performances Fonctions de conversion : TO_CHAR(value. KROS. nextStep Technologies . KROS.v_date2 = ‘8 Mars 2006’.Fonctions SQL en PL/SQL Disponibles Fonctions monolignes Numériques De type caractère Fonctions de conversion de type de données Fonctions de dates Fonctions d’horodatage Non-disponibles Fonction DECODE Fonctions de groupe 40 (c) 2006. fmt) TO_NUMBER(value. fmt) TO_DATE(value.

Minuscules Initiale en majuscule Minuscules Déclencheurs Oracle Forms Noms de colonne. noms de fichiers. KROS. KROS.Sélectionner le salaire de l’employé 144 -.2).Opérateurs en PL/SQL Idems en SQL Opérateur logique Opérateurs arithmétiques Opérateurs de concaténation Parenthèses de contrôle de l’ordre Opérateur exponentiel (**) 43 (c) 2006.variable de récupération BEGIN -. -. When-Validate-Item SELECT last_name FROM employees . les identificateurs et autres objets Indenter le code DECLARE v_sal NUMBER(9. nextStep Technologies . objets PL/SQL 45 (c) 2006. 44 (c) 2006.dans ma variable v_sal SELECT salary INTO v_sal WHERE employee_id = 144 . KROS.2). -. noms de table. nextStep Technologies Conseils pour la programmation Commenter le code Utiliser les conventions typographiques ORACLE (convention de nommage pour l’utilisation de la casse. nextStep Technologies Conventions typographiques Convention Majuscules Objet ou terme Commandes et fonctions Variables Exemple SELECT last_name FROM employees . v_salary NUMBER(5. CREATE ROLE role .Voici la fin de mon bloc END .

sql pour obtenir le résultat suivant (Enregistrer sous script22. employee_id .sql pour passer les deux valeurs en paramètre. v_salary . KROS.5 Procédure PL/SQL terminée avec succès. L’appel du script doit être de la forme START script22. dept_no 46 (c) 2006. BEGIN. nextStep Technologies Synthèse Ce chapitre vous a appris les règles suivantes : Syntaxe et remarques sur les blocs PL/SQL Utilisation correcte des identificateurs Structure des blocs PL/SQL : imbrication des blocs et portée des identificateurs Programmation en PL/SQL Fonctions Fonctions de conversion de types de données Opérateurs Conventions et remarques Exo-PLSQL2 (c) 2006. DECLARE. noms de table. nextStep Technologies 47 Exercice 2 1. Divisez la première valeur par la seconde.5 Procédure PL/SQL terminée avec succès. c_name employees .sql valeur1 valeur2 48 (c) 2006.sql): Le résultat est : 4. KROS. 3. KROS. departments . types de données Mots-clés PL/SQL. Créez et exécutez un bloc PL/SQL qui accepte deux valeurs numériques via des variables de substitution SQL*PLUS. Majuscules Minuscules Minuscules Identificateurs et paramètres Noms de colonne. Modifiez script22. nextStep Technologies . via les variables de substitution les deux valeurs définies en a). 2. 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. INSERT. NUMBER. Sauvegarder ce script en tant que script21. Modifiez script21.sql Utilisez la commande DEFINE pour indiquer les deux valeurs DEFINE p_num1 = 2 DEFINE p_num1 = 4 Transmettez au bloc PL/SQL. END . Exemple SELECT.Conventions typographiques (2) Convention Majuscules Catégorie Instruction SQL.

KROS. vous pourrez: Ecrire une instruction SELECT correcte en PL/SQL Ecrire des instructions LMD en PL/SQL Contrôler des transactions en PL/SQL Déterminer le résultat de l’exécution d’instructions SQL LMD 50 (c) 2006. nextStep Technologies . ROLLBACK.Interagir avec le serveur Oracle 3 49 Objectifs A la fin de ce chapitre. nextStep Technologies Instructions SQL en PL/SQL Extraire des lignes de données à l’aide de SELECT Utiliser des commandes LMD Contrôler les transactions à l’aide de COMMIT. KROS. SAVEPOINT Exploiter des curseurs implicites 51 (c) 2006.

BEGIN SELECT SUM(salary) INTO v_sum FROM employees WHERE department_id = v_dept_no. nextStep Technologies . KROS. > 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. v_dept_no NUMBER NOT NULL := 10 .hire_date%TYPE .salary%TYPE. v_salaire employees. KROS. BEGIN SELECT hire_date. DBMS_OUTPUT.PUT_LINE(‘Total des salaires =’ || TO_CHAR(v_sum)). nextStep Technologies Extraire des données (1) Exemple : Extraire la date d’embauche et le salaire de l’employé N° 100 ! DECLARE v_date_emb employees. END . / 53 (c) 2006. variable_name]… | record_name } FROM table [WHERE condition] .2).Instructions SELECT en PL/SQL SYNTAXE SELECT select_list INTO {variable_name[. END . nextStep Technologies Extraire des données (2) Exemple : Renvoyer la somme des salaires des employés d’un service ! DECLARE v_sum NUMBER(10. v_salaire FROM employees WHERE employee_id = 100 . / 54 (c) 2006. KROS. salary INTO v_date_emb.

…) -Générer des séquences (numérotation automatique) 56 (c) 2006. KROS. salary / FROM hr.fr'. hire_date.'KYEDREBEOGO'. last_name. 'Roland Olivier'. SYSDATE. Possibilités avec INSERT Dans un bloc PL/SQL : / -Utiliser des fonctions SQL (USER.employees WHERE employee_id = ID_DE_VOTRE_VOISIN . BEGIN UPDATE employees SET salary = salary + v_sal_plus WHERE employee_id = VOTRE_ID . KROS. 57 (c) 2006. email. END . nextStep Technologies . 'toto@yahoo. first_name. nextStep Technologies Mettre à jour des données Augmenter de 1000 le salaire l’employé que vous venez de créer DECLARE v_sal_new NUMBER := 1000. 1000) . SYSDATE. SELECT last_name. nextStep Technologies Insérer des données BEGIN Ajouter un nouvel employé : INSERT INTO employees(employee_id.Manipuler des données INSERT : ajout de nouvelles lignes UPDATE : maj de lignes existantes DELETE : suppression de lignes MERGE : maj de lignes si existantes et ajout dans le cas contraire* MERGE Privilèges INSERT et UPDATE ! 55 (c) 2006. job_id. KROS. END . salary) VALUES(221. 'IT_PROG'.

nextStep Technologies . Exemple : Si copy_emp. KROS. Paper 3-15 59 (c) 2006. nextStep Technologies Conventions d’appellation Éviter les ambiguïtés dans la clause WHERE Noms des colonnes de BD <> Noms des identificateurs Noms des variables locales prioritaires sur noms des tables de la BD Noms des colonnes de BD prioritaires sur noms des variables locales 60 (c) 2006.employee_id = employees. KROS.Supprimer des données Supprimez-vous de la table employés ! BEGIN DELETE FROM hr. / 58 (c) 2006.employee_id Alors Sinon Insertion Finsi MAJ Cf.employees WHERE employee_id = VOTRE_ID . KROS. END . en utilisant les données d’une autre. nextStep Technologies Fusionner des lignes : MERGE MERGE permet d’insérer ou de mettre à jour des lignes dans une table.

le Serveur Oracle ouvre une zone de Mémoire dans laquelle la commande est analysée et exécutée ! 62 (c) 2006. nextStep Technologies Attributs d’un curseur SQL ATTRIBUT SQL%ROWCOUNT SQL%FOUND DEFINITION Nombre de lignes affectées par la dernière instruction SQL Attribut booléen qui prend la valeur TRUE si la dernière instruction SQL affecte une ou plusieurs lignes Attribut booléen qui prend la valeur TRUE si la dernière instruction SQL n’affecte aucune ligne Prend toujours la valeur FALSE car PL/SQL ferme les curseurs implicites immédiatement après leur exécution 63 SQL%NOTFOUND SQL%ISOPEN Attributs valides UNIQUEMENT dans PL/SQL et non SQL ! (c) 2006.Conventions d’appellation 2) Identificateur Variable Constante Curseur Exception Type de table Table Type d’enregistrement Enregistrement Variable de substitution Variable hôte Convention v_name c_name name_cursor e_name name_table_type name name_record p_name g_name (c) 2006. nextStep Technologies . KROS. KROS. KROS. nextStep Technologies Exemple v_salary c_emp_name emp_cursor e_too_many total_table_type countries dept_record p_job_id g_year_sal 61 name_record_type emp_record_type Notion de curseur SQL Zone de travail réservée à SQL 2 types : Curseur implicites : utilisés par le serveur Oracle pour analyser et exécuter les instructions SQL Curseur explicite : déclarés de manière explicite par le programmeur >> A chaque instruction SQL.

64 (c) 2006. KROS. --DECLARE v_employee_id employees. nextStep Technologies . KROS. KROS. nextStep Technologies Gestion des transactions 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 ! Pour définir des points intermédiaires. :v_msg_suppr := (SQL%ROWCOUNT || ‘ lignes supprimées !’). END .employe_id%TYPE := 176. nextStep Technologies Synthèse Ce chapitre vous a permis de savoir Intégrer du code SQL dans un bloc PL/SQL Intégrer des instructions de gestion des transactions Les fonctions des 2 types de curseur Les attributs des curseurs implicites Exo-PLSQL3 66 (c) 2006. / PRINT v_msg_suppr .Exemple Supprimer les lignes possédant l’ID indiqué et renvoyer le nombre de lignes VARIABLE v_msg_suppr VARCHAR2(30). BEGIN DELETE FROM employees WHERE employee_id = v_employee_id.Attributs de curseur . utiliser SAVEPOINT 65 (c) 2006.

Modifiez script33.Exercice 3 1. le nom et la location de votre département. Modifiez script32.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 3.sql 2.sql. Affichez le numéro. Consultez les valeurs distinctes des locations disponibles pour respecter les contraintes.sql pour mettre à jour le numéro de location du nouveau département. Modifiez script31. KROS. KROS. nextStep Technologies . Utilisez la commande DEFINE pour définir le nouveau numéro. nextStep Technologies Ecrire des structures de contrôle 4 68 Objectifs A la fin de ce chapitre.sql et affectez cette valeur comme numéro de service de votre département. 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.sql 4. vous pourrez: Identifier les types de structure de contrôle et leurs utilisations Ecrire une instruction IF Utiliser des expressions CASE Ecrire et identifier les types d’instructions LOOP Utiliser des tables logiques 69 (c) 2006. Enregistrez ce script sous script32. Ajoutez 10 à la valeur maximale trouvée dans script31.sql pour supprimer le département que vous venez de créer.sql pour insérer un nouveau département dans la table DEPARTMENTS en utilisant la commande DEFINE pour définir son nom. Enregistrez ce script sous script33. Affichez le numéro et le nom de votre nouveau département. Enregistrez ce script sous script34.

Flux d’exécution PL/SQL Utiliser des instructions conditionnelles IF – THEN – END IF IF – THEN – ELSE . ] END IF . ] [ELSE instructions. KROS. … IF COMPOSES … IF v_ename = ‘TOTO’ AND v_salary < 1000 THEN v_salary := 1000 . END IF .END IF Et des structures de contrôle LOOP 70 (c) 2006. nextStep Technologies . …. nextStep Technologies Flux d’exécution IF-THEN-ELSE TRUE FALSE IF condition THEN actions (incluant d’autres IF) ELSE actions (incluant d’autres IF) 72 (c) 2006. KROS. KROS. 71 (c) 2006. IF SIMPLES … IF v_ename = ‘TOTO’ THEN v_salary := 1000 . nextStep Technologies Instructions IF IF condition THEN instructions .END IF IF – THEN – ELSIF . [ELSIF condition THEN instructions. END IF .

nextStep Technologies Remarques sur ELSIF Utiliser ELSIF autant que faire se peut : Pour éviter les instructions IF imbriquées Pour rendre votre code plus facile à lire et sa structure plus claire Si l’action associée à ELSE consiste en une autre instruction IF Pour éviter les nombreux END IF imbriqués 74 (c) 2006. 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. 75 (c) 2006.] END. KROS. KROS. KROS. nextStep Technologies .Flux d’exécution IF-THEN-ELSIF IF condition TRUE THEN actions NOT TRUE ELSIF condition TRUE THEN actions NOT TRUE ELSE actions 73 (c) 2006.

END IF. END. AND TRUE est prioritaire dans une cond. DBMS_OUTPUT.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 . KROS. nextStep Technologies Traitement des valeurs NULL Eviter les erreurs fréquentes avec NULL : Une comparaison simple impliquant NULL renvoie NULL ! NOT appliqué à NULL renvoie NULL ! Dans une instruction de contrôle conditionnel. 76 (c) 2006. KROS.Exemple d’utilisation de CASE DECLARE v_moyenne NUMBER(2. le bloc correspondant n’est PAS EXECUTE ! Cf Paper 4-16 (Tables logiques) ! 77 (c) 2006. si la condition est NULL. nextStep Technologies .PUT_LINE(‘La mention correspondante à une moyenne de ‘ || v_moyenne || ‘ est : ‘ || v_mention ). KROS. OR 78 (c) 2006. v_mention VARCHAR2(20).2) := &p_moyenne . nextStep Technologies Tables logiques AND TRUE FALSE NULL TRUE TRUE FALSE NULL FALSE FALSE FALSE FALSE NULL NULL FALSE NULL OR TRUE FALSE NULL TRUE TRUE TRUE TRUE FALSE TRUE FALSE NULL NULL TRUE NULL NULL NOT TRUE FALSE NULL FALSE TRUE NULL REMARQUES : FALSE est prioritaire dans une cond. BEGIN -.

KROS. KROS.délimiteur -. nextStep Technologies Boucle WHILE WHILE condition LOOP statement1. Condition est évalué au début de chaque itération ! Utiliser la boucle WHILE pour répéter des instructions TANT QU’UNE CONDITION RENVOIE TRUE ! 81 (c) 2006. nextStep Technologies .instructions Variable ou expression booléenne ! 80 (c) 2006.délimiteur -.condition de sortie -. END LOOP. …. ….Contrôle d’itérations Boucle : permet l’exécution à plusieurs reprises d’une instruction ou d’une séquence d’instructions 3 types de boucles Boucle de base : LOOP Boucle FOR Boucle WHILE 79 (c) 2006. nextStep Technologies Boucle de base : LOOP LOOP instruction. KROS. EXIT [WHEN condition]. -. statement2. END LOOP .

statement2. 84 (c) 2006. END LOOP . END . nextStep Technologies NUMBER NOT NULL := 1 . …..Boucle FOR FOR cpt IN [REVERSE] mincpt.v_cpt. KROS. 83 (c) 2006. compteur NUMBER(2).maxcpt ! -REVERSE indique que le compteur décroît à chaque itération ! 82 (c) 2006. / Résultat attendu : 3*1=3. 3*2=6. KROS. …. END LOOP . . resultat NUMBER(2) ). -FOR simplifie le contrôle du nombre d’itérations -La déclaration du compteur est IMPLICITE ! -PAY ATTENTION TO THE SYNTAX : mincpt. 3 * 10 = 30 . nextStep Technologies Exemple avec LOOP DECLARE v_cpt BEGIN LOOP INSERT INTO multiplication3 VALUES (3. v_cpt := v_cpt + 1 .maxcpt statement1.. KROS. nextStep Technologies Exemples d’utilisation Insérer la table de multiplication par 3 dans une table CREATE TABLE multiplication3 ( multipliant NUMBER(1). 3*v_cpt). EXIT WHEN v_cpt > 10 .

10 LOOP INSERT INTO multiplication3 VALUES (3. 3*v_cpt). KROS. 3*v_cpt). 3 * 10 = 30 . ….v_cpt. / Résultat attendu : 3*1=3. 86 (c) 2006. / Résultat attendu : 3*1=3. nextStep Technologies . END LOOP . 85 (c) 2006. nextStep Technologies NUMBER NOT NULL := 1 . nextStep Technologies Remarques sur les boucles Utiliser la boucle LOOP lorsque ses instructions doivent s’exécuter au moins une (01) fois ! Utiliser la boucle WHILE si la condition doit être évaluée au début de chaque itération Utiliser la boucle FOR si le nombre d’itérations est connu 87 (c) 2006. END LOOP . KROS. v_cpt := v_cpt + 1 . 3*2=6. ….Exemple avec WHILE DECLARE v_cpt BEGIN WHILE v_cpt < 11 LOOP INSERT INTO multiplication3 VALUES (3. END .v_cpt. Exemple avec FOR BEGIN FOR v_cpt IN 1 .. KROS. 3*2=6. END . 3 * 10 = 30 .

vous afficherez 11 astérisques . soit 10% du salaire.Synthèse Ce chapitre vous a permis de savoir : Modifier l’enchaînement logique en utilisant des structures de contrôle Instructions conditionnelles IF Expressions CASE Boucles LOOP WHILE FOR Exo-PLSQL4 88 (c) 2006.sql et lancez-le à l’aide START : START c:\script41. par tranche de salaire de 1000 $.sql 174 90 (c) 2006.sql 144 89 (c) 2006.sql 104 ou START c:\script41. •Si le salaire de l’employé est supérieur à 10000$. affichez le montant de la prime de l’employé. KROS. affichez la valeur 0 en tant que montant de la prime de l’employé.sql et lancez-le à l’aide START : START c:\script41. en fonction de son salaire •UTILISEZ la fonction DEFINE pour fournir le numéro d’employé. affichez le montant de la prime de l’employé. soit 15% du salaire. •Sil le salaire de l’employé a la valeur NULL. affichez le montant de la prime de l’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$. KROS. vous afficherez 13 astérisques Résultat attendu : EMPLOYEE_ID SALARY 104 6000 174 11300 176 12600 STARS ****** *********** ************* Enregistrez ce script sous script42. UTILISEZ la fonction DEFINE pour fournir le numéro d’employé. KROS. •Si le salaire de l’employé est compris entre 5000$ et 10000$. Testez votre bloc PL/SQL avec chacun des cas ci-dessous.sql 100 START c:\script41. si l’employé touche 11300$. Créez un bloc PL/SQL qui calcule le montant de la commission d’un employé donné. si l’emloyé touche 12600$. nextStep Technologies . 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. nextStep Technologies Exo-PLSQL-4 (2) 2. •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$. et vérifiez le montant de la prime ! Enregistrez ce script sous script41. nextStep Technologies Exo-PLSQL-4 (1) 1. vous afficherez 8 astérisques . soit 20% du salaire.

vous pourrez: Faire la différence entre un curseur implicite et un curseur explicite Savoir quand et pourquoi utiliser un curseur explicite Utiliser une variable de type RECORD en PL/SQL Ecrire une boucle FOR de curseur 92 (c) 2006.Ecrire des curseurs explicites 5 91 Objectifs A la fin de ce chapitre. Il est possible d’utiliser des curseurs PL/SQL pour nommer ces zones et traiter les informations qu’elles contiennent ! On distingue les curseurs : Implicites : déclarés par le serveur Oracle pour toute instruction LMD et PL/SQL Explicites : déclarés et nommés par les développeurs d’applications 93 (c) 2006. KROS. nextStep Technologies . nextStep Technologies A propos des curseurs… Le serveur Oracle utilise des zones de travail (curseurs) pour analyser et exécuter les instructions SQL. KROS.

nextStep Technologies . nextStep Technologies 94 Contrôler les curseurs explicites DECLARE 1 OPEN 2 FETCH 1 2 3 4 5 Créer une zone SQL nommée Identifier l’ensemble actif Charger la ligne en cours Tester l’existence d’une autre ligne Libérer l’ensemble actif NON 3 VIDE ? OUI 4 CLOSE 5 95 (c) 2006. nextStep Technologies Contrôler les curseurs explicites Utilisez les instructions : OPEN : exécute l’interrogation associée au curseur. il faut à nouveau l’ouvrir) 96 (c) 2006. KROS.Les curseurs explicites Fonction principale : Traiter individuellement chaque ligne renvoyée par une instruction SELECT multiligne 100 101 … 174 CURSEUR Dindon Poulet … Canard 3000 1500 … 2500 Lignes de la table Ensemble actif (c) 2006. KROS. KROS. identifie l’ensemble actif et positionne le curseur sur la PREMIERE LIGNE 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 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.

nextStep Technologies 98 Ouvrir un curseur OPEN nom_du_curseur .employees . aucune exception n’est déclenchée Utiliser les attributs de curseurs pour tester le résultat après une extraction. utiliser la clause ORDER BY dans l’interrogation 97 (c) 2006. nextStep Technologies Exemple de déclaration DECLARE CURSOR emp_cursor IS SELECT employee_id. (c) 2006. 99 (c) 2006. BEGIN … END. CURSOR dept_cursor IS SELECT * FROM hr. KROS.Déclarer un curseur Syntaxe : CURSOR nom_du_curseur IS instruction_select Remarques : Ne pas inclure la clause INTO dans la déclaration du curseur S’il existe un ordre précis de traitement des lignes. nextStep Technologies . last_name FROM hr. Ouvrir le curseur pour référencer l’ensemble actif Si l’interrogation ne renvoie aucune ligne.departments WHERE location_id = 170 . KROS. KROS.

nextStep Technologies .employee_id%TYPE . KROS.last_name%TYPE. END LOOP . hr. KROS..employees. SELECT employee_id. …] | record_name ].PUT_LINE(v_empno || ‘ . nextStep Technologies Exemple d’extraction de données DECLARE v_empno v_ename hr. END. Extraire les valeurs de la ligne en cours et les placer dans des vriables Ajuster la position des variables par rapport aux colonnes Vérifier si le curseur contient des lignes ! 100 (c) 2006. CURSOR emp_cursor IS 101 (c) 2006. FOR i IN 1. nextStep Technologies Fermer le curseur CLOSE nom_du_curseur .10 LOOP FETCH emp_cursor INTO v_empno. DBMS_OUTPUT. last_name FROM hr.employees . KROS.‘ || v_ename). variable2.Extraire les données du curseur Syntaxe : FETCH nom_du_curseur INTO [ variable1. v_ename . Fermer le curseur après avoir terminé le traitement des lignes L’ensemble actif n’est donc plus défini Rouvrir le curseur si nécessaire Ne pas essayer d’extraire les données d’un curseur s’il a été fermé (exception INVALID_CURSOR) 102 (c) 2006. BEGIN OPEN emp_cursor .employees.

KROS. nextStep Technologies . KROS. nextStep Technologies Attributs d’un curseur explicite Attribut %ISOPEN %NOTFOUND %FOUND %ROWCOUNT Type Booléen Booléen Booléen Nombre Description TRUE si le curseur est ouvert TRUE si la dernière extraction ne renvoie aucune ligne TRUE si la dernière extraction renvoie une ligne Nombre total de lignes renvoyées jusqu’à présent 104 (c) 2006. KROS. afin de LIBERER les ressources 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.Remarques sur les curseurs Prendre l’habitude de fermer les curseurs explicites ouverts. nextStep Technologies Utilisation des attributs de curseur Utiliser %ISOPEN pour vérifier qu’un curseur est déjà ouvert Utiliser %ROWCOUNT pour extraire un nombre exact de lignes Utiliser %NOTFOUND pour déterminer les conditions de sortie de la boucle 105 (c) 2006.

nextStep Technologies 106 Synthèse Ce chapitre vous a permis de savoir Différencier les types de curseurs : Curseurs implicites : LMD et interrogations monolignes Curseurs explicites : interrogations portant sur ZERO. Remarque : Référencer un curseur fermé avec %ROWCOUNT déclenche l’exception INVALID_CURSOR (c) 2006. …. LOOP FETCH c1 INTO my_name. UNE ou PLUSIEURS lignes Manipuler les curseurs explicites Evaluer l’état du curseur en utilisant des attributs de curseur Utiliser les boucles FOR de curseur Exo-PLSQL5 107 (c) 2006. nextStep Technologies Traiter les Exceptions 6 108 . END LOOP . my_salary IF c1%ROWCOUNT > 10 THEN …… END IF. KROS. END LOOP . …. KROS. my_salary EXIT WHEN c1%NOTFOUND .Exemples d’utilisation LOOP FETCH c1 INTO my_name.

Objectifs A la fin de ce chapitre. Vous pouvez déclencher explicitement une exception en utilisant l’instruction RAISE dans le bloc ! 111 (c) 2006. KROS. nextStep Technologies 109 Exceptions en PL/SQL Une exception désigne un identificateur détecté durant l’exécution d’un bloc Elle est déclenchée : A la suite d’une erreur Oracle Explicitement par le programmeur Elle est traitée : En l’interceptant avec le gestionnaire En la propageant à l’environnement appelant 110 (c) 2006. et l’exception NO_DATA_FOUND est déclenchée par PL/SQL. vous pourrez: Définir des exceptions PL/SQL Reconnaître les exceptions non traitées Lister et utiliser les différents types de traitement des exceptions PL/SQL Intercepter les erreurs non prédéfinies Décrire l’effet de la propagation des exceptions Personnaliser les messages d’erreur (c) 2006. nextStep Technologies Exemple d’exception Lorsque l’instruction SELECT n’extrait aucune ligne de la BD. nextStep Technologies . KROS. l’erreur ORA01403 survient. KROS.

KROS. KROS. KROS. mais autoriser le serveur Oracle à les déclencher implicitement Déclarer ces exceptions dans la section déclarative et autoriser le serveur Oracle à les déclencher implicitement Déclarer ces exceptions dans la section déclarative et déclenchez-les explicitement Erreur non prédéfinie du Serveur Oracle Toute autre erreur standard du serveur Oracle Erreur définie par le programmeur Condition anormale définie par le développeur 113 (c) 2006. instruction 2 . …] [ WHEN OTHERS THEN instruction 1 . … [ WHEN exception3 [or exception4…] THEN instruction 3 . nextStep Technologies Intercepter les exceptions EXCEPTION WHEN exception1 [or exception2…] THEN instruction 1 .Traiter les exceptions Intercepter l’exception : Déclenchement de l’exception Branchement sur le gestionnaire d’exceptions dans la section EXCEPTION 2 cas de figure se présentent : Si Exception traitée par PL/SQL Alors Exécution normale du bloc Sinon -. nextStep Technologies Types d’exception Exception Erreur prédéfinie du Serveur Oracle Description Une des 20 erreurs les plus fréquentes en PL/SQL Que faire ? Ne pas déclarer ces exceptions.Absence de gestionnaire approprié Exception propagée dans l’environnement appelant Finsi 112 (c) 2006. instruction 2 . nextStep Technologies . …] 114 (c) 2006. instruction 4 .

elle se déclenche implicitement Utiliser la clause PRAGMA EXCEPTION_INIT qui indique au compilateur d’associer un nom d’exception à un code d’erreur ! 117 (c) 2006. nextStep Technologies . KROS. KROS. KROS. nextStep Technologies Interception : Erreur non prédéfinie La déclarer ou utiliser WHEN OTHERS Lorsqu’elle est déclarée. nextStep Technologies Interception : Erreur prédéfinie Utiliser le nom standard à l’intérieur du sousprogramme de traitement des exceptions des 20 erreurs les plus fréquentes Exemples : NO_DATE_FOUND TOO_MANY_ROWS INVALID_CURSOR ZERO_DIVIDE DUP_VAL_ON_INDEX Paper-PLSQL-Exceptions 116 (c) 2006.Règles d’interception Le mot clé EXCEPTION débute la section de traitement des exceptions Plusieurs gestionnaires d’exception sont permis Un seul gestionnaire est exécuté avant la sortie du bloc WHEN OTHERS est la dernière clause 115 (c) 2006.

END. COMMIT . KROS. EXCEPTION WHEN e_emp THEN DBMS_OUTPUT. KROS. v_error_message := SQLERRM .DECLARE e_emp BEGIN DELETE FROM departments WHERE department_id = &p_deptno . Des employés existent !’). END. NUMBER . v_error_message).PUT_LINE(‘Impossible de supprimer le dépt ’||&p_deptno || ‘. 120 (c) 2006.Exemple de traitement DEFINE p_deptno = 10 -. nextStep Technologies Exemple d’utilisation . PRAGMA EXCEPTION_INIT (e_emp.Fonctions DECLARE v_error_code v_error_message BEGIN … EXCEPTION WHEN OTHERS THEN ROLLBACK . EXCEPTION . INSERT INTO mes_erreurs VALUES(v_error_code. VARCHAR2(255). KROS. nextStep Technologies . 118 (c) 2006. nextStep Technologies Fonctions d’interception SQLCODE : renvoie la valeur numérique du code d’erreur SQLERRM : renvoie le message associé au code d’erreur Exemples de valeurs SQLCODE 0 Aucune exception détectée 1 Exception définie par l’utilisateur +100 Exception NO_DATA_FOUND Nombre négatif : autre code d’erreur ! 119 (c) 2006. v_error_code := SQLCODE . -2292).

Interception : Exception Utilisateur La déclarer dans la section déclarative : mon_exception EXCEPTION . (c) 2006. KROS. END IF. Utiliser l’instruction RAISE pour déclencher explicitement l’exception dans la section exécutable : RAISE mon_exception . COMMIT .PUT_LINE(‘ Aucun département n’’a cet ID !’). BEGIN UPDATE departements SET department_name = ‘&p_dept_name’ WHERE department_id = &p_dept_id . nextStep Technologies 122 RAISE_APPLICATION_ERROR Procédure permettant de délivrer des messages définis par l’utilisateur à partir de sousprogrammes stockés Permet de signaler les erreurs à l’application et d’éviter le renvoi d’exceptions non traitées. Peut être utilisé dans la section exécutable ou dans la section de traitement des exceptions Renvoie à l’utilisateur les conditions de l’erreur de manière cohérente par rapport aux autres erreurs du serveur Oracle ! 123 (c) 2006. IF SQL%NOTFOUND THEN RAISE e_employee_invalide . KROS. nextStep Technologies . EXCEPTION WHEN e_department_invalide THEN DBMS_OUTPUT. nextStep Technologies Exemple DEFINE p_dept_name = ‘Informatique de Gestion’ DEFINE p_id = 124500001459 --DECLARE e_department_invalide EXCEPTION . KROS. END. Faites référence à l’exception déclarée dans le sous-programme correspondant de traitement des exceptions ! 121 (c) 2006.

nextStep Technologies Synthèse Ce chapitre vous a permis de savoir Reconnaître les <> types d’exception Erreur prédéfinie du serveur Oracle Erreur non prédéfinie du serveur Oracle Erreur définie par l’utilisateur Intercepter une exception Traiter une exception Intercepter l’exception dans le bloc PL/SQL Propager l’exception Exercice : Exo-8-25-26 126 (c) 2006. nextStep Technologies Exemples BEGIN … DELETE FROM hr. ‘Id de manager invalide !’) . KROS. … EXCEPTION WHEN NO_DATA_FOUND THEN RAISE_APPLICATION_ERROR (-20202. error_number : valeur numérique définie par l’utilisateur (entre -20000 et -20999) message : message défini pour l’exception TRUE | FALSE : si True.Syntaxe Syntaxe : raise_application_error(error_number. ‘Id de manager invalide !’) .employees WHERE manager_id = v_manager_id . END IF. {TRUE | FALSE }]). l’erreur est rangée dans la pile des erreurs précédentes ! 124 (c) 2006. … END. KROS. 125 (c) 2006. KROS. END. IF SQL%NOTFOUND THEN RAISE_APPLICATION_ERROR (-20202. nextStep Technologies . message [.

2.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.sql et lancez-le à l’aide START : START c:\script41.sql 7000 START c:\script41. nextStep Technologies Compléments > Procédures et fonctions PL/SQL > Trucs et astuces 128 Credits .kyedrebeogo@gmail.sql 2500 127 (c) 2006.Roland Olivier KYEDREBEOGO. 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. 3.Sources Sources www.oracle. Traitez toutes les autres exceptions à l’aide d’un gestionnaire approprié. le message doit indiquer le nombre d’employé(s). 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. S’il existe au moins un employé dans cette tranche de salaire. KROS.com Dernière mise à jour le 25 mars 2006 129 . affichez un message à l’utilisateur à l’aide d’une exception.com © 2006 .labo-oracle. S’il n’existe pas d’employés dans cette tranche de salaire. Oracle 9i Certified Professionnal nextStep technologies Email : roland.com www.

Annexes 130 .