Package Oracle PL/SQL : Guide complet et exemples

Découvrez le Package Oracle PL/SQL : définition, syntaxe, exemples pratiques et erreurs courantes. Maîtrisez cet objet essentiel en entreprise.

Illustration du tutoriel SQL Oracle : Package Oracle PL/SQL : Guide complet et exemples

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.

Publicité

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é par PKG_ 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é.
Publicité

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éristiqueDétail
Objet OraclePACKAGE (spécification) + PACKAGE BODY (corps)
Contenu possibleProcé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 performanceChargement unique en mémoire (SGA)
Variables de sessionPersistent pendant toute la durée de la session
Instruction de créationCREATE [OR REPLACE] PACKAGE ... AS ... END;
Instruction de suppressionDROP PACKAGE nom_package;

Bonnes pratiques Oracle

  1. Adoptez une convention de nommage cohérente : préfixez tous vos packages par PKG_, vos procédures par PRC_ ou SP_ et vos fonctions par FN_. Cela facilite la navigation dans le schéma Oracle et la génération de documentation automatique.
  2. Gérez toujours les exceptions dans le corps du package : chaque procédure et fonction doit comporter un bloc EXCEPTION afin d’éviter les remontées d’erreur non contrôlées vers les couches applicatives, et d’utiliser PKG_LOG pour 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 :

Publicité

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Publicité