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, [mode2] datatype2,. . .) IS|AS Bloc PL/SQL ;

pparameter2

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 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

datatype PL/SQL block

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 IN (par dfaut) OUT IN OUT Description Passe une valeur constante de l'environnement appelant la procdure Passe une valeur de la procdure l'environnement appelant 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 1 Code
Editeur

SQL*Plus

Code

Enregistrer

SQL> START file.sql

2 Oracle

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 Par dfaut OUT Doit tre spcifi IN OUT Doit tre spcifi Passe dans un sousprogramme ; retourne l'environnement appelant 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
3-12

Variable non initialise Variable non initialise

Doit tre une variable

Doit tre une variable

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 1400 v_salary 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
'8006330575'

Procdure FORMAT_PHONE
'(800)633-0575' '(800)633-

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 Positionnement Association nom Combinaison Description Liste les valeurs dans l'ordre dans lequel les paramtres sont dclars Liste les valeurs dans un ordre arbitraire en associant chacune avec le nom de son paramtre en utilisant la syntaxe spciale (=>) 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
3-23

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

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

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 PROCEDURE PROC1 ... ... PROC1 IS IS ... ... BEGIN BEGIN ... ... PPROC2(arg1);... PROC2(arg1); ... EXCEPTION... EXCEPTION END PROC1; Renvoie du ... contrle la END PROC1;
procdure appelante

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

Exception leve Exception gre

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