Académique Documents
Professionnel Documents
Culture Documents
Les03 CreationProc
Les03 CreationProc
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.
Mostafa HANOUNE
3-3
Mostafa HANOUNE
pparameter2
[mode2] datatype2,. . .)
IS|AS Bloc PL/SQL ;
3-4
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
Mostafa HANOUNE
Environnement
appelant
Paramtre OUT
Paramtre IN OUT
(DECLARE)
BEGIN
EXCEPTION
END;
3-5
Description
IN (par dfaut)
OUT
IN OUT
Mostafa HANOUNE
Editeur
Code
SQL*Plus
Enregistrer
2 Oracle
Code
Code source
Compiler
p-code
Excuter
3-6
Mostafa HANOUNE
3-7
Mostafa HANOUNE
3-8
Mostafa HANOUNE
Crer
Supprimer
3-9
Mostafa HANOUNE
3-10
L'diteur d'units de programme apparat, avec le nom de la procdure ainsi que les
instructions IS, BEGIN et END.
Mostafa HANOUNE
3-11
Mostafa HANOUNE
OUT
IN OUT
Par dfaut
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.
Mostafa HANOUNE
Paramtres IN : Exemple
7369
v_id
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.
Mostafa HANOUNE
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.
Mostafa HANOUNE
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.
Mostafa HANOUNE
Mostafa HANOUNE
3-17
Mostafa HANOUNE
Paramtres IN OUT
Environnement appelant
Procdure FORMAT_PHONE
'8006330575'
'(800)633'(800)633-0575'
v_phone_no
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
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
Mostafa HANOUNE
3-21
Description
Positionnement
Liste les valeurs dans l'ordre dans lequel les paramtres sont dclars
Association nom
Combinaison
Mostafa HANOUNE
3-22
Mostafa HANOUNE
DNAME
-------------...
unknown
TRAINING
EDUCATION
unknown
LOC
------------...
unknown
NEW YORK
DALLAS
BOSTON
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.
Mostafa HANOUNE
--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.
Mostafa HANOUNE
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.
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
Mostafa HANOUNE
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
Mostafa HANOUNE
serveur
Supprimer une procdure ct client
3-29
Mostafa HANOUNE
Exemple
SQL> DROP PROCEDURE raise_salary;
Procdure supprime.
3-30
Mostafa HANOUNE
Mostafa HANOUNE
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
Mostafa HANOUNE
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.
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 ?
___________________________________________________________________
___________________________________________________________________