Les procédures stockées (ou « stored procedures » en anglais) sous Oracle sont des objets de base de données qui permettent de regrouper un ensemble d’instructions SQL en une seule unité logique et réutilisable. Elles sont utilisées pour automatiser des tâches complexes, effectuer des opérations sur la base de données, et encapsuler la logique métier au sein de la base de données. Les procédures stockées offrent plusieurs avantages, notamment la réutilisabilité, la modularité, la sécurité et la facilité de maintenance.
Voici le rôle principal des procédures stockées dans Oracle :
La syntaxe de base des procédures stockées dans Oracle suit un modèle standard, bien que les détails puissent varier en fonction des besoins spécifiques de votre procédure. Voici la structure de base d’une procédure stockée Oracle :
CREATE OR REPLACE PROCEDURE nom_de_la_procedure ( parametre1 type_de_donnee1, parametre2 type_de_donnee2, ... ) AS -- Déclarations de variables locales variable1 type_de_donnee1; variable2 type_de_donnee2; ... BEGIN -- Logique de la procédure -- Utilisation des paramètres et des variables locales -- Instructions SQL -- Manipulation des données, mises à jour, insertions, etc. -- Gestion des exceptions (facultatif) -- Utilisation de blocs TRY...EXCEPTION pour gérer les erreurs -- COMMIT ou ROLLBACK (facultatif) -- Pour valider ou annuler la transaction EXCEPTION WHEN nom_de_l_exception THEN -- Traitement des exceptions END nom_de_la_procedure; /
Explications des éléments clés de la syntaxe :
CREATE OR REPLACE PROCEDURE
: Cette clause indique que vous créez ou remplacez une procédure stockée. Si la procédure existe déjà avec le même nom, elle sera remplacée par la nouvelle définition.nom_de_la_procedure
: C’est le nom que vous donnez à votre procédure. Assurez-vous de choisir un nom descriptif et unique.(parametre1 type_de_donnee1, parametre2 type_de_donnee2, ...)
: Vous pouvez spécifier des paramètres en entrée pour votre procédure. Chaque paramètre est suivi de son type de données. Ces paramètres permettent à la procédure d’accepter des valeurs en entrée.AS
: Cette clause marque le début du corps de la procédure. C’est là que vous définissez les variables locales et commencez la logique de la procédure.BEGIN
: C’est le début du bloc de code où vous définissez la logique de la procédure. C’est ici que vous effectuez des opérations SQL, utilisez des paramètres et des variables locales, gérez les exceptions, et définissez le comportement de la procédure.EXCEPTION
: Cette section est utilisée pour gérer les exceptions qui peuvent survenir pendant l’exécution de la procédure. Vous pouvez spécifier différentes exceptions et définir comment elles doivent être gérées.COMMIT
ou ROLLBACK
(facultatif) : Vous pouvez utiliser ces commandes pour valider ou annuler la transaction en cours, en fonction du résultat de la procédure.Notez que la syntaxe de base des procédures stockées peut être étendue pour inclure des fonctionnalités plus avancées, telles que des boucles, des structures de contrôle conditionnelles, des transactions, des requêtes SQL complexes, etc. Cependant, la structure de base décrite ci-dessus vous permet de créer des procédures stockées simples et fonctionnelles.
Voici un exemple simple de création et d’utilisation d’une procédure stockée dans Oracle :
Création d’une procédure stockée :
Supposons que vous ayez une table « Employes » contenant des données sur les employés, et vous souhaitez créer une procédure stockée pour ajouter un nouvel employé à la base de données. Voici comment vous pouvez créer une telle procédure :
CREATE OR REPLACE PROCEDURE AjouterEmploye ( p_nom VARCHAR2, p_prenom VARCHAR2, p_salaire NUMBER ) AS BEGIN INSERT INTO Employes (Nom, Prenom, Salaire) VALUES (p_nom, p_prenom, p_salaire); COMMIT; END AjouterEmploye;
Appel de la procédure stockée :
Vous pouvez ensuite appeler la procédure stockée pour ajouter un employé :
BEGIN AjouterEmploye('Doe', 'John', 50000); END;
Dans cet exemple, la procédure stockée « AjouterEmploye » prend les informations d’un nouvel employé (nom, prénom et salaire) en tant que paramètres d’entrée et les insère dans la table « Employes ». La commande COMMIT
assure que la transaction est validée.
Les procédures stockées peuvent devenir beaucoup plus complexes que cet exemple simple, et elles peuvent inclure des structures de contrôle, des transactions, des gestionnaires d’exceptions, et bien d’autres fonctionnalités pour gérer des tâches plus avancées.
CREATE OR REPLACE PROCEDURE MettreAJourSalaireDepartement ( p_departement_id NUMBER, p_pourcentage_augmentation NUMBER ) AS BEGIN UPDATE Employes SET Salaire = Salaire * (1 + p_pourcentage_augmentation / 100) WHERE IDDepartement = p_departement_id; COMMIT; END MettreAJourSalaireDepartement;
Utilisation :
BEGIN MettreAJourSalaireDepartement(1, 5); -- 1 est l'ID du département "Vente", 5% d'augmentation END;
CREATE OR REPLACE PROCEDURE SupprimerEmployeParID (p_employe_id NUMBER) AS BEGIN DELETE FROM Employes WHERE ID = p_employe_id; COMMIT; END SupprimerEmployeParID;
Utilisation :
BEGIN SupprimerEmployeParID(101); END;
CREATE OR REPLACE PROCEDURE CalculerPrimeAnnuelle AS BEGIN UPDATE Employes SET PrimeAnnuelle = Salaire * 0.1; -- 10% du salaire COMMIT; END CalculerPrimeAnnuelle;
Utilisation :
BEGIN CalculerPrimeAnnuelle; END;
CREATE OR REPLACE PROCEDURE VerifierAdmissibiliteRetraite ( p_employe_id NUMBER ) AS v_age NUMBER; v_annees_service NUMBER; BEGIN SELECT CalculerAge(DateEmbauche) INTO v_age FROM Employes WHERE ID = p_employe_id; SELECT MONTHS_BETWEEN(SYSDATE, DateEmbauche) / 12 INTO v_annees_service FROM Employes WHERE ID = p_employe_id; IF v_age >= 65 OR v_annees_service >= 30 THEN DBMS_OUTPUT.PUT_LINE('L\'employé est admissible à la retraite.'); ELSE DBMS_OUTPUT.PUT_LINE('L\'employé n\'est pas encore admissible à la retraite.'); END IF; END VerifierAdmissibiliteRetraite;
Utilisation :
BEGIN VerifierAdmissibiliteRetraite(201); END;
CREATE OR REPLACE PROCEDURE CreerDepartementAvecEmployes ( p_nom_departement VARCHAR2, p_nb_employes NUMBER ) AS BEGIN INSERT INTO Departements (Nom) VALUES (p_nom_departement); COMMIT; FOR i IN 1..p_nb_employes LOOP INSERT INTO Employes (Nom, Prenom, Salaire, IDDepartement) VALUES ('Nom' || i, 'Prenom' || i, 50000, (SELECT ID FROM Departements WHERE Nom = p_nom_departement)); END LOOP; COMMIT; END CreerDepartementAvecEmployes;
Utilisation :
BEGIN CreerDepartementAvecEmployes('R&D', 10); END;