SGBD Oracle: Introduction to PL/SQL

Page 1 sur 34Lecteur de document UniversityLib

SGBD Oracle: Introduction to PL/SQL

Database Management and Procedural SQL Programming · notes

Voir tous les documents en bases de données

SGBD ORACLE

LL E E LL A N G A G E

P L / S Q L A N G A G E P L / S Q L

1. 2.

3. 4.

5.

6.

7.

2.1. 2.2. 2.3.

4.1. 4.2. 4.3.

4.4.

4.5.

5.1.

5.2. 5.3.

6.1. 6.2.

7.1. 7.2. 7.3.

7.4.

INTRODUCTION ......................................................................................................................................... 3 ENVIRONNEMENT .................................................................................................................................... 3 SCHEMA 1 : PL/SQL DANS LE NOYAU DU SGBDR ................................................................................ 4 SCHEMA 2 : LE TRAITEMENT D'UN RPC PAR LE NOYAU DU SGBDR ...................................................... 5 SCHEMA 3 : PL/SQL DANS LES OUTILS .................................................................................................. 5 STRUCTURE D'UN BLOC ......................................................................................................................... 6 LES DECLARATIONS PL/SQL ................................................................................................................. 7 TYPES DE DONNEES ................................................................................................................................ 8 CONVERSION DES TYPES DE DONNEES .................................................................................................... 8 VARIABLES ET CONSTANTES .................................................................................................................. 9 4.3.1. La définition des variables en PL/SQL ............................................................................................. 9 4.3.2. Exemples de déclaration de variables .............................................................................................. 9 4.3.3. L'assignement des variables PL/SQL ............................................................................................. 10 LES TABLEAUX (TABLE PL/SQL) ......................................................................................................... 10 4.4.1. La déclaration d'un tableau ............................................................................................................ 10 4.4.2. L'accès aux éléments d'un tableau .................................................................................................. 11 4.4.3. Exemple ........................................................................................................................................... 11 LES ENREGISTREMENTS PREDEFINIS (RECORD PL/SQL) ...................................................................... 11 4.5.1. La déclaration d'un enregistrement ................................................................................................ 11 4.5.2. L'accès aux champs d'un enregistrement ........................................................................................ 12 4.5.3. Exemple ........................................................................................................................................... 12 LES STRUCTURES DE CONTROLES ................................................................................................... 13 INSTRUCTION D’ENTREE/SORTIE .......................................................................................................... 13 Instructions d’entrée ....................................................................................................................... 13 5.1.1. 5.1.2. Instructions de Sortie ...................................................................................................................... 13 5.1.3. Exemple: ......................................................................................................................................... 14 LES TRAITEMENTS CONDITIONNELS .................................................................................................... 14 LES TRAITEMENTS REPETITIFS ............................................................................................................. 15 5.3.1. L'instruction LOOP ......................................................................................................................... 15 5.3.2. L'instruction FOR ... LOOP ............................................................................................................ 16 5.3.3. L'instruction WHILE ... LOOP ....................................................................................................... 16 LA GESTION DES ERREURS ................................................................................................................. 17 LES EXCEPTIONS INTERNES .................................................................................................................. 17 LES EXCEPTIONS UTILISATEURS (EXTERNES) ....................................................................................... 19 LES CURSEURS EN PL/SQL ................................................................................................................... 20 DEFINITION .......................................................................................................................................... 20 LES TYPES DE CURSEURS ...................................................................................................................... 20 LES ETAPES D'UTILISATION D'UN CURSEUR EXPLICITE .......................................................................... 21 7.3.1. La déclaration d'un curseur ............................................................................................................ 21 7.3.2. L'ouverture et la fermeture du curseur ........................................................................................... 21 7.3.3. Le traitement des lignes .................................................................................................................. 22 LES ATTRIBUTS D'UN CURSEUR ............................................................................................................. 22 7.4.1. L'attribut %Found ........................................................................................................................... 23 7.4.2. L'attribut %NotFound ..................................................................................................................... 23 7.4.3. L'attribut %Isopen .......................................................................................................................... 24 7.4.4. L'attribut %RowCount .................................................................................................................... 25 7.4.5. L'attribut %Rowtype ....................................................................................................................... 25

M. WALID MELIANI

PAGE 1

SGBD ORACLE

8.

8.2.

8.1.

7.5. 7.6. 7.7.

LES BOUCLES ET LES CURSEURS ........................................................................................................... 26 LE CURSEUR PARAMETRE ..................................................................................................................... 27 LA CLAUSE "CURRENT OF ..." ............................................................................................................... 28 PROCEDURES, FONCTIONS, PACKAGES ET TRIGGERS ............................................................. 29 PROCEDURE .......................................................................................................................................... 29 8.1.1. Création-modification d'une procédure .......................................................................................... 29 8.1.2. Compilation d'une procédure ......................................................................................................... 30 8.1.3. Exécution d'une procédure ............................................................................................................. 30 Suppression d'une procédure .......................................................................................................... 30 8.1.4. FONCTION ............................................................................................................................................. 30 8.2.1. Création-modification d'une fonction ............................................................................................. 30 8.2.2. Compilation d'une fonction ............................................................................................................. 31 8.2.3. Utilisation d'une fonction ................................................................................................................ 31 Suppression d'une fonction ............................................................................................................. 31 8.2.4. PACKAGE PL/SQL ............................................................................................................................... 31 8.3.1. Spécification d'un package ............................................................................................................. 31 8.3.2. Compilation d'un package .............................................................................................................. 31 8.3.3. Exécution d'une procédure d'un package ....................................................................................... 32 8.3.4. Exécution d'une fonction d'un package .......................................................................................... 32 Suppression d'un package ............................................................................................................... 32 8.3.5. DECLENCHEURS (TRIGGER) ......................................................................................................... 32 8.4.1. Création-modification d'un trigger avant/après évènement ........................................................... 32 8.4.2. Trigger ligne ................................................................................................................................... 33 8.4.3. Soumission du script d'un trigger ................................................................................................... 33 8.4.4. Désactivation d'un trigger .............................................................................................................. 33 8.4.5. Réactivation d'un trigger ................................................................................................................ 33 Suppression d'un trigger ................................................................................................................. 33 8.4.6. 9. UTILISATION DE PL/SQL POUR LA GENERATION DES TABLES DE TESTS .......................... 34

8.3.

8.4.

M. WALID MELIANI

PAGE 2

SGBD ORACLE

1. Introduction

Sql est un langage complet pour travailler sur une base de données, mais il ne comporte pas d'instructions procédurales.

PL/SQL comprend quant à lui :

la partie LID de SQL (Select), la partie LMD de SQL (Update, Insert, Delete), la gestion des transactions (Commit, Rollback, Savepoint), les fonctions de Sql

§ § § § § plus une partie procédurale (IF, WHILE, ...).

PL/SQL est donc un langage algorithmique complet.

Remarque : il ne comporte pas d'instructions de LDD (Alter, Create, Rename) ni les instructions de contrôle comme (Grant et Revoke).

PL/SQL est un langage au même titre que SQL.

Tout comme SQL, PL/SQL peut être utilisé au sein des outils de la famille Oracle comme : Sql*Plus, Sql*Forms, Sql*Pro, ....

PL/SQL comporte donc des instructions SQL, pour bénéficier des avantages du SQL et intègre d'autre part des instructions PL qui permettent de gérer :

§ des boucles (LOOP, FOR, WHILE, EXIT [WHEN], GOTO) § des conditionnelles (IF, THEN, ELSIF, ELSE, END IF) § des calculs et des fonctions, § des sous-programmes, § des packages (paquettage ou librairie ou module).

2. Environnement

Le fonctionnement de PL/SQL est basé sur l'interprétation d'un "bloc" de commandes. Ce mode de fonctionnement permet d'obtenir des gains de transmission et des gains de performances :

M. WALID MELIANI

PAGE 3

Schémas :

SGBD ORACLE

SQL et PL/SQL ont tous les deux un "moteur" associé : § SQL Statement Executor, § Procedural Statement Executor

Le moteur SQL se trouve dans le noyau SGBDR

Le moteur PL/SQL se trouve : § soit avec le noyau RDBMS, § soit avec l'outil.

2.1.

Schéma 1 : PL/SQL dans le noyau du SGBDR

Utilisable avec : Sql*Dba (V6.0), Sql*Plus (V3), Précompilateurs V1.3

M. WALID MELIANI

PAGE 4

2.2.

Schéma 2 : Le traitement d'un RPC par le noyau du SGBDR

RPC = Remote Procedure Call

SGBD ORACLE

2.3.

Schéma 3 : PL/SQL dans les outils

Utilisable avec : Sql*Plus 3.0, Sql*Forms V3, bientôt Sql*Menu, Sql*ReportWriter. Ceci permet de bénéficier d'un langage procédural au sein de l'outil, et de mettre en oeuvre une approche algorithmique au niveau de l'écriture des triggers.

L'utilisation de PL/SQL à partir de Sql*Plus est possible soit en introduisant directement vos ordres PL/SQL dans l'éditeur, soit en chargeant les instructions PL/SQL à partir d'un fichier.

Bien que les instructions de Sql*Plus (column, ttitle, ...) sont interdites dans un bloc PL/SQL, vous pouvez insérer dans le même fichier des ordres Sql*Plus et des blocs PL/SQL. Notez que chaque bloc de PL/SQL doit se terminer par une barre oblique (/ ou slash).

PL/SQL peut également tirer avantage des variables de substitution de Sql*Plus.

M. WALID MELIANI

PAGE 5

SGBD ORACLE

3. Structure d'un Bloc

PL/SQL n'interprète pas une commande, mais un ensemble de commandes contenu dans un programme ou "bloc" PL/SQL.

La structure d'un bloc est la suivante:

DECLARE

Déclarations de variables, constantes, exception

BEGIN

Section obligatoire contenant des commandes exécutables Instructions SQL et PL/SQL Possibilités de blocs fils (imbrication de blocs)

EXCEPTION

Traitement des exceptions (gestion des erreurs)

END ;

M. WALID MELIANI

PAGE 6

SGBD ORACLE

Remarque : Les sections Declare et Exception sont optionnelles. Chaque instruction de n'importe quelle section doit se terminer par un ';'.

La structuration des instructions en blocs procurent une plus grande lisibilité des programmes et une simplification des traitements complexes.

Exemple de bloc PL/SQL :

DECLARE

qte_stock number(5);

BEGIN

Select quantite into qte_stock from inventaire where produit='raquette tennis';

-- contrôle du stock suffisant --

If qte_stock > 0 then update inventaire set quantite=quantite-1 where produit='raquette tennis'; insert into achat values ('raquette tennis', SYSDATE); else insert into acheter values ('Plus de raquettes de tennis',SYSDATE); end if;

commit;

Publicité

END ;

4. Les déclarations PL/SQL

La partie déclarative dans un bloc PL/SQL, peut comporter trois types de déclarations. Elle est délimitée par les mots-clé § DECLARE, qui spécifie le début et § BEGIN, qui signifie la fin de la déclaration et le début de la partie des

commandes.

Les types de déclarations possibles dans cette partie sont les suivants : § déclaration des variables et des constantes, § déclaration de curseurs, § déclaration des exceptions.

M. WALID MELIANI

PAGE 7

SGBD ORACLE

4.1. Types de données

Chaque variable ou constante utilisée dans un bloc PL/SQL, possède un type de données qui détermine son format de stockage, sa contrainte et son champ valide de valeurs.

PL/SQL offre deux variétés de types de données prédéfinies : § scalaire, § composé.

Types de données PL/SQL

Types Scalaires

Types Composés

record

table

binary_integer natural positive decimal float integer real smallint number char long varchar varchar2 boolean date rowid raw long raw

binary_integer : entier de 2(p-31) à 2(p+31)+1 natural : entiers naturels positive : entiers positifs decimal, float, integer, real et sallint : sous-types de number

char : chaîne de caractères jusqu'à 32767 caractères (au lieu de 255 dans la définition d'une colonne de table) varchar2 : chaîne de caractères jusqu'à 32767 caractères (au lieu de 2000 dans la définition d'une colonnne de table) long : équivalent à varchar2 sauf 2go dans la base.

4.2. Conversion des types de données

Les conversions des types de données en PL/SQL, sont regroupées en deux familles : §

les conversions explicites avec les fonctions définies dans Sql telles que to_date, to_char, etc.

§

les conversions implicites sont réalisées automatiquement par PL/SQL et fonctionnent selon les trois règles suivantes :

M. WALID MELIANI

PAGE 8

SGBD ORACLE

1. évaluation d'expressions, 2. affectation des variables, 3. affectation d'arguments.

4.3. Variables et constantes

La déclaration d'une variable consiste à allouer un espace pour stocker et modifier une valeur. Elle est typée et peut recevoir une valeur par défaut et/ou un statut NOT NULL. Une constante est définie comme une variable, mais l'utilisateur ne peut pas modifier son contenu.

4.3.1. La définition des variables en PL/SQL

Les variables se définissent dans la partie DECLARE du bloc PL/SQL en utilisant la syntaxe suivante :

nomvariable [CONSTANT] {type | variable%TYPE | table.%ROWTYPE } [NOT NULL] [{:= | DEFAULT } expression PL/SQL]

Remarques : § L'attribut constant permet de figer l'affectation d'une variable. § L'attribut 'Not Null' rend obligatoire d'initialiser la variable lors de sa définition. § On peut faire référence à une colonne d'une table par l'instruction : nom_variable

TABLE.COLONNE%TYPE

§ On peut faire référence à une ligne d'une table par l'instruction nom_variable

TABLE%ROWTYPE

§ On peut faire référence à une variable précedemment définie par l'instruction :

nom_variable Pnom_variable%TYPE

L'initialisation d'une variable de fait par l'opérateur : ':=' suivi : § d'une constante, § d'une expression PL/SQL, § d'une fonction PL/SQL.

Une expression boolénne donne comme résultat TRUE, FALSE ou NULL. Les variables peuvent également être définies dans l'environnement extérieur au Bloc PL/SQL : - champs de l'écran en Sql*Forms, - variables définies en langage hôte dans Pro*. Ces variables seront utilisées préfixées de ':'.

4.3.2. Exemples de déclaration de variables

number(9,2);

Total Nom Longeur Date_Creation Date; Numero

char(10):='Fischer'; number not null := length (Nom) * 2;

EMPLOYE.EMPNO%TYPE;

M. WALID MELIANI

PAGE 9

SGBD ORACLE

Dpt Prenom Pi

DEPARTEMENT%ROWTYPE; Nom%TYPE; Constant Number:=3.14;

4.3.3. L'assignement des variables PL/SQL

Deux possibilités d'assignement ou d'affectation sont disponibles : 1. par l'opérateur d'affectation : ':=', 2. par la clause Select ... Into ... .

La difficulté dans l'utilisation de la clause Select résulte du nombre de lignes ou d'occurrences retourné.

Si le Select retourne une et une seule ligne l'affectation s'effectue correctement.

Par contre, Si le Select retourne 0 ligne : NO_DATA_FOUND ou Si le Select retourne plusieurs lignes : TOO_MANY_ROWS une erreur PL/SQL est générée.

4.4. Les tableaux (table PL/SQL)

Nous avons vu dans le tableau des types de données que le langage PL/SQL fournit deux types d'objets composés : § §

les tables (TABLE), les enregistrements (RECORD).

Les tableaux sont conçus comme les tables de la base de données. Ils possèdent une clé primaire (index) pour accéder aux lignes du tableau. Un tableau, comme une table, ne possède pas de limite de taille. De cette façon, le nombre d'éléments d'un tableau va croître dynamiquement.

Les tableaux peuvent posséder une colonne et une clé primaire. Par contre ni la colonne, ni la clé primaire (index) ne peut être nommé.

La colonne peut être de n'importe quel type scalaire, mais la clé primaire doit être du type BINARY_INTEGER. Remarque : Les prochaines versions de PL/SQL pourront gérer des tableaux avec plusieurs colonnes nommées et possédant des clés primaires composés et de n'importe quel type.

4.4.1. La déclaration d'un tableau

Les tableaux PL/SQL doivent être déclarés en deux étapes : 1. Déclaration du type de la TABLE 2. Déclaration d'une table de ce type.

La syntaxe pour déclarer un type TABLE dans la partie déclarative d'un bloc est :

TYPE nom_type IS TABLE OF {typecolonne | variable%TYPE | table.column%TYPE } [NOT NULL] INDEX BY BINARY_INTEGER ;

M. WALID MELIANI

PAGE 10

SGBD ORACLE

nomtype : utilisé ensuite dans la déclaration des tables PL/SQL. typecolonne : type de données comme CHAR, DATE ou NUMBER.

Lorsque le type est déclaré, vous pouvez déclarer des tableaux de ce type, ainsi :

nom_tab nom_type ;

nom_tab : correspond à un tableau PL/SQL.

4.4.2. L'accès aux éléments d'un tableau

Pour accéder à un élément du tableau, vous devez spécifier une valeur de clé primaire en respectant la syntaxe suivant :

nom_tab(valeur_cle_primaire) ;

valeur_cle_primaire : doit être du type BINARY_INTEGER ( -231 -1 à 231 -1)

Pour affecter la valeur d'une expression PL/SQL à un élément du tableau utiliser la syntaxe suivante :

nom_tab(valeur_cle_primaire) := expression_plsql;

4.4.3. Exemple

DECLARE TYPE nom_tabtype IS TABLE OF CHAR(25) INDEX BY BINARY_INTEGER ; ... tnom nom_tabtype ; ... BEGIN ... tnom(1):='Dupont Marc' ; ... END ;

4.5. Les enregistrements prédéfinis (record PL/SQL)

La restriction posée par l'utilisation du type %ROWTYPE pour déclarer un enregistrement réside dans le manque de spécification des types de données au niveau de l'enregistrement.

L'implémentation du nouveau type composé nommé RECORD a permis la levée de cette restriction.

4.5.1. La déclaration d'un enregistrement

Par analogie aux tableaux PL/SQL, la déclaration d'un enregistrement se fait également en en deux étapes :

1. Déclaration du type de l'enregistrement 2. Déclaration de la variable sur le type défini.

M. WALID MELIANI

PAGE 11

SGBD ORACLE

Vous pouvez déclarer un type RECORD dans la partie déclarative d'un bloc, d'un sous-programme ou d'un package en utilisant la syntaxe suivante :

TYPE nom_type IS RECORD (champ {typechamp | table.column%TYPE } [NOT NULL], champ {typechamp | table.column%TYPE } [NOT NULL],...)

Publicité

nomtype : utilisé ensuite dans la déclaration des tables PL/SQL. typecolonne : type de données comme CHAR, DATE ou NUMBER.

Lorsque le type est déclaré, vous pouvez déclarer des enregistrements de ce type, ainsi :

nom_enr nom_type ;

nom_enr : correspond à un Record PL/SQL.

4.5.2. L'accès aux champs d'un enregistrement

Pour accéder à un élément d'une variable de type record, il suffit d'utiliser la syntaxe suivante :

nom_enr.nom_champ

Pour affecter la valeur d'une expression PL/SQL à un élément de l'enregistrement utiliser la syntaxe suivante :

nom_enr.nom_champ := expression_plsql;

4.5.3. Exemple

DECLARE TYPE ADRESSE IS RECORD ( Numero smallint, Rue char(35), CodePost char(5), Ville char(25), Pays char(30) ); TYPE CLIENT IS RECORD ( NumCli smallint, NomCli char(40), AdrCli ADRESSE, CA number) ; monclient CLIENT; BEGIN ... monclient.NumCli:=1234; monclient.NomCli:='Dupont SARL'; monclient.AdrCli.Numero:=10; END ;

M. WALID MELIANI

PAGE 12

SGBD ORACLE

5. Les structures de contrôles

5.1.

Affectation

5.1.1. Affectation simple

L’opérateur d’affectation directe est “:=”

numero := 0; numero := numero + 1;

5.1.2. Valeurs issues d'une base de données

On utilise l’opérateur INTO pour affecter une ou plusieurs valeurs issues d’une requête à une ou plusieurs variables.

SELECT codc, nomc INTO v_code, v_nom FROM client WHERE codc=100;

5.2.

Instruction d’Entrée/Sortie

5.2.1. Instructions d’entrée

La saisie d'une chaîne de caractères ou d’un nombre peut se faire par l’opérateur &. Oracle substitue la suite des caractères saisis à '&var' ou '%&var%'. Pour marquer la fin du paramètre de saisie, on peut mettre un point.

SELECT nomc, ville FROM CLIENT WHERE nom LIKE '%M&chaine.ET%';

On peut également saisir la valeur d’une variable globale avec l’instruction accept et cela en dehors du bloc PL/SQL. Cette commande suivie d’un nom de variable et la touche entrer vous donne la main pour saisir.

Pour utiliser la valeur de cette variable dans un bloc il suffit de la faire précéder par & uniquement si elle est numérique sinon si c’est une chaîne ou date il faut en plus l’encadrer par des côtes. SQL>accept Vnom SQL>Ben Salah

5.2.2. Instructions de Sortie

Pour afficher un message à l’écran il suffit d’utiliser la commande Prompt suivie d’un message. Cette commande est utilisée en dehors des blocs.

SQL>prompt Bonjour à tous ! SQL> Bonjour à tous !

Pour afficher des résultats on utilise le package (ensemble de procédures et fonctions) DBMS_OUTPUT. Tout d'abord, avant le bloc PL/SQL, on doit utiliser l'instruction : Set serveroutput on

Puis pour chaque affichage : dbms_output.put_line('texte'||X); -- (remarque : la concaténation de chaînes de caractères avec : ||)

M. WALID MELIANI

PAGE 13

SGBD ORACLE

5.2.3. Exemple:

SQL>Accept code SQL>600 SQL>SET SERVEROUTPUT ON

DECLARE V_ville varchar2(20) ; BEGIN SELECT ville INTO V_ville FROM Client WHERE codc=&code; DBMS_OUTPUT.PUT_LINE(‘La ville du client ‘|| ‘&code’||’:‘|| V_ville); END ; /

5.3. Les Traitements Conditionnels

Les instructions conditionnelles doivent permettre de contrôler le moment où des instructions sont exécutées.

Syntaxe :

IF condition_plsql Then commandes [Else commandes ] [ELSIF condition_plsql Then commandes [Else commandes ] ] END IF;

La condition peut utiliser les variables définies ainsi que tous les opérateurs présents dans SQL : =, <, >, <=, >=, <>, IS NULL, IS NOT NULL.

Else est utilisé si les instructions qui suivent ne possèdent pas de conditions. ELSIF est utilisé si les instructions qui suivent possèdent des conditions.

Exemple :

M. WALID MELIANI

PAGE 14

SGBD ORACLE

DECLARE vjob char(10); vnom emp.ename%type:='Miller'; message char(30);

BEGIN Select job into vjob from emp where ename=vnom;

-- contrôle de la valeur de vjob --

If vjob is NULL then message:= vnom || 'pas de travail'; elsif vjob='Vendeur' then update emp set comm=1000 where ename=vnom; message:= vnom || 'a 1000 Frs de commission'; else update emp set comm=0 where ename=vnom; message:= vnom || 'pas de commission '; end if; insert into resultat values (NULL,NULL,message); commit; END ; / select * from resultat;

5.4. Les Traitements Répétitifs

Les traitements répétitifs permettre de répéter une suite de comandes, sans en répéter les instructions.

PL/SQL nous offre la possibilité d'effectuer des traitements répétitifs grâce à trois types d'instructions.

5.4.1. L'instruction LOOP

Acronyme de boucle, LOOP permet de répéter une séquence de commandes. Cette séquence est comprise entre le mot-clé LOOP, indiquant le début d'une boucle et END LOOP, spécifiant sa fin.

Syntaxe :

BEGIN [<<Label>>] LOOP ... instructions ... END LOOP [<<Label>>]; END ;

M. WALID MELIANI

PAGE 15

Les commandes EXIT, EXIT WHEN condition et GOTO permettent de sortir de la Boucle.

SGBD ORACLE

Exemple :

DECLARE nombre number; BEGIN nombre:=0; LOOP nombre:=nombre+1; if nombre > 10 then exit; end if; END LOOP ; END ;

5.4.2. L'instruction FOR ... LOOP

La limitation des traitements répétitifs peut se faire en utilisant la clause FOR. Cette clause permet également d'incrémenter une variable.

Syntaxe :

[<<Label>>] FOR compteur IN [REVERSE] var_debut .. var_fin LOOP ... instructions ... END LOOP [<<Label>>];

compteur : est une variable de type entier, locale à la boucle. Sa valeur de départ est égale par défaut à la valeur de l'expression entière de gauche (var_debut). Elle s'incrémente de 1, après chaque traitment du contenu de la boucle, jusqu'à ce qu'il atteigne la valeur de droite (var_fin).

Le mot clé REVERSE permet d'utiliser une décrémentation de 1, en prenant comme valeur initiale celle de l'expression entière de droite et comme valeur de fin celle de l'expression entière de gauche.

Il est possible d'arréter la boucle avant sa fin normale par une commande EXIT conditionnelle.

5.4.3. L'instruction WHILE ... LOOP

La clause While permet d'exécuter le contenu d'une boucle tant que la condition est vérifiée. Syntaxe :

M. WALID MELIANI

PAGE 16

SGBD ORACLE

WHILE condition_plsql LOOP ... instructions ... END LOOP ;

La condition est une expression définie en combinant les opérateurs : <, >, = , !=, <=, >=; and, or ... Expression est une constante, une variable, le résultat d'une fonction.

Exemple : DECLARE salaire emp.sal%type; manager emp.mgr%type; nom emp.ename%type; num_debut constant number(4):=7902; BEGIN select sal, mgr, ename into salaire, manager, nom from emp where empno=num_debut; WHILE salaire < 4000 LOOP select sal, mgr, ename into salaire, manager, nom from emp where empno=manager; END LOOP ; insert into resultat values (NULL,Salaire,Nom); commit; END ;

6. La Gestion des erreurs

Le mécanisme de gestion d'erreurs dans PL/SQL est appelé gestionnaire des exceptions. Il permet au développeur de planifier sa gestion et d'abandonner ou de continuer le traitement en présence d'une erreur.

Il faut affecter un traitement approprié aux erreurs apparues dans un bloc PL/SQL.

C'est pourquoi on distingue 2 types d'erreurs ou d'exceptions : § Erreur interne Oracle (Sqlcode = 0) : dans ce cas la main est rendue directement

au système environnant.

§ Anomalie déterminée par l'utilisateur.

La solution :

1. Donner un nom à l'erreur (si elle n'est pas déjà prédéfinie), 2. Définir les anomalies utilisateurs, leur associer un nom, 3. Définir le traitement à effectuer.

6.1.

Publicité

Les exceptions internes

Une erreur interne est produite quand un bloc PL/SQL viole une règle d'Oracle ou dépasse une limite dépendant du système d'exploitation.

M. WALID MELIANI

PAGE 17

SGBD ORACLE

Les erreurs Oracle générées par le noyau sont numérotées, or le gestionnaire des exceptions de PL/SQL, ne sait que gérer des erreurs nommées. Pour cela PL/SQL a redéfini quelques erreurs Oracle comme des exceptions. Ainsi, pour gérer d'autres erreurs Oracle, l'utilisateur doit utiliser le gestionnaire OTHERS ou EXCEPTION_INIT pour nommer ces erreurs.

Les exceptions fournies par Oracle sont regroupées dans ce tableau :

Nom d'exception

Valeur SqlCode

CURSOR_ALREADY_OPEN DUP_VAL_ON_INDEX INVALID_CURSOR INVALID_NUMBER LOGIN_DENIED NO_DATA_FOUND NOT_LOGGED_ON PROGRAM_ERROR STORAGE_ERROR TIMEOUT_ON_RESOURCE TOO_MANY_ROWS TRANSACTION_BACKED_OUT VALUE_ERROR ZERO_DIVIDE

-6511 -1 -1001 -1722 -1017 -1403 -1012 -6501 -6500 -51 -1422 -61 -6502 -1476

Erreur Oracle ORA-06511 ORA-00001 ORA-01001 ORA-01722 ORA-01717 ORA-01413 ORA-01012 ORA-06501 ORA-06500 ORA-00051 ORA-01422 ORA-00061 ORA-06502 ORA-01476

OTHERS : toutes les autres erreurs non explicitement nommées.

Pour gérer les exceptions, le développeur doit écrire un gestionnaire des exceptions qui prend le contrôle du déroulement du bloc PL/SQL en présence d'une exception.

Le gestionnaire d'exception fait partie du bloc PL/SQL et se trouve après les commandes. Il commence par le mot clé EXCEPTION et se termine avec le même END du bloc.

Chaque gestion d'exception consiste à spécifier son nom d'erreur après la clause WHEN et la séquence de la commande à exécuter après le mot clé THEN, comme le montre l'exemple suivant :

Exemple : Utilisation des erreurs prédéfinies

M. WALID MELIANI

PAGE 18

SGBD ORACLE

DECLARE wsal emp.sal%type;

BEGIN select sal into wsal from emp;

EXCEPTION WHEN TOO_MANY_ROWS then ... ; -- gérer erreur trop de lignes WHEN NO_DATA_FOUND then ... ; -- gérer erreur pas de ligne WHEN OTHERS then ... ; -- gérer toutes les autres erreurs END ;

Remarques : L'exception optionnelle OTHERS est toujours située à la fin des exceptions. Pour rattacher une séquence de commandes à plus d'une exception, l'utilisateur peut utiliser l'opérateur booléen OR comme suit : WHEN erreur1 OR erreur2 THEN -- gérer erreur12

6.2. Les exceptions utilisateurs (externes)

PL/SQL permet à l'utilisateur de définir ses propres exceptions. La gestion des anomalies utilisateur peut se faire dans un bloc PL/SQL en effectuant les opérations suivantes :

1. Nommer l'anomalie (type exception) dans la partie Declare du bloc.

DECLARE Nom_ano Exception;

2. Déterminer l'erreur et passer la main au traitement approprié par la commande Raise.

BEGIN ... If (condition_anomalie) then raise Nom_ano ;

3. Effectuer le traitement défini dans la partie EXCEPTION du Bloc.

EXCEPTION WHEN (Nom_ano) then (traitement);

Exemple : Utilisation des erreurs prédéfinies et nommées

M. WALID MELIANI

PAGE 19

SGBD ORACLE

DECLARE wsal emp.sal%type; sal_zero Exception; BEGIN select sal into wsal from emp; if wsal=0 then raise sal_zero end if;

EXCEPTION WHEN sal_zero then -- gérer erreur salaire WHEN TOO_MANY_ROWS then ... ; -- gérer erreur trop de lignes WHEN NO_DATA_FOUND then ... ; -- gérer erreur pas de ligne WHEN OTHERS then ... ; -- gérer toutes les autres erreurs END ;

Le développeur peut utiliser les fonctions Sqlcode et Sqlerrm pour coder les erreurs Oracle en Exception. Sqlcode est une fonction propre à PL/SQL qui retourne le numéro (généralement négatif) de l'erreur courante. Sqlerrm reçoit en entrée le numéro de l'erreur et renvoie en sortie le message de l'erreur codé sur 196 octets.

7. Les curseurs en PL/SQL

Pour traiter une commande SQL, PL/SQL ouvre une zone de contexte pour exécuter la commande et stocker les informations.

7.1. Définition

Le curseur permet de nommer cette zone de contexte, d'accéder aux informations et éventuellement de contrôler le traitement. Cette zone de contexte est une mémoire de taille fixe, utilisée par le noyau pour analyser et interpréter tout ordre Sql. Les statuts d'exécution de l'ordre se trouve dans le curseur.

7.2. Les types de curseurs

§ Le curseur explicite Il est créé et géré par l'utilisateur pour traiter un ordre Select qui ramène plusieurs lignes. Le traitement du select se fera ligne par ligne.

M. WALID MELIANI

PAGE 20

SGBD ORACLE

§ Le curseur implicite Il est généré et géré par le noyau pour les autres commandes Sql.

7.3. Les étapes d'utilisation d'un curseur explicite

Pour traiter une requête qui retourne plusieurs lignes, l'utilisateur doit définir un curseur qui lui permet d'extraire la totalité des lignes sélectionnées.

L'utilisation d'un curseur pour traiter un ordre Select ramenant plusieurs lignes, nécessite 4 étapes :

1. Déclaration du curseur 2. Ouverture du curseur 3. Traitement des lignes 4. Fermeture du curseur.

7.3.1. La déclaration d'un curseur

La déclaration du curseur permet de stocker l'ordre Select dans le curseur.

La syntaxe de définition : Le curseur se définit dans la partie DECLARE d'un bloc PL/SQL.

Cursor nomcurseur [(nomparam type [,nomparam type, ...)] IS commande SELECT ;

Exemple :

DECLARE Cursor DEPT10 is select ename, sal from emp where depno=10;

7.3.2. L'ouverture et la fermeture du curseur

L'étape d'ouverture permet d'effectuer : 1. l'allocation mémoire du curseur ; 2. l'analyse sémantique et syntaxique de l'ordre (parsing) ; 3. le positionnement de verrous éventuels (si select for update...)

L'étape de fermeture permet d'effectuer : la libération de la place mémoire.

La syntaxe : Dans la partie traitement du bloc PL/SQL Avoir préalablement déclaré le curseur pour l'ouvrir Avoir préalablement ouvert le curseur pour le fermer

M. WALID MELIANI

PAGE 21

OPEN nomcurseur [(nomparam type [,nomparam type, ...)]

SGBD ORACLE

/* traitement des lignes */

CLOSE nomcurseur

Exemple :

Begin ... OPEN DEPT10 /* traitement des lignes */ CLOSE DEPT10

7.3.3. Le traitement des lignes

Il faut traiter les lignes une par une et renseigner les variables réceptrices définies dans la partie Declare du bloc.

Syntaxe : Dans la partie traitement du bloc Pl/Sql Avoir préalablement ouvert le curseur puis

FETCH nomcurseur INTO { nomvariable [,nomvariable] ... | nomrecord }

L'ordre fetch ne ramène qu'une seule ligne à la fois.

De ce fait il faut recommencer l'ordre pour traiter la ligne suivante. Exemple :

Begin OPEN DEPT10 LOOP FETCH DEPT10 into vnom, vsalaire; /* traitement ligne */ END LOOP;

7.4. Les attributs d'un curseur

Les attributs d'un curseur nous fournissent des informations quant à l'exécution de l'ordre. Elles sont conservées par Pl/Sql après l'exécution du curseur (explicite ou implicite).

Ces attributs permettent de tester directement le résultat de l'exécution.

Tous les attributs ont un nom.

M. WALID MELIANI

PAGE 22

SGBD ORACLE

Curseur implicite

Curseur explicite :

Sql%Found Sql%Notfound Sql%Isopen Sql%Rowcount

Nomcurseur%Found Nomcurseur%Notfound Nomcurseur%Isopen Nomcurseur%Rowcount Nomcurseur%Rowtype

7.4.1. L'attribut %Found

Signification Cet attribut est de type booléen : soit vrai, soit faux. Le curseur implicite est vrai si les instructions insert, update, delete traitent au moins une ligne. Le curseur explicite est vrai si le Fe