{"id":692,"date":"2023-10-01T08:30:00","date_gmt":"2023-10-01T12:30:00","guid":{"rendered":"https:\/\/ve2cuy.com\/?page_id=692"},"modified":"2024-09-18T10:07:04","modified_gmt":"2024-09-18T14:07:04","slug":"420-5d3-bd-procedure-stockee","status":"publish","type":"page","link":"https:\/\/ve2cuy.com\/index.php\/420-5d3-bd-procedure-stockee\/","title":{"rendered":"420-5D3 : BD &#8211; Proc\u00e9dure stock\u00e9e"},"content":{"rendered":"\n<p>Les proc\u00e9dures stock\u00e9es (ou \u00ab\u00a0stored procedures\u00a0\u00bb en anglais) sous Oracle sont des objets de base de donn\u00e9es qui permettent de regrouper un ensemble d&rsquo;instructions SQL en une seule unit\u00e9 logique et r\u00e9utilisable. Elles sont utilis\u00e9es pour automatiser des t\u00e2ches complexes, effectuer des op\u00e9rations sur la base de donn\u00e9es, et encapsuler la logique m\u00e9tier au sein de la base de donn\u00e9es. Les proc\u00e9dures stock\u00e9es offrent plusieurs avantages, notamment la r\u00e9utilisabilit\u00e9, la modularit\u00e9, la s\u00e9curit\u00e9 et la facilit\u00e9 de maintenance.<\/p>\n\n\n\n<p>Voici le r\u00f4le principal des proc\u00e9dures stock\u00e9es dans Oracle :<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>R\u00e9utilisabilit\u00e9<\/strong> : Une fois cr\u00e9\u00e9es, les proc\u00e9dures stock\u00e9es peuvent \u00eatre appel\u00e9es \u00e0 plusieurs reprises par diff\u00e9rentes parties de votre application ou par d&rsquo;autres proc\u00e9dures et fonctions. Cela \u00e9vite la duplication de code et facilite la maintenance.<\/li>\n\n\n\n<li><strong>Modularit\u00e9<\/strong> : Les proc\u00e9dures stock\u00e9es permettent de d\u00e9couper la logique m\u00e9tier en modules ind\u00e9pendants. Chaque proc\u00e9dure peut accomplir une t\u00e2che sp\u00e9cifique, ce qui rend le code plus organis\u00e9 et plus facile \u00e0 comprendre.<\/li>\n\n\n\n<li><strong>Performance<\/strong> : Les proc\u00e9dures stock\u00e9es peuvent am\u00e9liorer les performances en r\u00e9duisant la latence du r\u00e9seau. Lorsqu&rsquo;une proc\u00e9dure stock\u00e9e est appel\u00e9e depuis une application, les donn\u00e9es restent dans la base de donn\u00e9es, ce qui r\u00e9duit les transferts de donn\u00e9es entre le client et le serveur.<\/li>\n\n\n\n<li><strong>S\u00e9curit\u00e9<\/strong> : Les proc\u00e9dures stock\u00e9es peuvent \u00eatre s\u00e9curis\u00e9es en limitant les autorisations d&rsquo;acc\u00e8s direct aux tables sous-jacentes. Les utilisateurs n&rsquo;ont besoin que d&rsquo;autorisations pour ex\u00e9cuter la proc\u00e9dure, ce qui renforce la s\u00e9curit\u00e9 des donn\u00e9es.<\/li>\n<\/ol>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">Syntaxe<\/h2>\n\n\n\n<p>La syntaxe de base des proc\u00e9dures stock\u00e9es dans Oracle suit un mod\u00e8le standard, bien que les d\u00e9tails puissent varier en fonction des besoins sp\u00e9cifiques de votre proc\u00e9dure. Voici la structure de base d&rsquo;une proc\u00e9dure stock\u00e9e Oracle :<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">CREATE OR REPLACE PROCEDURE nom_de_la_procedure (\n  parametre1 type_de_donnee1,\n  parametre2 type_de_donnee2,\n  ...\n)\nAS\n  -- D\u00e9clarations de variables locales\n  variable1 type_de_donnee1;\n  variable2 type_de_donnee2;\n  ...\n\nBEGIN\n  -- Logique de la proc\u00e9dure\n  -- Utilisation des param\u00e8tres et des variables locales\n\n  -- Instructions SQL\n  -- Manipulation des donn\u00e9es, mises \u00e0 jour, insertions, etc.\n\n  -- Gestion des exceptions (facultatif)\n  -- Utilisation de blocs TRY...EXCEPTION pour g\u00e9rer les erreurs\n\n  -- COMMIT ou ROLLBACK (facultatif)\n  -- Pour valider ou annuler la transaction\n\nEXCEPTION\n  WHEN nom_de_l_exception THEN\n    -- Traitement des exceptions\n\nEND nom_de_la_procedure;\n\/<\/pre>\n\n\n\n<p>Explications des \u00e9l\u00e9ments cl\u00e9s de la syntaxe :<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><code>CREATE OR REPLACE PROCEDURE<\/code>: Cette clause indique que vous cr\u00e9ez ou remplacez une proc\u00e9dure stock\u00e9e. Si la proc\u00e9dure existe d\u00e9j\u00e0 avec le m\u00eame nom, elle sera remplac\u00e9e par la nouvelle d\u00e9finition.<\/li>\n\n\n\n<li><code>nom_de_la_procedure<\/code>: C&rsquo;est le nom que vous donnez \u00e0 votre proc\u00e9dure. Assurez-vous de choisir un nom descriptif et unique.<\/li>\n\n\n\n<li><code>(parametre1 type_de_donnee1, parametre2 type_de_donnee2, ...)<\/code>: Vous pouvez sp\u00e9cifier des param\u00e8tres en entr\u00e9e pour votre proc\u00e9dure. Chaque param\u00e8tre est suivi de son type de donn\u00e9es. Ces param\u00e8tres permettent \u00e0 la proc\u00e9dure d&rsquo;accepter des valeurs en entr\u00e9e.<\/li>\n\n\n\n<li><code>AS<\/code>: Cette clause marque le d\u00e9but du corps de la proc\u00e9dure. C&rsquo;est l\u00e0 que vous d\u00e9finissez les variables locales et commencez la logique de la proc\u00e9dure.<\/li>\n\n\n\n<li><code>BEGIN<\/code>: C&rsquo;est le d\u00e9but du bloc de code o\u00f9 vous d\u00e9finissez la logique de la proc\u00e9dure. C&rsquo;est ici que vous effectuez des op\u00e9rations SQL, utilisez des param\u00e8tres et des variables locales, g\u00e9rez les exceptions, et d\u00e9finissez le comportement de la proc\u00e9dure.<\/li>\n\n\n\n<li><code>EXCEPTION<\/code>: Cette section est utilis\u00e9e pour g\u00e9rer les exceptions qui peuvent survenir pendant l&rsquo;ex\u00e9cution de la proc\u00e9dure. Vous pouvez sp\u00e9cifier diff\u00e9rentes exceptions et d\u00e9finir comment elles doivent \u00eatre g\u00e9r\u00e9es.<\/li>\n\n\n\n<li><code>COMMIT<\/code> ou <code>ROLLBACK<\/code> (facultatif) : Vous pouvez utiliser ces commandes pour valider ou annuler la transaction en cours, en fonction du r\u00e9sultat de la proc\u00e9dure.<\/li>\n<\/ul>\n\n\n\n<p>Notez que la syntaxe de base des proc\u00e9dures stock\u00e9es peut \u00eatre \u00e9tendue pour inclure des fonctionnalit\u00e9s plus avanc\u00e9es, telles que des boucles, des structures de contr\u00f4le conditionnelles, des transactions, des requ\u00eates SQL complexes, etc. Cependant, la structure de base d\u00e9crite ci-dessus vous permet de cr\u00e9er des proc\u00e9dures stock\u00e9es simples et fonctionnelles.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<p>Voici un exemple simple de cr\u00e9ation et d&rsquo;utilisation d&rsquo;une proc\u00e9dure stock\u00e9e dans Oracle :<\/p>\n\n\n\n<p><strong>Cr\u00e9ation d&rsquo;une proc\u00e9dure stock\u00e9e<\/strong> :<\/p>\n\n\n\n<p>Supposons que vous ayez une table \u00ab\u00a0Employes\u00a0\u00bb contenant des donn\u00e9es sur les employ\u00e9s, et vous souhaitez cr\u00e9er une proc\u00e9dure stock\u00e9e pour ajouter un nouvel employ\u00e9 \u00e0 la base de donn\u00e9es. Voici comment vous pouvez cr\u00e9er une telle proc\u00e9dure :<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">CREATE OR REPLACE PROCEDURE AjouterEmploye (\n  p_nom VARCHAR2,\n  p_prenom VARCHAR2,\n  p_salaire NUMBER\n)\nAS\nBEGIN\n  INSERT INTO Employes (Nom, Prenom, Salaire)\n  VALUES (p_nom, p_prenom, p_salaire);\n  COMMIT;\nEND AjouterEmploye;<\/pre>\n\n\n\n<p><strong>Appel de la proc\u00e9dure stock\u00e9e<\/strong> :<\/p>\n\n\n\n<p>Vous pouvez ensuite appeler la proc\u00e9dure stock\u00e9e pour ajouter un employ\u00e9 :<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">BEGIN\n  AjouterEmploye('Doe', 'John', 50000);\nEND;<\/pre>\n\n\n\n<p>Dans cet exemple, la proc\u00e9dure stock\u00e9e \u00ab\u00a0AjouterEmploye\u00a0\u00bb prend les informations d&rsquo;un nouvel employ\u00e9 (nom, pr\u00e9nom et salaire) en tant que param\u00e8tres d&rsquo;entr\u00e9e et les ins\u00e8re dans la table \u00ab\u00a0Employes\u00a0\u00bb. La commande <code>COMMIT<\/code> assure que la transaction est valid\u00e9e.<\/p>\n\n\n\n<p>Les proc\u00e9dures stock\u00e9es peuvent devenir beaucoup plus complexes que cet exemple simple, et elles peuvent inclure des structures de contr\u00f4le, des transactions, des gestionnaires d&rsquo;exceptions, et bien d&rsquo;autres fonctionnalit\u00e9s pour g\u00e9rer des t\u00e2ches plus avanc\u00e9es.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">Autres exemples d&rsquo;utilisation<\/h2>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>Mise \u00e0 jour du salaire de tous les employ\u00e9s d&rsquo;un d\u00e9partement<\/strong> : Cette proc\u00e9dure met \u00e0 jour le salaire de tous les employ\u00e9s d&rsquo;un d\u00e9partement sp\u00e9cifique en fonction d&rsquo;un pourcentage donn\u00e9.<\/li>\n<\/ol>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">   CREATE OR REPLACE PROCEDURE MettreAJourSalaireDepartement (\n     p_departement_id NUMBER,\n     p_pourcentage_augmentation NUMBER\n   )\n   AS\n   BEGIN\n     UPDATE Employes\n     SET Salaire = Salaire * (1 + p_pourcentage_augmentation \/ 100)\n     WHERE IDDepartement = p_departement_id;\n     COMMIT;\n   END MettreAJourSalaireDepartement;<\/pre>\n\n\n\n<p>Utilisation :<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">   BEGIN\n     MettreAJourSalaireDepartement(1, 5); -- 1 est l'ID du d\u00e9partement \"Vente\", 5% d'augmentation\n   END;<\/pre>\n\n\n\n<ol class=\"wp-block-list\" start=\"2\">\n<li><strong>Suppression d&rsquo;un employ\u00e9 par ID<\/strong> : Cette proc\u00e9dure permet de supprimer un employ\u00e9 en sp\u00e9cifiant son ID.<\/li>\n<\/ol>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">   CREATE OR REPLACE PROCEDURE SupprimerEmployeParID (p_employe_id NUMBER)\n   AS\n   BEGIN\n     DELETE FROM Employes WHERE ID = p_employe_id;\n     COMMIT;\n\n\n   END SupprimerEmployeParID;<\/pre>\n\n\n\n<p>Utilisation :<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">   BEGIN\n     SupprimerEmployeParID(101);\n   END;<\/pre>\n\n\n\n<ol class=\"wp-block-list\" start=\"3\">\n<li><strong>Calcul de la prime annuelle pour tous les employ\u00e9s<\/strong> : Cette proc\u00e9dure calcule la prime annuelle pour tous les employ\u00e9s en fonction de leur salaire et de la performance de l&rsquo;entreprise.<\/li>\n<\/ol>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">   CREATE OR REPLACE PROCEDURE CalculerPrimeAnnuelle\n   AS\n   BEGIN\n     UPDATE Employes\n     SET PrimeAnnuelle = Salaire * 0.1; -- 10% du salaire\n     COMMIT;\n   END CalculerPrimeAnnuelle;<\/pre>\n\n\n\n<p>Utilisation :<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">   BEGIN\n     CalculerPrimeAnnuelle;\n   END;<\/pre>\n\n\n\n<ol class=\"wp-block-list\" start=\"4\">\n<li><strong>V\u00e9rification de l&rsquo;admissibilit\u00e9 \u00e0 la retraite<\/strong> : Cette proc\u00e9dure v\u00e9rifie l&rsquo;admissibilit\u00e9 \u00e0 la retraite pour un employ\u00e9 en fonction de son \u00e2ge et de ses ann\u00e9es de service.<\/li>\n<\/ol>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">   CREATE OR REPLACE PROCEDURE VerifierAdmissibiliteRetraite (\n     p_employe_id NUMBER\n   )\n   AS\n     v_age NUMBER;\n     v_annees_service NUMBER;\n   BEGIN\n     SELECT CalculerAge(DateEmbauche) INTO v_age FROM Employes WHERE ID = p_employe_id;\n     SELECT MONTHS_BETWEEN(SYSDATE, DateEmbauche) \/ 12 INTO v_annees_service FROM Employes WHERE ID = p_employe_id;\n\n     IF v_age >= 65 OR v_annees_service >= 30 THEN\n       DBMS_OUTPUT.PUT_LINE('L\\'employ\u00e9 est admissible \u00e0 la retraite.');\n     ELSE\n       DBMS_OUTPUT.PUT_LINE('L\\'employ\u00e9 n\\'est pas encore admissible \u00e0 la retraite.');\n     END IF;\n   END VerifierAdmissibiliteRetraite;<\/pre>\n\n\n\n<p>Utilisation :<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">   BEGIN\n     VerifierAdmissibiliteRetraite(201);\n   END;<\/pre>\n\n\n\n<ol class=\"wp-block-list\" start=\"5\">\n<li><strong>Ajout d&rsquo;un d\u00e9partement avec des employ\u00e9s par d\u00e9faut<\/strong> : Cette proc\u00e9dure cr\u00e9e un nouveau d\u00e9partement dans la table \u00ab\u00a0Departements\u00a0\u00bb et ajoute automatiquement des employ\u00e9s par d\u00e9faut \u00e0 ce d\u00e9partement.<\/li>\n<\/ol>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">   CREATE OR REPLACE PROCEDURE CreerDepartementAvecEmployes (\n     p_nom_departement VARCHAR2,\n     p_nb_employes NUMBER\n   )\n   AS\n   BEGIN\n     INSERT INTO Departements (Nom) VALUES (p_nom_departement);\n     COMMIT;\n\n     FOR i IN 1..p_nb_employes LOOP\n       INSERT INTO Employes (Nom, Prenom, Salaire, IDDepartement)\n       VALUES ('Nom' || i, 'Prenom' || i, 50000, (SELECT ID FROM Departements WHERE Nom = p_nom_departement));\n     END LOOP;\n     COMMIT;\n   END CreerDepartementAvecEmployes;<\/pre>\n\n\n\n<p>Utilisation :<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">   BEGIN\n     CreerDepartementAvecEmployes('R&amp;D', 10);\n   END;<\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading has-vivid-red-color has-text-color\">LABORATOIRE<\/h2>\n\n\n\n<p><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Les proc\u00e9dures stock\u00e9es (ou \u00ab\u00a0stored procedures\u00a0\u00bb en anglais) sous Oracle sont des objets de base de donn\u00e9es qui permettent de regrouper un ensemble d&rsquo;instructions SQL en une seule unit\u00e9 logique et r\u00e9utilisable. Elles sont utilis\u00e9es pour automatiser des t\u00e2ches complexes, effectuer des op\u00e9rations sur la base de donn\u00e9es, et encapsuler la logique m\u00e9tier au sein [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"footnotes":""},"class_list":["post-692","page","type-page","status-publish","hentry"],"_links":{"self":[{"href":"https:\/\/ve2cuy.com\/index.php\/wp-json\/wp\/v2\/pages\/692","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/ve2cuy.com\/index.php\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/ve2cuy.com\/index.php\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/ve2cuy.com\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/ve2cuy.com\/index.php\/wp-json\/wp\/v2\/comments?post=692"}],"version-history":[{"count":5,"href":"https:\/\/ve2cuy.com\/index.php\/wp-json\/wp\/v2\/pages\/692\/revisions"}],"predecessor-version":[{"id":1024,"href":"https:\/\/ve2cuy.com\/index.php\/wp-json\/wp\/v2\/pages\/692\/revisions\/1024"}],"wp:attachment":[{"href":"https:\/\/ve2cuy.com\/index.php\/wp-json\/wp\/v2\/media?parent=692"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}