Vous êtes sur la page 1sur 20

Le langage PL/SQL

LE LANGAGE PL/SQL 1 / INTRODUCTION :


SQL est un langage complet pour travailler sur une base de donne relationnelle, mais il ne comporte pas des instructions procdurales. PL/SQL comprend quant lui : v v v v v La partie LID (Langage dInterrogation des donnes) de SQL (Select), la partie LMD (Langage de Manipulation des Donnes) de SQL (Update, Insert,) la gestion des transaction (Commit, Rollback) les fonctions standard de SQL plus une partie procdurale (IF, WHILE,) PL/SQL est donc un langage algorithmique complet REMARQUE : PL/SQL ne comporte pas dinstructions de LDD (Create, Alter)

2/ STRUCTURE DUN BLOC PL/SQL


PL/SQL n'interprte pas une commande, mais un ensemble de commandes contenues dans un programme ou bloc PL/SQL. La structure dun bloc est la suivante: DECLARE Dclarations de variables, constantes, exception; BEGIN Section obligatoire contenant des instructions SQL et PL/SQL ou des blocs fils (Possibilits dimbrication de blocs) EXCEPTION Traitement des exceptions (gestion des erreurs) END;

REMARQUES : Les sections Declare et Exception sont optionnelles Chaque instruction de nimporte quelle section doit se terminer par un ;

MH

Page 1 sur 20

UIMA

Le langage PL/SQL

Exemple dun bloc PL/SQL : DECLARE qte_stock number(5); BEGIN Select quantite into qte_stock from PRODUITS where codprod= p1; -- contrle du stock suffisant If qte_stock > 0 then update produits set quantite=quantite-1 where codprod= p1; Insert into achat values (p1', SYSDATE) else Insert into acheter values ('Plus de p1',SYSDATE); end If, commit, END;

3/. LES DECLARATIONS PL/SQL


La partie dclarative dans un bloc PL/SQL, peut comporter trois types de dclarations. Elle est dlimite par les mots-cl : v DECLARE, qui spcifie le dbut de la dclaration des variables et v BEGIN, qui signifie la fin de la dclaration et le dbut de la partie des commandes. v Les types de dclarations possibles dans cette partie sont les suivants : dclaration des variables et des constantes, dclaration de curseurs, dclaration des exceptions.

3.1 Types de donnes

Chaque variable ou constante utilise dans un bloc PL/SQL, possde un type de donnes. PL/SQL offre deux varits de types de donnes prdfinies : scalaire et compos. Les types scalaires : Binary_integer : entiers entre 231 et 231 -1 Number : un numrique Positive : entiers positifs Natural : entiers naturels Decimal , float, integer, real sont des sous-types de number Char : chane de caractre taille fixe allant jusqu 32 767 caractre (au lieu de 255 dans la dfinition des colonnes des tables) Varchar2 : est une chane de caractre de longueur variable allant jusqu 32 767 (au lieu de 2000 dans la dfinition des colonnes des tables) Boolean : type boolen ses valeurs possibles sont TRUE, FALSE, NULL Date : type date dOracle Rowid : type interne Oracle compos de 6 octets qui permet didentifier une ligne unique dune table et doffrir un accs rapide aux donnes. Les types Composs : Record : cest le type enregistrement MH Page 2 sur 20 UIMA

Le langage PL/SQL

Table : cest le type tableau

3.2 Variables et constantes


La dclaration d'une variable consiste allouer un espace pour stocker et modifier une valeur. elle est type et peut recevoir une valeur par dfaut et/ou un statut NOT NULL. Une constante est dfinie comme une variable, mais l'utilisateur ne peut pas modifier son contenu.

3.2.1. La dfinition des variables en PL/SQL


Les variables se dfinissent dans la partie DECLARE, du bloc PL/SQL en utilisant la syntaxe suivante : nomvariable [CONSTANT] {type | variable%TYPE | colonne_de_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 dfinition. On peut faire rfrence une colonne d'une table par la dclaration : nom_variable TABLE.COLONNE%TYPE, On peut faire rfrence une ligne d'une table par la dclaration Nom_variable TABLE%ROWTYPE, On peut faire rfrence une variable prcdemment dfinie par l'instruction Nom_variable Pnom variable%TYPE L'initialisation d'une variable se fait par l'oprateur := suivi d'une constante, d'une expression PL/SQL, d'une fonction PL/SQL. Les variables peuvent galement tre dfinies dans l'environnement extrieur au Bloc PL/SQL par exemple comme des champs de l'cran en Form Builder. Ces variables seront utilises prfixes de':'. Exemples de dclaration de variables : Total NUMBER(9,3); Nom CHAR(4) := ISET; Longeur NUMBER NOT NULL := LENGTH (Nom)*2; Date_Cration DATE; Numro EMPLOYE.EMPNO%TYPE; Dpt DEPARTEMENT%ROWTYPE; Prnom Nom%TYPE; Pi CONSTANT NUMBER:= 3.14;

MH

Page 3 sur 20

UIMA

Le langage PL/SQL

3.2.2 Laffectation des variables PL/SOL


Deux possibilits daffectation ou dassignement sont disponibles: par l'oprateur d'affectation:':=', par la clause Select ... Into La difficult dans l'utilisation de la clause Select rsulte du nombre de lignes ou d'occurrences retourn. Si le Select retourne une et une seule valeur l'affectation s'effectue correctement. Par contre Si le SELECT ne retourne aucune ligne, lerreur PL/SQL NO_DATA_FOUND sera gnre. Si le SELECT retourne plusieurs lignes : lerreur TOO_MANY_ROWS sera gnre.

3.3. Les tableaux en PL/SQL


Nous avons vu prcdemment que le langage PL/SQL fournit deux types d'objets composs: les tableaux (TABLE), les enregistrements (RECORD). Les tableaux sont conus comme les tables de la base de donnes. Ils possdent une cl primaire(index) pour accder aux lignes du tableau. Un tableau, comme une table, ne possde pas de limite de taille. De cette faon, le nombre d'lments d'un tableau va crotre dynamiquement.

3.3.1 La dclaration d'un tableau


Les tableaux PL/SQL doivent tre dclars en deux tapes. 1.Dclaration du type de la TABLE 2.Dclaration dune table de ce type. On peut dclarer un type TABLE dans la partie dclarative d'un bloc ou d'un sous-programme en utilisant la syntaxe suivante : TYPE nom_type IS TABLE OF {typecolonne | variable%TYPE | table.colonne%TYPE} [NOT NULL] INDEX BY BINARY_INTEGER ; Norn_type : utilis ultrieurement dans la dclaration des tables PL/SQL. typecolonne : type de donnes comme CHAR, DATE, ou NUMBER.

MH

Page 4 sur 20

UIMA

Le langage PL/SQL

Lorsque le type est dclar, on peut dclarer des tableaux de ce type de la faon suivante : Nom_tab nom_type ;

3.3.2 L'accs aux lments d'un tableau


Pour accder un lment du tableau, on doit spcifier une valeur de cl primaire en respectant la syntaxe suivante : Nom_tab(valeur_cl_primaire) ; Valeur_cl_primaire : doit tre du type BINARY_INTEGER Pour affecter la valeur d'une expression PL/SQL un lment du tableau, on doit utiliser la syntaxe suivante : nom_tab(valeur_cl_primaire) := expression_Pl/sql ; Exemple : DECLARE TYPE nom_tab_type IS TABLE OF CHAR(25) INDEX BY BINARY-INTEGER; tab_nom nom_tab_type ;

BEGIN tab_nom(l):='TUNISIE'; END;

3.4. Les enregistrements prdfinis (record PL/SOL)


La restriction pose par l'utilisation du type %ROWTYPE pour dclarer un enregistrement rside dans le manque de spcification des types de donnes au niveau de l'enregistrement. L'implmentation du nouveau type compos nomm RECORD a permis de lever cette restriction.

3.4.1 La dclaration d'un enregistrement


Comme les tableaux PL/SQL, la dclaration d'un enregistrement se fait en deux tape

MH

Page 5 sur 20

UIMA

Le langage PL/SQL

1. Dclaration du type de l'enregistrement 2. Dclaration de la variable du type dfini. On peut dclarer un Type RECORD dans la partie dclarative d'un bloc ou d'un sousprogramme en utilisant la syntaxe suivante: TYPE nom_type IS RECORD (champ {type_champ | table.colonne%TYPE [NOT NULL], champ (type_champ | table.colonne%TYPE [NOT NULL],...) nomtype : utilis ensuite dans la dclaration des enregistrements PL/SQL. Type-champ : type de donnes comme CHAR, DATE ou NUMBER. Lorsque le type est dclar,On peut dclarer des enregistrements de ce type de la faon suivante : Nom_erg nom_type ;

3.4.2 L'accs aux champs d'un enregistrement


Pour accder un lment d'une variable de type record, il suffit d'utiliser la syntaxe suivante Nom_erg.nom_champ Pour affecter la valeur d'une expression PL/SQL un lment de l'enregistrement, on doit utiliser la syntaxe suivante : Nom_erg.nom_champ := expression_pl/sql; Exemple : DECLARE TYPE ADRESSE IS RECORD (Numero positive, Rue varchar2(35), CodePost char(5), Ville varchar2(25), Pays varchar2(30) ); TYPE CLIENT IS RECORD (NumCIi positive, NomCli varchar2(40), Adrcli ADRESSE, CA number(12,3)); monclient CLIENT ; BEGIN monclient.NumCIi := 1234; monclient.NomCIi := Ben HUSSEIN; monclient.AdrCli.Numero := 10; END ;

MH

Page 6 sur 20

UIMA

Le langage PL/SQL

4 STRUCTRES DE CONTROLE
4.1. Les traitements Conditionnels
IF condition_plsql THEN commandes [ELSE commandes] [ELSIF condition_plsql THEN commandes [ELSE commandes]] END IF; La condition peut utiliser les variables dfinies ainsi que tous les oprateurs prsents dans SQL =,<,>,<=,>=,<>, IS NULL, IS NOT NULL. Exemple : DECLARE vjob CHAR(10); vnom employs.ename%type := BEN SALAH ; msg CHAR(30) ; BEGIN Select job into vjob from employs where ename = vnom; --contrle de la valeur de vjob if vjob is NULL then msg := vnom || pas de travail'; elsif vjob = Vendeur then UPDATE employs set comm = 100 where ename=vnom ; Msg := vnom || a 100 dinars de commission ; Else UPDATE employs set comm = 0 where ename=vnom ; Msg := vnom || na pas de commission ; End if ; DBMS_OUTPUT.PUT_LINE(msg) ; commit; END ;

4.2 Les Traitements.Rptitifs


4.2.1. linstruction LOOP
LOOP permet de rpter une squence de commandes. Cette squence est comprise entre le mot-cl LOOP, indiquant le dbut dune boucle et END LOOP, spcifiant sa fin. Syntaxe : LOOP instructions END LOOP ;

MH

Page 7 sur 20

UIMA

Le langage PL/SQL

Les commandes EXIT,EXIT WHEN condition permettent de quitter la boucle. Exemple : DECLARE somme number(10) := 0 ; nombre number(5); BEGIN nombre:=0;

LOOP
Nombre:=nombre+1 ; somme := somme + nombre ; if nombre>=10 then EXIT; end if ; END LOOP; DBMS_OUTPUT.PUT_LINE(la somme des 10 premiers entiers est || to_char(somme)); END;

4.2.2. L'instruction FOR LOOP


FOR compteur IN [REVERSE] var_debut.. var_fin LOOP instructions END LOOP ; compteur. est une variable de type entier, locale la boucle. Sa valeur de dpart est gale par dfaut la valeur de l'expression entire de gauche (var_debut). Elle s'incrmente de 1, aprs chaque traitement du contenu de la boucle, jusqu' ce qu'elle atteigne la valeur de droite (var_fin).

5. LES CURSEURS EN PL/SQL


Pour traiter une commande SQL, PL/SQL ouvre une zone de contexte pour excuter les commandes et stocker les informations.

5.1. Dfinition

Le curseur permet de nommer cette zone de contexte, d'accder aux informations et ventuellement de contrler le traitement. Cette zone de contexte est une mmoire de taille fixe, utilise par le noyau pour analyser et interprter tout ordre SQL.

5.2. Les types de curseurs

v Le curseur explicite Il est cr et gr par l'utilisateur pour traiter un ordre Select qui ramne plusieurs lignes. Le traitement du select se fera ligne par ligne. v Le curseur implicite Il est gnr et gr par le noyau pour les autres commandes SQL.

MH

Page 8 sur 20

UIMA

Le langage PL/SQL

5.3. Les tapes d'utilisation d'un curseur explicite


Pour traiter une requte qui retourne plusieurs lignes, l'utilisateur doit dfinir un curseur qui lui permet dextraire la totalit des lignes slectionnes. Lutilisation d'un curseur pour traiter un ordre Select ramenant plusieurs lignes, ncessite 4 tapes: 1. Dclaration du curseur 2. Ouverture du curseur 3. Traitement des lignes 4. Fermeture du curseur.

5.3.1. La dclaration d'un curseur


La dclaration du curseur permet de stocker l'ordre Select dans le curseur. La Symtaxe de dfinition.. Le curseur se dfinit dans la partie DECALRE d'un bloc PL/SQL. Cursor nomcurseur [(nomparam type [,nomparam type, ...)] IS Commande_SELECT Exemple : Declare Cursor DEPT_10 is select ename, sal from emp where depno = 10;

5.3.2. L'ouverture et la fermeture dun curseur


L'tape d'ouverture permet d'effectuer: 1. l'allocation mmoire du curseur, 2. l'analyse smantique et syntaxique de l'ordre 3. le positionnement de verrous ventuels (si select for update...) L'tape de fermeture permet de librer la place mmoire rserve. La syntaxe : OPEN nomcurseur [(nomparam1[,nomparam2 , ...)] /* traitement des lignes */ CLOSE nomcurseur Exemple : Begin OPEN DEPT_10 /* traitement des lignes*/ CLOSE DEPT_10

MH

Page 9 sur 20

UIMA

Le langage PL/SQL

5.3.3. Le traitement des lignes


Il faut traiter les lignes une par une et renseigner les variables rceptrices dfinies dans la partie Declare du bloc. La syntaxe : Dans la partie traitement du bloc.PL/Sql, il faut commencer par ouvrir le curseur puis FETCH nomcurseur INTO {nomvariable [,nomvariable] | nomrecord}

Lordre fetch ne ramne quune seule ligne la fois. De ce fait il faut recommencer lordre pour traiter la ligne suivante. Exemple : Declare Cursor DEPT_10 is select ename, sal from emp where depno = 10; Vnom emp.name%TYPE ; Vsalaire emp.sal%TYPE ; Begin OPEN DEPT_10; LOOP FETCH DEPT10 into vnom,vsalaire ; --Traitement ligne END LOOP ; CLOSE DEPT_10; End;

5.4 Les attributs dun curseur


Les attributs dun curseur nous fournissent des informations sur lexcution dun ordre. Ils sont conservs par PL/SQL aprs lexcution du curseur (implicite ou explicite) Ces attributs permettent de tester directement le rsultat de lexcution. Ils sont rsums dans le tableau suivant :

MH

Page 10 sur 20

UIMA

Le langage PL/SQL

Curseurs implicites Sql%Found Sql%Notfound Sql%Isopen Sql%Rowcount Sql%Rowtype

Curseurs explicites Nomcurseur%Found Nomcurseur %Notfound Nomcurseur %Isopen Nomcurseur %Rowcount Nomcurseur %Rowtype

5.4.1 lattribut %Found


cet attribut est de type boolen (vrai ou faux) Pour les curseurs implicites, cet attribut est vrai si les instructions insert, update, delete traitent au moins une ligne. Pour les curseurs explicites, il est vrai si le fetch ramne au moins une ligne. Exemple : Declare CURSOR num_cur1 IS SELECT num from tab1 ; CURSOR num_cur2 IS SELECT num from tab2 ; Num1 number ; Num2 number ; somme number := 0; Begin OPEN num_cur1 ; OPEN num_cur2 ; LOOP FFTCH num_cur1 INTO num1 ; FFTCH num_cur2 INTO num2; IF (num_cur1%Found) AND (num_cur2%Found) THEN somme:= num1 + num2 ; INSERT INTO sum_tab VALUES (somme); ELSE Exit ; END IF; END LOOP; CLOSE numl_cur1 ; CLOSE mun_cur2 ; COMMIT; END;

5.4.2. L'attribut %NotFound


cet attribut est de type boolen (vrai ou faux) Pour les curseurs implicites, cet attribut est vrai si les instructions insert, update, delete ne traitent aucune ligne. Pour les curseurs explicites, il est vrai si le fetch ne ramne plus de ligne.

MH

Page 11 sur 20

UIMA

Le langage PL/SQL

Exemple : Declare CURSOR num_cur1 IS SELECT num from tab1 ; CURSOR num_cur2 IS SELECT num from tab2 ; Num1 number ; Num2 number ; somme number := 0; Begin OPEN num_cur1 ; OPEN num_cur2 ; LOOP FFTCH num_cur1 INTO num1 ; FFTCH num_cur2 INTO num2; EXIT WHEN (num_cur1%NotFound) OR (num_cur2%NotFound) ; somme:= num1 + num2 ; INSERT INTO sum_tab VALUES (somme); END LOOP; CLOSE numl_cur1 ; CLOSE mun_cur2 ; END;

5.4.3. L'attribut %IsOpen


Cet attribut est de type boolen soit vrai, soit faux. Le curseur implicite est toujours faux car Oracle referme toujours les curseurs qu'il ouvre aprs chaque utilisation. Le curseur explicite est vrai si le curseur est ouvert. Exemple : Declare Cursor Dept10 is Select ename, sal from emp where deptno=10; Begin If not (Dept10%lsopen) then open Dept10 ; End if, Fetch Dept10 into --traitement End ;

5.4.4.'L'attribut %RowCount
Cet attribut est de type numrique. Le curseur implicite indique le nombre de lignes traits par les ordres insert, update, delete. Le curseur explicite est incrment chaque ordre fetch, donc cet attribut traduit la nime ligne traite.

MH

Page 12 sur 20

UIMA

Le langage PL/SQL

Exemple Declare cursor C1 is select ename, empno, sal from emp order by sal desc ; nom char(10); numero number(4); salaire number(7,2); Begin Open Cl; Loop . Fetch cl into nom, numro, salaire ; exit when (c1%rowcount > 25) or (cl%notfound); insert into temp values (salaire, numro, nom); End Loop; Close C1 ; commit ; End;

5.4.5. L'attribut %Rowtype


Cet attribut permet la dclaration implicite d'une structure dont les lments sont d'un type identique aux colonnes ramenes par le curseur. Syntaxe : Dans la partie dclarative du bloc. CURSOR nomcurseur IS ordre select; nomrecord nomcurseur%Rowtype; Les lments de la structure sont identifis par:nomrecord.nomcolonne La structure est renseigne par le Fetch : Fetch nomcurseur into nomrecord;

Exemple
Declare /* la fonction nvl permet de tester la valeur Null d'une colonne si comm=NULL alors nvl retourne 0 sinon nvl retourne la valeur de comm */ cursor c1 is select sal + nvl(comm) saltot, ename from emp; /* l'enregistrement comporte deux colonnes: saltot, ename c1_record c1%Rowtype; Begin open c1; Loop Fetch c1 into c1_record; Exit when c1 %notfound ;

MH

Page 13 sur 20

UIMA

Le langage PL/SQL

if c1_record.saltot > 2000 then insert into temp values (c1_record.saltot, c1_record.ename); end if, End Loop; close c1; End;

5.5. Les boucles et les curseurs


L'objectif est de fournir au programmeur une structure simple et efficace pour utiliser les structures de boucle et les curseurs. Declare Cursor nomcurseur is ordre_select ; Begin For nomrecord in nomcurseur Loop /* traitement End Loop; End; Le bloc PL/SQL ci-dessus permet d'obtenir une gnration implicite de la structure suivante : Declare Cursor nomcurseur is ordre_select; nomrecord nomcurseur%rowtype; Begin Open nomcurseur ; Loop Fetch nomcurseur into nomrecord ; Exit when nomcurseur%notfound ; /* traitement End Loop; Close nomcurseur; End;

5.6. Le curseur paramtre


Il permet d'utiliser des variables dans le curseur. Principalement dans la clause where. Il faut pour cela spcifier les noms et les types des paramtres dans la dclaration du curseur. Cursor nomcurseur (paraml type, param2 type,...) is select ordre_select , L'ordre_select utilise les paramtres. Les types possibles sont : char, number, date, boolean sans spcifier la longueur. Begin Open nomcurseur (valeurl , vaieur2, ....) ;

MH

Page 14 sur 20

UIMA

Le langage PL/SQL

Exemple : Declare cursor c1 (depart number) is select sal, nvl(comm,0) commi from emp where deptno=depart ; total number(11,2) := 0 ; sal_sup number(4):=0 ; comm_sup number(4):=0; Begin for c1_rec in c1(20) Loop total:= total+ c1_rec.sal + c1_rec.commi ; if c1_rec.sal > 4000 then sal_sup := sal_sup + 1 ; end if ; if c1_rec.commi > 3000 then commi_sup:=commi_sup+1 ; end if; End Loop; insert into temp values (sal_Sup, comm_sup, 'total salaire||to_Char(total)); commit ; End;

5.7. La clause "current of"


Cette clause permet d'accder directement la ligne ramene par l'ordre Fetch afin de la traiter (update, delete). v Il faut se rserver la ligne lors de la dclaration du curseur par le positionnement d'un verrou d'intention : (For update of nom_colonne) v Il faut spcifier que l'on veut traiter la ligne courante au Fetch par la clause :(Where current of nom_curseur) Exemple : Declare Cursor cl is select ename, sal from emp for update of sal ; Begin For c1_record in c1 Loop If c1_ record.sal > 1500 then insert into resultat values (c1_record.sal, c1_record.sal*1.3, c1_record.ename); update emp set sal = sal * 1.3 where current of c1 ; end if, End loop ; Commit; End ;

MH

Page 15 sur 20

UIMA

Le langage PL/SQL

6 Utilisation de sous-programmes
PL/SQL accepte aussi lutilisation de sous-programmes, nomms procdures et fonctions. Une procdure PL/SQL excute certaines actions et peut accepter des paramtres optionnels. Une fonction PL/SQL retourne une valeur dun certain type et peut aussi accepter des paramtres optionnels.

6.1 Dclaration dune procdure


La syntaxe de dclaration dune procdure est : PROCEDURE nom_procdure [(paramtre1 [, pramtreN ] IS [dclaration des variables locales] BEGIN Instructions PL/SQL [section_exception ] END [nom_procdure] Paramtre1 paramtreN reprsentent la dclaration des paramtres de la procdure sous la forme : nom_paramtre [IN|OUT|IN OUT] type_donnes [ { :=|default } valeur]. dclaration des variables locales reprsentent les dclarations optionnelles de variables, de constantes, de fonctions et de procdures locales la procdure. section_exception est la section optionnelle de gestion des exceptions de la procdure. Exemple : Declare Vpatient_ID Patient.Patient_ID%type ; Fivre_eleve constant real := 42 ; Procedure enregistrer_Temp_Deg_C_Patient (patient_ID varchar2, Temp_Corps_Deg_C real) is Temp_Deg_F real ; Begin Temp_Deg_F := (9/5)* Temp_Corps_Deg_C + 32 ; Insert into Patient (Patient_ID, Temp_Corps_Deg_F) Values (patient_ID, Tem_Deg_F) ; Commit ; End ; Begin Vpatient_ID := ES8888 ; enregistrer_Temp_Deg_C_Patient (Vpatient_ID, Fivre_eleve) ; End ;

MH

Page 16 sur 20

UIMA

Le langage PL/SQL

6.2 Dclaration dune fonction


La syntaxe de dclaration dune fonction est : FUNCTION nom_fonction[(paramtre1 [, pramtreN ] RETURN type_donnes_fonction IS [dclaration des variables locales] BEGIN Instructions PL/SQL RETURN val__retourne [section_exception ] END [nom_fonction] Exemple : Soit lextrait suivant dune base de donnes relationnelle dune application de gestion de scolarit dune universit : Etudiant(codetu, nometu,adretu) Matire(codmat, description_mat, coefmat) Moyenne(codetu,codmat, moyenne_mat) La fonction meilleur_tu_mat retourne le code du meilleur tudiant dune matire donne. Declare Codmatire Matire.codmat%type; Vcode_etu etudiant.codetu%type; FUNCTION meilleur_tu_mat (pcodmat varchar2) RETURN varchar2 IS Vcodetu etudiant.codeetu%type ; BEGIN Select codetu into Vcodetu From Moyenne M Where M.moyenne_mat in (Select max(moyenne_mat from Moyenne M Where M.codmat=pcodmat); Return Vcodetu; End ; Begin Codmatire := M001; Vcode_etu := meilleur_tu_mat(Codmatire); DBMS_OUTPUT.PUT_LINE(Le meilleur tudiant de la matire || Codmatire || est : || Vcode_etu); End ;

MH

Page 17 sur 20

UIMA

Le langage PL/SQL

6.3 Paramtres de procdure et fonction


Un ou plusieurs paramtres peuvent tre passs une procdure ou une fonction, de trois faons : IN, OUT ou IN OUT Exemple :

Declare Param1 number ; Param2 number ; Param3 number ; Procedure Diffrents_Param(P1 IN number, P2 OUT number, P3 IN OUT number) Is Begin P2 := P1 ; P3 := P3 + 1 ; END ; Begin Param1 := 3.14 ; Param3 := 15 ; Diffrents_Param(Param1, Param2, Param3) ; DBMS_OUTPUT.PUT_LINE('param1 = ' || to_char(param1) || 'param2 = ' || to_char(param2) || 'param3 = ' || to_char(param3) ); End ;

7. GESTION DES ERREURS


Le mcanisme de gestion d'erreurs dans PL/SQL est appel gestionnaire des exceptions. Il permet au programmeur de planifier sa gestion et d'abandonner ou de continuer le traitement en prsence 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 : 1. Erreur interne Oracle (Sqlcode <= 0) : dans ce cas la main est rendue directement au systme environnant. 2. Anomalie dtermine par 1'utilisateur. La solution : 1. Donner un nom l'erreur (si elle n'est pas dj prdfinie), 2. Dfinir les anomalies utilisateurs, leur associer un nom, 3. Dfinir le traitement effectuer.

7.1. Les exceptions internes


Une erreur interne est produite quand un bloc PL/SQL viole une rgle d'Oracle ou dpasse une limite dpendant du systme d'exploitation. Les erreurs Oracle gnres par le noyau sont numrotes, or le gestionnaire des exceptions de PL/SQL, ne sait que grer des erreurs nommes. Pour cela PL/SQL a redfini quelques erreurs Oracle comme des exceptions. Ainsi, pour grer d'autres erreurs Oracle, 1'utilisateur doit utiliser le gestionnaire OTHERS ou EXCEPTION_INIT pour nommer ces erreurs. MH Page 18 sur 20 UIMA

Le langage PL/SQL

Les exceptions fournies par Oracle sont regroupes dans ce tableau : Nom d'exception 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 TR.ANSACTION_BACKED_OUT VALUE_ERROR ZERO_DIVIDE Valeur SqlCode -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 nommes. Pour grer les exceptions le programmeurdoit crire un gestionnaire des exceptions qui prend le contrle du droulement du bloc PL/SQL en prsence d'une exception. Le gestionnaire d'exception fait partie du bloc PL/SQL et se trouve aprs les commandes Il commence par le mot cl EXCEPTION et se termine avec le mme END du bloc. Chaque gestion d'exception consiste spcifier son nom d'erreur aprs la clause WHEN et la squence de la commande excuter aprs le mot cl THEN, comme le montre l'exemple suivant:

DECLARE Wsal emp.sal%type; BEGIN select sal into wsal from emp; EXCEPTION WHEN TOO_MANY_ROWS then --grer erreur trop de lignes WHEN NO_DATA_FOUND then --grer erreur pas de ligne WHEN OTHERS then --grer toutes les autres erreurs END ; Remarques : L'exception optionnelle OTHERS est toujours situe la fin des exceptions. Pour rattacher une squence de commandes plus d'une exception, l'utilisateur peut utiliser l'oprateur boolen OR comme suit : WHEN erreurl OR erreur2 THEN-- grer erreurl2 MH Page 19 sur 20 UIMA

Le langage PL/SQL

7.2. Les exceptions utilisateur (externes)


PL/SQL permet l'utilisateur de dfinir ses propres exceptions. La gestion des anomalies utilisateur peut se faire dans un bloc PL/SQL en effectuant les oprations suivantes: 1. Nommer l'anomalie (type exception) dans la partie Dclare du bloc. DECLARE Nom_ano Exception; 2. Dterminer lerreur et passer la main au traitement appropri par la commande Raise. BEGIN If (condition_anomalie) then raise Nom_ano 3. Effectuer Ie traitement dfini dans la partie EXCEPTION du Bloc. EXCEPTION WHEN (Nom_ano) then (traitement);

Exemple : DECLARE wsal emp.sal%type ; sal_zero Exception ; BEGIN Select sal into wsal from emp where empno=5; If wsal=0 then Raise sal_zero; EXCEPTION WHEN sal_zero then -- grer erreur salaire WHEN TOO_MANY_ROWS then... --grer erreur trop de lignes WHEN_NO_DATA_FOUND then ... -- grer erreur pas de ligne WHEN OTRERS then ... --grer toutes les autres erreurs END; Le programmeur Peut utiliser les fonctions Sqlcode et Sqlerrm pour coder les erreurs Oracle en Exception. sqlcode est une fonction propre PL/SQL qui retourne le numro (gnralement ngatif) de l'erreur courante. Sqlerrm reoit en entre le numro de l'erreur et renvoie en sortie le message de l'erreur cod sur196 octets.

MH

Page 20 sur 20

UIMA