Vous êtes sur la page 1sur 36

Mostafa HANOUNE

3
Cration de procdures

Mostafa HANOUNE

Objectifs
A la fin de ce chapitre, vous serez capables de :
Dcrire les diffrentes utilisations des
procdures
Crer des procdures ct client et ct
serveur
Crer des procdures avec des paramtres
Dclarer des sous-programmes
Appeler une procdure
Supprimer une procdure
3-2

Objectifs du chapitre
Ce chapitre vous apprend les mthodes de cration et d'appel des procdures en environnements client et
serveur.

Dvelopper des units de programmes PL/SQL 3-2

Mostafa HANOUNE

Vue d'ensemble des procdures


Une procdure est un bloc PL/SQL
nomm qui effectue une action.
Une procdure peut tre stocke dans
la base de donnes, comme objet de
base de donnes, en vue d'excutions
rptes.

3-3

Qu'est-ce qu'une procdure ?


Une procdure est un bloc PL/SQL qui accepte des paramtres (quelques fois appels arguments), et qui
peut tre appele. En rgle gnrale, vous utilisez une procdure pour effectuer une action. Dans un des
chapitres prcdents, nous avons vu quune procdure comporte un en-tte, une section de dclaration,
une section excutable et une section d'exception optionnelle.
Les procdures ont pour avantage d'tre rutilisables et rvisables. Une fois valides, elles peuvent tre
utilises dans nombre d'applications. En cas de changement de dfinition, seule la procdure se trouve
affecte, ce qui simplifie grandement la maintenance.

Dvelopper des units de programmes PL/SQL 3-3

Mostafa HANOUNE

Syntaxe pour la cration des


procdures
CREATE [OR REPLACE] PROCEDURE procedure_name
(parameter1 [mode1] datatype1,

pparameter2

[mode2] datatype2,. . .)
IS|AS Bloc PL/SQL ;

3-4

Crer des procdures


L'instruction CREATE PROCEDURE vous permet de crer de nouvelles procdures. Cette instruction
permet de dclarer une liste de paramtres et doit dfinir les actions raliser par le bloc PL/SQL
standard.

Les blocs PL/SQL commencent par BEGIN ou par la dclaration de variables locales et finissent
par END ou END procedure_name. Vous ne pouvez pas rfrencer d'hte ni de bind variables
dans le bloc PL/SQL d'une procdure stocke.

L'option REPLACE indique que, si la procdure existe, cette dernire sera crase et remplace par
la nouvelle version cre avec cette instruction.

Dfinitions syntaxiques
Paramtre
procedure_name
argument
mode

datatype
PL/SQL block

Description
Nom de la procdure
Nom de la variable PL/SQL dont la valeur est passe / remplie par
l'environnement appelant, ou les deux, en fonction du mode utilis
Type d'argument :
IN (par dfaut)
OUT
IN OUT
Type de donnes de l'argument
Partie procdurale dfinissant les actions ralises par la procdure

Dvelopper des units de programmes PL/SQL 3-4

Mostafa HANOUNE

Modes des paramtres des


procdures
Procdure
Paramtre IN

Environnement
appelant

Paramtre OUT
Paramtre IN OUT
(DECLARE)
BEGIN
EXCEPTION
END;

3-5

Utiliser les diffrents modes des paramtres des procdures


Vous pouvez transfrer des valeurs de et vers un environnement appelant grce des paramtres.
Slectionnez l'un des trois modes pour chaque paramtre : IN, OUT ou IN OUT.
Essayer de changer la valeur d'un paramtre IN se soldera par une erreur.
DATATYPE ne peut tre que la dfinition %TYPE, %ROWTYPE, ou un type de donnes explicite sans
spcification de taille.
Type de paramtres

Description

IN (par dfaut)

Passe une valeur constante de l'environnement appelant la procdure

OUT

Passe une valeur de la procdure l'environnement appelant

IN OUT

Passe une valeur de l'environnement appelant la procdure ainsi


qu'une valeur pouvant tre diffrente de la procdure vers
l'environnement appelant en utilisant le mme paramtre

Dvelopper des units de programmes PL/SQL 3-5

Mostafa HANOUNE

Dveloppement de procdures stockes


Oracle
Procedure
Builder

Editeur

Code

SQL*Plus

Enregistrer

2 Oracle

Code

SQL> START file.sql

Code source
Compiler

p-code
Excuter
3-6

Comment dvelopper une procdure stocke


Les tapes ci-dessous indiquent la mthode suivre pour dvelopper une procdure stocke. Les deux
pages suivantes fournissent plus de dtails.
1. Slectionnez un environnement de dveloppement : Procedure Builder ou SQL*Plus.
Rdiger la syntaxe. Si vous utilisez Procedure Builder, entrez la syntaxe dans l'diteur de l'unit de
programme. Si vous utilisez SQL*Plus, entrez le code dans un diteur de texte et enregistrez-le dans
un fichier script.
2. Compilez le code.
Le code source est compil dans le p-code. Si vous utilisez Procedure Builder, cliquez sur
Enregistrer. Si vous utilisez SQL*Plus, excutez le fichier script.

Dvelopper des units de programmes PL/SQL 3-6

Mostafa HANOUNE

Cration d'une procdure


stocke avec SQL*Plus
1. Entrez le texte de l'instruction CREATE
PROCEDURE dans un diteur.
2. Excutez le fichier script pour compiler la
procdure.
3. Utilisez SHOW ERRORS pour visualiser les
erreurs de compilation.
4. Une fois compile avec succs, la
procdure est prte pour excution.

3-7

Comment crer une procdure stocke avec SQL*Plus


1. Entrez le texte de l'instruction CREATE PROCEDURE dans un diteur systme ou un traitement de
texte puis enregistrez-le dans un fichier script (extension.sql).
2. Dans SQL*Plus, excutez le fichier script pour compiler le code source en p-code.
3. Utilisez SHOW ERRORS pour visualiser les erreurs de compilation.
4. Une fois compile correctement, appelez la procdure partir d'un environnement Oracle Server.
Un fichier script avec l'instruction CREATE PROCEDURE (ou CREATE FUNCTION) vous permet de
modifier l'instruction en cas d'erreur de compilation ou d'excution, ou d'apporter d'autres modifications
l'instruction. Il est impossible d'appeler une procdure (ou une fonction) avec succs si celle-ci contient
une erreur de compilation ou d'excution. Dans SQL*Plus, utilisez SHOW ERRORS pour visualiser les
erreurs de compilation.
Excuter l'instruction CREATE PROCEDURE (ou CREATE FUNCTION) permet de stocker le code
source dans le dictionnaire de donnes mme si la procdure (ou la fonction) contient des erreur de
compilation.
Note : En cas d'erreur de compilation, et si vous apportez des modifications l'instruction CREATE
PROCEDURE (ou CREATE FUNCTION), vous devrez dans un premier temps supprimer (DROP) la
procdure (ou la fonction), ou utiliser la syntaxe OR REPLACE.

Dvelopper des units de programmes PL/SQL 3-7

Mostafa HANOUNE

Cration d'une procdure avec


Procedure Builder
Procedure Builder vous permet de :
Crer une procdure ct serveur
Crer une procdure ct client
Glisser-dplacer des procdures entre
client et serveur

3-8

Fonctionnalits de Procedure Builder


C'est grce au moteur PL/SQL contenu dans l'outil client Procedure Builder que vous pouvez dvelopper
des procdures ct client. Grce Procedure Builder, vous pouvez utiliser le moteur PL/SQL et
dvelopper des procdures ct serveur.
La fonctionnalit glisser-dplacer de Procedure Builder vous permet de dplacer facilement vos
procdures entre le client et le serveur.

Dvelopper des units de programmes PL/SQL 3-8

Mostafa HANOUNE

Cration d'une procdure ct


serveur avec Procedure Builder

Crer
Supprimer

3-9

Comment crer une procdure ct serveur avec Procedure Builder


1. Slectionnez le File>Connect, puis entrez vos nom d'utilisateur, mot de passe et chane de
connexion la base de donnes.
2. Ouvrez le noeud Database Objects dans Object Navigator.
3. Ouvrez le nom de votre schma.
4. Cliquez sur le noeud Stored Program Units sous ce schma.
5. Cliquez sur le bouton Create dans Object Navigator.
6. Entrez le nom de la procdure dans la bote de dialogue New Program Unit (Nouvelle unit de
programme).
7. Cliquez sur OK pour accepter.
8. Entrez le code source et cliquez sur Enregistrer.
Les mots-cl CREATE, CREATE OR REPLACE et slash ne sont pas valides dans Procedure Builder.

Dvelopper des units de programmes PL/SQL 3-9

Mostafa HANOUNE

Cration d'une procdure ct


client avec Procedure Builder

3-10

Comment crer une procdure ct client avec Procedure Builder


1. Slectionnez le noeud Program Units dans Object Navigator.
2. Cliquez sur le bouton Create. La bote de dialogue Nouvelle unit de programme apparat.
3. Donnez un nom cette procdure. Notez que le type d'unit de programme par dfaut est
Procedure. Cliquez sur OK pour accepter ces entres. Le nom de l'unit de programme apparat
dans Object Navigator.

L'diteur d'units de programme apparat, avec le nom de la procdure ainsi que les
instructions IS, BEGIN et END.

Le curseur se positionne automatiquement sur la ligne situe sous le mot-cl BEGIN.

4. Entrez le code source.


5. Cliquez sur le bouton Compile. Les messages d'erreur gnrs au cours de la compilation sont
affichs dans un volet de messages de compilation (moiti infrieure de la fentre).
6. Slectionnez un message d'erreur pour vous dplacer vers l'emplacement de l'erreur dans le volet du
texte source.
Une fois correctement compile, un message s'affiche dans le coin infrieur droit de la fentre de
l'diteur d'units de programmes.
7. Enregistrez le code source dans un fichier : Menu File>Export.
Les mots-cl CREATE, CREATE OR REPLACE et slash ne sont pas valides dans Procedure Builder.

Dvelopper des units de programmes PL/SQL 3-10

Mostafa HANOUNE

Navigation entre les erreurs de


compilation dans Procedure Builder

3-11

Comment rsoudre les erreurs de compilation


1. Cliquez sur Compiler.
2. Slectionnez un message d'erreur.
Le curseur se dplace vers l'emplacement de l'erreur dans le volet source.
3. Rsolvez l'erreur de syntaxe et cliquez sur Compiler.

Dvelopper des units de programmes PL/SQL 3-11

Mostafa HANOUNE

Cration de procdures avec


des paramtres
IN

OUT

IN OUT

Par dfaut

Doit tre spcifi

Doit tre spcifi

Valeur passe dans Retourne


un sous-programme l'environnement
appelant
Paramtre formel
faisant office de
constante
Paramtre rel :
valeur littrale,
expression,
constante ou
variable initialise

Passe dans un sousprogramme ; retourne


l'environnement
appelant

Variable non initialise Variable non initialise

Doit tre une variable

Doit tre une variable

3-12

Paramtres procduraux
Lorsque vous crez la procdure, le paramtre formel dfinit la valeur utilise dans la section excutable
du bloc PL/SQL, tandis que le paramtre rel est rfrenc lors de l'appel de la procdure.

Dvelopper des units de programmes PL/SQL 3-12

Mostafa HANOUNE

Paramtres IN : Exemple
7369

v_id

SQL> CREATE OR REPLACE PROCEDURE raise_salary


2 (v_id in emp.empno%TYPE)
3 IS
4 BEGIN
5
UPDATE emp
6
SET
sal = sal * 1.10
7
WHERE empno = v_id;
8 END raise_salary;
9 /
Procdure cre.
SQL> EXECUTE raise_salary (7369)
Procdure PL/SQL termine avec succs.
3-13

Exemple
L'exemple ci-dessus montre une procdure contenant un paramtre IN. L'excution de cette instruction
dans SQL*Plus cre la procdure RAISE_SALARY. Une fois appele, RAISE_SALARY prend le
paramtre du numro d'employ et met jour l'enregistrement relatif l'employ et lui affecte une
augmentation de 10 pour cent.
Pour appeler une procdure dans SQL*Plus, utilisez la commande EXECUTE.
SQL> EXECUTE raise_salary (7369)
Pour appeler une procdure partir de l'environnement Procedure Builder, utilisez un appel direct. A
l'invite de l'interprteur de Procedure Builder, entrez le nom de la procdure et les paramtres rels.
PL/SQL> raise_salary (7369);
Les paramtres IN sont transmis comme des constantes de l'environnement appelant vers la procdure.
Essayer de changer la valeur d'un paramtre IN se soldera par une erreur.

Dvelopper des units de programmes PL/SQL 3-13

Mostafa HANOUNE

Paramtres OUT : Exemple


Environnement appelant Procdure QUERY_EMP
7654

v_id
MARTIN v_name
1250

v_salary

1400

v_comm

3-14

Exemple
Dans cet exemple, vous crez une procdure avec des paramtres OUT pour rcuprer des informations
sur un employ.

Dvelopper des units de programmes PL/SQL 3-14

Mostafa HANOUNE

Paramtres OUT : Exemple


SQL>
1
2
3
4
5
6
7
8
9
10
11
12

CREATE OR REPLACE PROCEDURE query_emp


(v_id
IN
emp.empno%TYPE,
v_name
OUT emp.ename%TYPE,
v_salary OUT emp.sal%TYPE,
v_comm
OUT emp.comm%TYPE)
IS
BEGIN
SELECT
ename, sal, comm
INTO
v_name, v_salary, v_comm
FROM
emp
WHERE
empno = v_id;
END query_emp;
/

3-15

Exemple (suite)
Excutez les instructions ci-dessus pour crer la procdure QUERY_EMP. Cette procdure comporte
quatre paramtres formels. Trois d'entre eux sont des paramtres OUT qui renverront une valeur vers
l'environnement appelant.

Dvelopper des units de programmes PL/SQL 3-15

Mostafa HANOUNE

Paramtres OUT et SQL*Plus


SQL> START emp_query.sql
Procedure created.
SQL> VARIABLE g_nameVARCHAR2(15)
SQL> VARIABLE g_sal
NUMBER
SQL> VARIABLE g_commNUMBER
SQL> EXECUTE query_emp(7654,:g_name,:g_sal,:g_comm)
PL/SQL procedure successfully completed.
SQL> PRINT g_name
G_NAME
--------------MARTIN
3-16

Comment afficher la valeur des paramtres OUT avec SQL*Plus


1. Crez des variables htes dans SQL*Plus en utilisant la commande VARIABLE.
2. Appelez la procdure QUERY_EMP, en fournissant ces variables htes comme les paramtres OUT.
Notez l'utilisation des deux-points (:) pour rfrencer les variables htes dans la commande
EXECUTE.
3. Pour visualiser les valeurs transmises de la procdure vers l'environnement appelant, utilisez la
commande PRINT.
L'exemple ci-dessus montre la valeur de la variable g_name repasse l'environnement appelant. Les
autres variables peuvent tre visualises, individuellement, comme ci-dessus, ou avec une seule commande
PRINT.
SQL> PRINT g_name g_sal g_comm
Ne spcifiez pas de taille une variable hte de type de donnes numrique lorsque vous utilisez la
commande VARIABLE. Une variable hte de type de donnes CHAR ou VARCHAR2 a par dfaut une
longueur de un, moins qu'une valeur soit propose entre parenthses.
PRINT et VARIABLE sont des commandes SQL*Plus.

Dvelopper des units de programmes PL/SQL 3-16

Mostafa HANOUNE

Paramtres OUT et Procedure


Builder
PL/SQL> .CREATE CHAR g_name LENGTH 10
PL/SQL> .CREATE NUMBER g_sal PRECISION 4
PL/SQL> .CREATE NUMBER g_comm PRECISION 4
PL/SQL> QUERY_EMP (7654, :g_name, :g_sal,
+> :g_comm);
PL/SQL> TEXT_IO.PUT_LINE (:g_name || ' gagne ' ||
+> TO_CHAR(:g_sal) || ' et une commission de '
+> || TO_CHAR(:g_comm));
MARTIN gagne 1250 et une commission de 1400

3-17

Comment afficher la valeur des paramtres OUT avec Procedure Builder


1. Crez des variables htes en utilisant la syntaxe .CREATE.
2. Appelez la procdure QUERY_EMP, en fournissant ces variables htes comme les paramtres
OUT. Notez l'utilisation des deux-points (:) pour rfrencer les variables htes.
3. Pour visualiser les valeurs passes de la procdure vers l'environnement appelant, utilisez la
procdure PUT_LINE dans le package TEXT_IO.
Le package TEXT_IO n'est disponible que dans Procedure Builder.
Pour plus de prcisions, recherchez dans laide en ligne de Procedure Builder sur le sujet PL/SQL
Interpreter Commands.

Dvelopper des units de programmes PL/SQL 3-17

Mostafa HANOUNE

Paramtres IN OUT
Environnement appelant

Procdure FORMAT_PHONE

'8006330575'

'(800)633'(800)633-0575'

v_phone_no

SQL> CREATE OR REPLACE PROCEDURE format_phone


2 (v_phone_no IN OUT VARCHAR2)
3 IS
4 BEGIN
5
v_phone_no := '(' || SUBSTR(v_phone_no,1,3) ||
6
')' || SUBSTR(v_phone_no,4,3) ||
7
'-' || SUBSTR(v_phone_no,7);
8 END format_phone;
9 /

3-18

Utiliser les paramtres IN OUT


Avec un paramtre IN OUT, vous pouvez transmettre des valeurs dans une procdure et renvoyer une
valeur vers l'environnement appelant. La valeur retourne est soit l'original, soit la valeur inchange soit
encore une nouvelle valeur dfinie dans la procdure.
Un Paramtre IN OUT se comporte en variable initialise.
Exemple
Crez une procdure avec un paramtre IN OUT pour accepter une chane de caractres contenant 10
chiffres et renvoyer un numro de tlphone format de la faon suivante : (800) 633-0575.
Excutez l'instruction pour crer la procdure FORMAT_PHONE.

Dvelopper des units de programmes PL/SQL 3-18

Mostafa HANOUNE

Appel de FORMAT_PHONE
partir de SQL*Plus
SQL> VARIABLE g_phone_no VARCHAR2(15)
SQL> BEGIN :g_phone_no := '8006330575'; END;
2 /
PL/SQL procedure successfully completed.
SQL> PRINT g_phone_no
G_PHONE_NO
--------------8006330575
SQL> EXECUTE format_phone (:g_phone_no)
PL/SQL procedure successfully completed.
SQL> PRINT g_phone_no
G_PHONE_NO
--------------(800)633-0575
3-19

Comment afficher des paramtres IN OUT avec SQL*Plus


1. Crez une variable hte en utilisant la commande VARIABLE.
2. Remplissez la variable hte avec une valeur, en utilisant un bloc PL/SQL anonyme.
3. Appelez la procdure FORMAT_PHONE, en fournissant la variable hte comme le paramtre IN
OUT. Notez l'utilisation des deux-points (:) pour rfrencer la variable hte dans la commande
EXECUTE.
4. Pour visualiser la valeur repasse vers l'environnement appelant, utilisez la commande PRINT.

Dvelopper des units de programmes PL/SQL 3-19

Mostafa HANOUNE

Appel de FORMAT_PHONE
partir de Procedure Builder
PL/SQL> .CREATE CHAR g_phone_no LENGTH 15
PL/SQL> BEGIN
+> :g_phone_no := '8006330575';
+> END;
PL/SQL> FORMAT_PHONE (:g_phone_no);
PL/SQL> TEXT_IO.PUT_LINE (:g_phone_no);
(800)633-0575

3-20

Visualisation des paramtres IN OUT avec Procedure Builder


1. Crez une variable hte en utilisant la syntaxe .CREATE.
2. Remplissez la variable hte avec une valeur, en utilisant un bloc PL/SQL anonyme.
3. Appelez la procdure FORMAT_PHONE, en fournissant la variable hte comme le paramtre IN
OUT. Notez l'utilisation des deux-points (:) pour rfrencer la variable hte.
4. Pour visualiser les valeurs repasses vers l'environnement appelant, utilisez la procdure
PUT_LINE dans le package TEXT_IO.

Dvelopper des units de programmes PL/SQL 3-20

Mostafa HANOUNE

Mthodes de transfert des


paramtres
Positionnement
Nom
Combinaison

3-21

Mthodes de transfert des paramtres


Pour une procdure contenant de multiples paramtres, vous pouvez utiliser plusieurs mthodes pour
spcifier la valeur des paramtres :
Mthode

Description

Positionnement

Liste les valeurs dans l'ordre dans lequel les paramtres sont dclars

Association nom

Liste les valeurs dans un ordre arbitraire en associant chacune avec le


nom de son paramtre en utilisant la syntaxe spciale (=>)

Combinaison

Liste les premires valeurs par positionnement, et les suivantes en


utilisant la syntaxe spciale de la mthode Nom

Dvelopper des units de programmes PL/SQL 3-21

Mostafa HANOUNE

Option DEFAULT pour les


paramtres
SQL>
1
2
3
4
5
6
7
8

CREATE OR REPLACE PROCEDURE add_dept


(v_name IN dept.dname%TYPE DEFAULT 'unknown',
v_loc
IN dept.loc%TYPE
DEFAULT 'unknown')
IS
BEGIN
INSERT INTO dept
VALUES (dept_deptno.NEXTVAL, v_name, v_loc);
END add_dept;
/

3-22

Exemple de valeurs par dfaut de paramtres


Excutez l'instruction ci-dessus pour crer la procdure ADD_DEPT. Notez l'utilisation de la clause
DEFAULT dans la dclaration des paramtres formels.

Dvelopper des units de programmes PL/SQL 3-22

Mostafa HANOUNE

Exemples de transfert de paramtres


SQL> BEGIN
2 add_dept;
3 add_dept ( 'TRAINING', 'NEW YORK');
4 add_dept ( v_loc => 'DALLAS', v_name =>'EDUCATION');
5 add_dept ( v_loc => 'BOSTON') ;
6 END;
7 /
Procdure PL/SQL termine avec succs.
SQL> SELECT * FROM dept;
DEPTNO
-----...
41
42
43
44

DNAME
-------------...
unknown
TRAINING
EDUCATION
unknown

LOC
------------...
unknown
NEW YORK
DALLAS
BOSTON

3-23

Exemple de valeurs par dfaut de paramtres (suite)


Le bloc anonyme ci-dessus montre les diffrentes faons d'appeler la procdure ADD_DEPT, ainsi que
ses rsultats.

Dvelopper des units de programmes PL/SQL 3-23

Mostafa HANOUNE

Dclaration de sous-programmes
CREATE OR REPLACE PROCEDURE LEAVE_EMP2
(v_id
IN
emp.empno%TYPE)
IS
PROCEDURE log_exec
IS
BEGIN
INSERT INTO log_table (user_id, log_date)
VALUES (user,sysdate);
END log_exec;
BEGIN
DELETE FROM emp
WHERE empno = v_id;
log_exec;
END leave_emp2;

3-24

Dclaration de sous-programmes
Vous pouvez dclarer des sous-programmes dans tout bloc PL/SQL. Voici une alternative la cration
d'une procdure autonome LOG_EXEC.
Vous devez dclarer le sous-programme, dans la section dclaration du bloc, mais il doit tre le dernier
lment, aprs tous les autres lments du programme. Par exemple, une variable dclare aprs la fin du
sous-programme, avant le BEGIN de la procdure, gnrera une erreur de compilation.

Dvelopper des units de programmes PL/SQL 3-24

Mostafa HANOUNE

Appel d'une procdure partir


d'un bloc PL/SQL anonyme
DECLARE
v_id NUMBER := 7900;
BEGIN
raise_salary(v_id);
COMMIT;
...
END;

--appel de la procdure

3-25

Exemple
Vous avez dj vu comment appeler une procdure indpendante partir des deux environnements de
dveloppement PL/SQL principaux, SQL*Plus et Procedure Builder.
Les procdures peuvent tre appeles partir de tout outil ou langage supportant PL/SQL.
Appelez la procdure RAISE_SALARY partir d'un bloc PL/SQL anonyme comme l'indique le
transparent.

Dvelopper des units de programmes PL/SQL 3-25

Mostafa HANOUNE

Appel d'une procdure partir


d'une procdure stocke
SQL> CREATE OR REPLACE PROCEDURE process_emps
2 IS
3
CURSOR emp_cursor IS
4
SELECT empno
5
FROM
emp;
6 BEGIN
7
FOR emp_rec IN emp_cursor
8
LOOP
9
raise_salary(emp_rec.empno); -- appel procdure
10
END LOOP;
11
COMMIT;
12 END process_emps;
13 /

3-26

Exemple
Cet exemple vous montre comment appeler une procdure partir d'une procdure stocke. La procdure
stocke PROCESS_EMPS utilise un curseur pour traiter tous les enregistrements de la table EMP et passe
chaque numro identifiant d'employ la procdure RAISE_SALARY, ce qui aboutit une augmentation
de salaire de 10 pour cent pour toute la socit.

Dvelopper des units de programmes PL/SQL 3-26

Mostafa HANOUNE

Exceptions gres
Procdure appele
Procdure appelante

PROCEDURE
PROC2 ...
IS
...
BEGIN
...
EXCEPTION
...
END PROC2;

PROCEDURE
PROCEDURE
PROC1
... ...
PROC1
IS
IS
...
...
BEGIN
BEGIN
...
...
PPROC2(arg1);
PROC2(arg1);...
...
EXCEPTION...
EXCEPTION
END
PROC1;
Renvoie du
...
contrle la
END PROC1;

Exception leve
Exception gre

procdure
appelante

3-27

Comment les exceptions gres affectent la procdure appelante


Lorsque vous dveloppez des procdures qui seront appeles par d'autres procdures, vous devez garder
l'esprit les consquences qu'auront les exceptions gres et non gres sur la transaction et la procdure
appelante.
Un bloc PL/SQL est une unit de travail logique ; le bloc PL/SQL peut tre un bloc anonyme ou une
procdure. Si votre bloc PL/SQL contient des instructions LMD (langage de manipulation de donnes),
vous pouvez alors utiliser des commandes de contrle de transaction, COMMIT, ROLLBACK et
SAVEPOINT, pour contrler la transaction.
Si vous avez une procdure en appelant une autre, pensez la faon dont les exceptions leves dans la
procdure appelante affecteront la transaction, ainsi qu' la propagation de l'exception.
Lorsqu'une exception est leve dans un programme appel, un contrle est immdiatement affect la
section d'exception du bloc en question. Si l'exception est gre, le bloc se termine, et le contrle est
affect au programme appelant. Toute instruction LMD cre avant la leve de l'exception demeurera une
partie de la transaction.

Dvelopper des units de programmes PL/SQL 3-27

Mostafa HANOUNE

Exceptions non gres


Procdure appelante
PROCEDURE
PROC1 ...
IS
...
BEGIN
...
PROC2(arg1);
...
EXCEPTION
...
END PROC1;

Procdure appele
PROCEDURE
PROC2 ...
IS
...
BEGIN
...
EXCEPTION
...
END PROC2;

Exception leve
Exception non gre

Renvoie du contrle
la section
d'exception de la
procdure appelante

3-28

Comment les exceptions non gres affectent la procdure appelante


Lorsqu'une exception est leve dans un programme appel, un contrle est immdiatement affect la
section d'exception du bloc en question. Si l'exception est non gre, le bloc se termine, et le contrle est
affect la section d'exception du programme appelant.
Si l'exception est gre dans la procdure appelante, toute instruction LMD de la procdure appelante et
de la procdure appele demeureront une partie de la transaction.
Si l'exception est non gre dans la procdure appelante, toute instruction LMD de la procdure appelante
et de la procdure appele seront implicitement refoules (rolleback). La procdure appelante se termine
en erreur et lexception se propage lenvironnement appelant.

Dvelopper des units de programmes PL/SQL 3-28

Mostafa HANOUNE

Suppression des procdures


Avec SQL*Plus :
Supprimer une procdure ct serveur
Avec Procedure Builder :
Supprimer une procdure ct

serveur
Supprimer une procdure ct client

3-29

Suppression des procdures


Lorsqu'une procdure stocke n'est plus requise, vous pouvez utiliser une instruction SQL dans le volet de
l'interprteur de SQL*Plus ou de Procedure Builder pour la supprimer (DROP). Il existe deux autres
manires de supprimer des units de programme dans Procedure Builder. Les mthodes diffrent
lgrement selon qu'il s'agit d'une procdure ct serveur ou ct client.

Dvelopper des units de programmes PL/SQL 3-29

Mostafa HANOUNE

Suppression des procdures


ct serveur
Avec SQL*Plus :
Syntaxe
DROP PROCEDURE procedure_name

Exemple
SQL> DROP PROCEDURE raise_salary;
Procdure supprime.

3-30

Suppression d'une procdure ct serveur avec SQL*Plus


Pour supprimer une procdure ct serveur en utilisant SQL*Plus, excutez la commande SQL DROP
PROCEDURE.
Le Rollback n'est pas possible aprs avoir excut une commande LDD (langage de dfinition des
donnes) comme DROP PROCEDURE.

Dvelopper des units de programmes PL/SQL 3-30

Mostafa HANOUNE

Suppression des procdures ct serveur


Avec Procedure Builder :
1. Connectez-vous la base de donnes.
2. Ouvrez le noeud Database Objects.
3. Ouvrez le schma du propritaire de la
procdure.
4. Ouvrez le noeud Stored Program Units.
5. Cliquez sur la procdure que vous souhaitez
supprimer.
6. Cliquez sur le bouton Supprimer dans Object
Navigator.
7. Cliquez sur Yes pour confirmer.
3-31

Suppression d'une procdure ct serveur avec Procedure Builder


Lorsque vous dcidez de supprimer une unit de programme stocke, le message d'alerte suivant apparat :
Voulez-vous rellement supprimer l'unit de programme stocke RAISE_SALARY ?
Dans l'diteur d'units de programme stockes, vous pouvez galement cliquez sur SUPPRIMER (DROP)
pour supprimer la procdure du serveur.

Dvelopper des units de programmes PL/SQL 3-31

Mostafa HANOUNE

Suppression des procdures


ct client
Avec Procedure Builder :
1. Ouvrez le noeud Program Units.
2. Cliquez sur la procdure que vous
souhaitez supprimer.
3. Cliquez sur le bouton Supprimer dans
Object Navigator.
4. Cliquez sur Yes pour confirmer.

3-32

Suppression d'une procdure ct serveur avec Procedure Builder


Suivez les tapes ci-dessus pour supprimer la procdure partir de Procedure Builder.
Si vous avez export le code qui constitue la structure de votre procdure vers un fichier texte et si vous
voulez supprimer ce dernier partir du client, vous devrez passer par le systme d'exploitation.

Dvelopper des units de programmes PL/SQL 3-32

Mostafa HANOUNE

Rsum
Une procdure est un bloc PL/SQL nomm
qui effectue une action.
Utilisez les paramtres pour passer des
donnes
A partir de l'environnement appelant vers la
procdure.
Les procdure peuvent tre appeles partir
de tout outil ou langage supportant PL/SQL.
Les procdures peuvent servir de blocs de
structure pour une application.
3-33

Dvelopper des units de programmes PL/SQL 3-33

Mostafa HANOUNE

Prsentation des exercices


Cration de procdures stockes pour
implmenter diffrentes routines de
manipulation de donnes et de requtes

3-34

Utilisez soit SQL*Plus soit Procedure Builder pour faire ces exercices.
Si vous rencontrez des erreurs de compilation en utilisant SQL*Plus, utilisez la commande SHOW
ERRORS.
Si vous corrigez des erreurs de compilation dans SQL*Plus, faites-le dans le fichier script original, non
pas dans le buffer, puis r-excutez la nouvelle version du fichier. La nouvelle version de la procdure
sera sauvegarde dans le dictionnaire de donnes.

Dvelopper des units de programmes PL/SQL 3-34

Exercice 3
Note : Si vous utilisez SQL*Plus pour faire ces exercices, sauvegardez vos sous-programmes dans des
fichiers, en utilisant
SAVE nom de fichier. La syntaxe utilise pourra tre utile pour les exercices venir.
1. Crez et appelez la procdure ADD_PROD et analysez les rsultats.
a. Crez une procdure appele ADD_PROD pour insrer un nouveau produit dans la table
PRODUCT. Attribuez au produit un numro et une description, en utilisant deux paramtres.
b. Compilez le code, appelez la procdure, puis lancez une requte sur la table PRODUCT pour
afficher les rsultats.
c. Appelez nouveau votre procdure, en passant un Id produit de 100860. Que se passe-t-il et
pourquoi ?
___________________________________________________________________
___________________________________________________________________
2. a.
Crez une procdure appele UPD_PROD pour modifier un produit dans la table
PRODUCT.
a. Crez une procdure appele UPD_PROD pour mettre jour la description du produit.
Attribuez au produit une nouvelle description, en utilisant deux paramtres. Incluez la gestion
des exceptions ncessaire si aucune mise jour ne se produit.
b. Compilez le code, appelez la procdure, puis lancez une requte sur la table PRODUCT pour
afficher les rsultats. Vrifiez galement la gestion des exceptions en essayant de mettre jour
un produit inexistant.
3. Crez une procdure appele DEL_PROD pour supprimer un produit de la table PRODUCT.
a. Crez une procdure appele DEL_PROD pour supprimer un produit. Incluez la gestion des
exceptions ncessaire si aucun produit n'a t supprim.
b. Compilez le code, appelez la procdure, puis lancez une requte sur la table PRODUCT pour
afficher les rsultats. Vrifiez galement la gestion des exceptions en essayant de supprimer
un produit inexistant.
4. Crez une procdure appele QUERY_EMP pour lancer une requte sur la table EMP, en
rcuprant le salaire et l'intitul du poste correspondant un employ une fois que vous aurez le
numro de l'employ.
a. Crez une procdure qui renvoie une valeur des colonnes SAL et JOB pour un employ
spcifique (utilisez EMPNO).
Utilisez des variables htes pour les deux paramtres OUT.
b. Compilez le code, appelez la procdure, puis affichez le salaire et l'intitul du poste de
l'employ 7839.
c. Appelez nouveau votre procdure, en passant un EMPNO de 9898. Que se passe-t-il et
pourquoi ?
___________________________________________________________________
___________________________________________________________________

Dvelopper des units de programmes PL/SQL 3-35

Dvelopper des units de programmes PL/SQL 3-36

Vous aimerez peut-être aussi