Академический Документы
Профессиональный Документы
Культура Документы
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
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.
Mostafa HANOUNE
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
Mostafa HANOUNE
Environnement appelant
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
Mostafa HANOUNE
SQL*Plus
Code
Enregistrer
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.
Mostafa HANOUNE
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.
Mostafa HANOUNE
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.
Mostafa HANOUNE
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.
Mostafa HANOUNE
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.
Mostafa HANOUNE
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.
Mostafa HANOUNE
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
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.
Mostafa HANOUNE
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
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.
Mostafa HANOUNE
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.
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.
Mostafa HANOUNE
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.
Mostafa HANOUNE
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.
Mostafa HANOUNE
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
Mostafa HANOUNE
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.
Mostafa HANOUNE
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.
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 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;
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.
Mostafa HANOUNE
Procdure appele
PROCEDURE PROC2 ... IS ... BEGIN ... EXCEPTION ... END PROC2;
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.
Mostafa HANOUNE
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.
Mostafa HANOUNE
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.
Mostafa HANOUNE
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.
Mostafa HANOUNE
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.
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 ? ___________________________________________________________________ ___________________________________________________________________