
Package Oracle PL/SQL : Guide complet avec exemples pratiques
Le package Oracle PL/SQL est l’un des objets les plus puissants de la base de données Oracle. Il permet de regrouper des procédures, des fonctions, des variables et des types au sein d’une même unité logique. Très utilisé en entreprise pour organiser et sécuriser le code métier, le package Oracle favorise la modularité, la maintenabilité et les performances applicatives.
Définition et utilisation du Package Oracle
Un package Oracle est un objet de schéma PL/SQL qui encapsule un ensemble d’éléments liés entre eux : procédures stockées, fonctions, curseurs, variables globales, types et exceptions. Il se compose obligatoirement de deux parties distinctes :
- La spécification (SPEC) : c’est l’interface publique du package. Elle déclare les éléments accessibles depuis l’extérieur (procédures, fonctions, types, constantes, etc.).
- Le corps (BODY) : c’est l’implémentation privée. Il contient le code des procédures et fonctions déclarées dans la spécification, ainsi que des éléments internes non exposés.
Cas d’usage en entreprise
Les packages sont massivement utilisés dans les projets Oracle professionnels pour plusieurs raisons :
- Organisation du code métier : regrouper toutes les opérations liées à la gestion des commandes dans un seul package
PKG_COMMANDES. - Amélioration des performances : Oracle charge le package entier en mémoire lors du premier appel, réduisant les accès disque pour les appels suivants.
- Encapsulation et sécurité : les éléments privés du corps ne sont pas visibles depuis l’extérieur, protégeant la logique interne.
- Variables de session : les variables déclarées dans la spécification conservent leur valeur tout au long d’une session Oracle.
- Réduction des dépendances : modifier le corps d’un package n’invalide pas les objets qui dépendent de sa spécification.
Syntaxe du Package Oracle PL/SQL
La création d’un package Oracle se fait en deux étapes distinctes : la spécification puis le corps.
Syntaxe de la spécification
CREATE [OR REPLACE] PACKAGE nom_package AS
-- Déclaration des types publics
TYPE nom_type IS ...;
-- Déclaration des constantes publiques
c_constante CONSTANT type := valeur;
-- Déclaration des variables publiques
v_variable type;
-- En-têtes des procédures publiques
PROCEDURE nom_procedure (parametre TYPE);
-- En-têtes des fonctions publiques
FUNCTION nom_fonction (parametre TYPE) RETURN type_retour;
END nom_package;
/
Syntaxe du corps
CREATE [OR REPLACE] PACKAGE BODY nom_package AS
-- Variables privées (invisibles depuis l'extérieur)
v_variable_privee type;
-- Implémentation des procédures
PROCEDURE nom_procedure (parametre TYPE) IS
BEGIN
-- code de la procédure
END nom_procedure;
-- Implémentation des fonctions
FUNCTION nom_fonction (parametre TYPE) RETURN type_retour IS
BEGIN
-- code de la fonction
RETURN valeur;
END nom_fonction;
END nom_package;
/
Paramètres essentiels
OR REPLACE: recompile le package s’il existe déjà, sans le supprimer.nom_package: nom unique dans le schéma, en général préfixé parPKG_par convention.- Spécification : contient uniquement les déclarations (pas de code).
- Body : contient l’implémentation complète ; peut exister sans spécification si tout est privé.
Exemples pratiques de Package Oracle
Exemple 1 – Package de gestion des employés (contexte RH)
Dans un système de gestion des ressources humaines, on regroupe les opérations sur les employés dans un seul package.
-- ============================================================
-- SPÉCIFICATION : interface publique du package
-- ============================================================
CREATE OR REPLACE PACKAGE PKG_EMPLOYES AS
-- Constante : salaire minimum légal
c_salaire_min CONSTANT NUMBER := 1800;
-- Procédure d'augmentation de salaire
PROCEDURE augmenter_salaire (
p_id_employe IN NUMBER,
p_pourcentage IN NUMBER
);
-- Fonction retournant le salaire annuel brut
FUNCTION get_salaire_annuel (
p_id_employe IN NUMBER
) RETURN NUMBER;
END PKG_EMPLOYES;
/
-- ============================================================
-- CORPS : implémentation des traitements
-- ============================================================
CREATE OR REPLACE PACKAGE BODY PKG_EMPLOYES AS
-- Procédure : augmente le salaire d'un employé
PROCEDURE augmenter_salaire (
p_id_employe IN NUMBER,
p_pourcentage IN NUMBER
) IS
BEGIN
UPDATE employes
SET salaire = salaire * (1 + p_pourcentage / 100)
WHERE id_employe = p_id_employe;
COMMIT;
DBMS_OUTPUT.PUT_LINE('Salaire mis à jour avec succès.');
EXCEPTION
WHEN NO_DATA_FOUND THEN
DBMS_OUTPUT.PUT_LINE('Employé introuvable.');
END augmenter_salaire;
-- Fonction : retourne le salaire annuel brut
FUNCTION get_salaire_annuel (
p_id_employe IN NUMBER
) RETURN NUMBER IS
v_salaire NUMBER;
BEGIN
SELECT salaire * 12
INTO v_salaire
FROM employes
WHERE id_employe = p_id_employe;
RETURN v_salaire;
EXCEPTION
WHEN NO_DATA_FOUND THEN
RETURN 0;
END get_salaire_annuel;
END PKG_EMPLOYES;
/
-- ============================================================
-- APPEL depuis un bloc PL/SQL anonyme
-- ============================================================
BEGIN
-- Augmentation de 10% pour l'employé n°42
PKG_EMPLOYES.augmenter_salaire(42, 10);
-- Affichage du salaire annuel
DBMS_OUTPUT.PUT_LINE(
'Salaire annuel : ' || PKG_EMPLOYES.get_salaire_annuel(42)
);
END;
/
Exemple 2 – Package de journalisation (contexte applicatif)
Dans une application Oracle multi-modules, on centralise la journalisation des événements dans un package dédié.
-- ============================================================
-- SPÉCIFICATION : interface publique
-- ============================================================
CREATE OR REPLACE PACKAGE PKG_LOG AS
-- Niveaux de log disponibles
c_info CONSTANT VARCHAR2(10) := 'INFO';
c_warning CONSTANT VARCHAR2(10) := 'WARNING';
c_erreur CONSTANT VARCHAR2(10) := 'ERREUR';
-- Procédure d'écriture de log
PROCEDURE ecrire_log (
p_module IN VARCHAR2,
p_niveau IN VARCHAR2,
p_message IN VARCHAR2
);
END PKG_LOG;
/
-- ============================================================
-- CORPS : implémentation
-- ============================================================
CREATE OR REPLACE PACKAGE BODY PKG_LOG AS
PROCEDURE ecrire_log (
p_module IN VARCHAR2,
p_niveau IN VARCHAR2,
p_message IN VARCHAR2
) IS
-- Utilisation de PRAGMA AUTONOMOUS_TRANSACTION
-- pour que le log soit sauvegardé même si la
-- transaction principale est annulée (ROLLBACK)
PRAGMA AUTONOMOUS_TRANSACTION;
BEGIN
INSERT INTO app_logs (
log_date, module, niveau, message
) VALUES (
SYSDATE, p_module, p_niveau, p_message
);
COMMIT;
END ecrire_log;
END PKG_LOG;
/
-- ============================================================
-- UTILISATION dans un traitement métier
-- ============================================================
BEGIN
PKG_LOG.ecrire_log('MODULE_COMMANDES', PKG_LOG.c_info,
'Début du traitement des commandes.');
-- ... traitement ...
PKG_LOG.ecrire_log('MODULE_COMMANDES', PKG_LOG.c_info,
'Traitement terminé avec succès.');
END;
/
Erreurs courantes avec les Packages Oracle
Erreur : PLS-00201 – Identifier must be declared
Cause : Vous appelez une procédure ou une fonction qui n’est pas déclarée dans la spécification du package, mais uniquement dans le corps. Cela se produit souvent quand un développeur oublie d’ajouter l’en-tête dans la spécification après avoir ajouté la procédure dans le corps.
-- ❌ ERREUR : la procédure est dans le BODY mais pas dans la SPEC
BEGIN
PKG_EMPLOYES.procedure_oubliee(42); -- PLS-00201
END;
/
Solution : Ajouter systématiquement la déclaration de la procédure ou fonction dans la spécification du package avant de la coder dans le corps, puis recompiler les deux parties avec CREATE OR REPLACE.
-- ✅ CORRECTION : déclarer dans la SPEC
CREATE OR REPLACE PACKAGE PKG_EMPLOYES AS
PROCEDURE procedure_oubliee (p_id IN NUMBER); -- ajout ici
...
END PKG_EMPLOYES;
/
Résumé du Package Oracle PL/SQL
| Caractéristique | Détail |
|---|---|
| Objet Oracle | PACKAGE (spécification) + PACKAGE BODY (corps) |
| Contenu possible | Procédures, fonctions, types, variables, curseurs, exceptions |
| Portée publique | Éléments déclarés dans la SPEC |
| Portée privée | Éléments uniquement dans le BODY |
| Avantage performance | Chargement unique en mémoire (SGA) |
| Variables de session | Persistent pendant toute la durée de la session |
| Instruction de création | CREATE [OR REPLACE] PACKAGE ... AS ... END; |
| Instruction de suppression | DROP PACKAGE nom_package; |
Bonnes pratiques Oracle
- Adoptez une convention de nommage cohérente : préfixez tous vos packages par
PKG_, vos procédures parPRC_ouSP_et vos fonctions parFN_. Cela facilite la navigation dans le schéma Oracle et la génération de documentation automatique. - Gérez toujours les exceptions dans le corps du package : chaque procédure et fonction doit comporter un bloc
EXCEPTIONafin d’éviter les remontées d’erreur non contrôlées vers les couches applicatives, et d’utiliserPKG_LOGpour tracer les anomalies.
Aller plus loin
Pour approfondir votre maîtrise des objets Oracle PL/SQL en lien avec les packages, nous vous recommandons ces lectures complémentaires :
- Procédure stockée Oracle PL/SQL : créer et appeler une procédure – indispensable pour maîtriser les composants internes d’un package.
- Fonction Oracle PL/SQL : définition, syntaxe et exemples – comprenez la différence entre procédure et fonction avant de les intégrer dans vos packages.
- Trigger Oracle PL/SQL : guide complet avec exemples – les triggers peuvent appeler des procédures de packages pour centraliser la logique métier.
