Enseignant
Mohamed Mohamed Beirouk
Contact
beirouk.ext@iscae.mr
Établissement
ISCAE
Année Académique
2025-2026
Concepts Fondamentaux
02
Procedural Language extensions to SQL. C'est le langage procédural propriétaire d'Oracle qui combine la puissance de manipulation de données du SQL avec la puissance de traitement des langages procéduraux.
Performance : Exécution côté serveur, réduisant le trafic réseau.
Sécurité : Contrôle d'accès granulaire via procédures stockées.
Modularité : Développement par blocs logiques réutilisables.
Exemple : Hello World
Code 1.0Les fondations du langage
03
Déclaration de variables, curseurs, types, exceptions locales.
Instructions exécutables : SQL (DML) et PL/SQL.
Gestion des erreurs d'exécution.
Non nommé, non stocké dans la BD. Compilé et exécuté à la volée.
Procédures, Fonctions, Triggers, Packages. Stockés et réutilisables.
Exemple : Bloc avec Exception
Code 2.0Structures de Contrôle
04
Permet l'exécution conditionnelle de blocs de code. Trois variantes principales :
Alternative plus lisible aux séries de IF imbriqués. Deux formes :
Compare une expression à une liste de valeurs.
Évalue une série de conditions booléennes (WHEN condition).
Conseil : Utilisez CASE plutôt que de multiples ELSIF lorsque vous testez une seule variable contre plusieurs valeurs constantes pour une meilleure lisibilité.
Exemple : Évaluation de notes
Code 4.0Structures Itératives
05
PL/SQL propose trois structures itératives principales pour répéter des instructions. La gestion correcte des sorties de boucle est essentielle pour éviter les boucles infinies.
LOOP Simple
Boucle de base. Nécessite une clause EXIT WHEN pour s'arrêter.
WHILE Loop
Répète tant que la condition est VRAIE. Condition évaluée avant chaque itération.
FOR Loop
Itère un nombre de fois défini (ex: 1..10). Compteur géré automatiquement.
Exemple Pratique : 3 Syntaxes
Code 5.0Traitement ligne par ligne
06
Un curseur est une zone mémoire privée SQL utilisée pour traiter plusieurs lignes retournées par une requête SELECT ou DML.
Géré automatiquement par Oracle (INSERT, UPDATE, DELETE, SELECT INTO).
Déclaré par le programmeur pour les requêtes multi-lignes.
Exemple : Curseur Explicite
Loop & FetchFiabilité et Contrôle d'Erreurs
07
En PL/SQL, les erreurs ne plantent pas le programme brutalement. Elles lèvent des exceptions qui peuvent être interceptées (caught) et traitées proprement dans la section EXCEPTION.
Erreurs standards nommées : NO_DATA_FOUND, TOO_MANY_ROWS, ZERO_DIVIDE.
Erreurs métier spécifiques déclarées avec le type EXCEPTION.
Procédure pour renvoyer une erreur personnalisée à l'application (codes -20000 à -20999).
Exemple : Exception Personnalisée
Code 7.0Blocs Nommés & Modulaires
08
Une procédure est un sous-programme stocké qui exécute une action spécifique. Elle est créée avec CREATE OR REPLACE PROCEDURE.
Contrairement aux fonctions, une procédure ne retourne pas obligatoirement une valeur via RETURN, mais peut utiliser des paramètres de sortie.
Entrée (Défaut)
Passe une valeur à la procédure. Lecture seule.
Sortie
Renvoie une valeur à l'environnement appelant.
Entrée & Sortie
Passe une valeur initiale et retourne une valeur modifiée.
Bonnes Pratiques
Valider toujours les paramètres entrants et gérer les exceptions à l'intérieur de la procédure pour éviter les erreurs non contrôlées.
Exemple : Mise à jour Email
Code 8.0Valeurs de retour et utilisation SQL
09
Une fonction est un sous-programme nommé qui prend des paramètres et retourne obligatoirement une valeur unique. Contrairement à une procédure, elle est conçue pour calculer et renvoyer un résultat.
Clause RETURN obligatoire dans l'en-tête et le corps.
Utilisation en SQL : Peut être appelée directement dans une requête SELECT, WHERE, etc.
Idéale pour encapsuler des calculs ou des règles métier réutilisables.
Exécute une action (DML). Retourne valeurs via paramètres OUT.
Calcule une donnée. Retourne une valeur via RETURN.
Exemple : Fonction d'Arrondi
Code 9.0Automatisation et Audit
10
Un trigger est un bloc PL/SQL stocké qui s'exécute automatiquement (se "déclenche") en réponse à un événement spécifique sur la base de données (INSERT, UPDATE, DELETE).
Timing & Événements
Timing: BEFORE, AFTER, INSTEAD OF (Vues).
Events: INSERT, UPDATE, DELETE.
Niveau d'exécution
Instruction (défaut) : une fois par commande SQL.
Ligne (FOR EACH ROW) : une fois par ligne affectée.
Pseudo-enregistrements
:OLD (ancienne valeur) et :NEW (nouvelle valeur).
Exemple : Auto-update Date
Trigger Niveau LigneStructures de données composites
11
PL/SQL propose trois types principaux pour stocker des ensembles de données de même type.
Taille fixe maximum définie à la création. Dense (pas de trous). Conserve l'ordre.
Taille dynamique illimitée. Peut contenir des trous après suppression. Peut être stockée en base.
Paires Clé-Valeur (Hash Map). L'index peut être un nombre ou une chaîne (VARCHAR2).
Exemple Complet
Code 11.0En utilisant la boucle FOR, écrire un programme PL/SQL qui affiche 7 fois le mot « Bonjour ».
Note :
La boucle FOR est idéale lorsque le nombre d'itérations est connu à l'avance (ici 7).
Le programme va itérer de 1 à 7 et exécuter l'instruction d'affichage à chaque passage.
En utilisant la boucle WHILE, écrire un programme PL/SQL qui affiche 7 fois le mot « Bonjour ».
Point d'attention :
Avec WHILE, vous devez gérer manuellement l'initialisation et l'incrémentation de la variable compteur pour éviter une boucle infinie.
Le résultat est identique à la boucle FOR, mais la logique interne diffère.
Créer un TYPE tableau (VARRAY) pouvant contenir jusqu'à 30 entiers.
Déclarer une variable, faire une allocation dynamique de 10 emplacements.
Remplir avec les 10 premiers carrés (4, 16, 36... 400).
Créez une fonction PL/SQL nommée GET_MODULE_TITRE qui prend en paramètre le code d'un module et retourne son titre.
La fonction doit gérer le cas où le code n'existe pas en levant une exception avec un message clair.
Point clé :
Utilisez l'exception NO_DATA_FOUND et RAISE_APPLICATION_ERROR pour une gestion d'erreur robuste.
Exemples d'appel SQL de la fonction :
Créez une fonction PL/SQL qui prend en paramètre un matricule d'étudiant et retourne sa moyenne (moyenne de toutes ses évaluations CC).
Rappel :
Utilisez la fonction d'agrégation SQL AVG(). Si aucune note n'existe, la fonction retournera NULL, ce qui est correct.
Exemple d'appel via une requête SQL SELECT sur la table DUAL.
Créez une fonction PL/SQL qui prend en paramètre un matricule d'étudiant et retourne sa moyenne (moyenne de toutes ses évaluations CC).
Rappel :
Utilisez la fonction d'agrégation SQL AVG(). Si aucune note n'existe, la fonction retournera NULL, ce qui est correct.
Exemple d'appel via une requête SQL SELECT sur la table DUAL.
Créez un curseur qui récupère toutes les évaluations d'un étudiant spécifié par son matricule.
Affichez pour chaque ligne : le matricule, le code du module, le titre du module (depuis la table modules) et la noteCC.
Astuce :
Déclarez un curseur qui prend un paramètre (p_mat) et utilisez un JOIN naturel ou explicite entre les tables.
Exemple d'exécution pour l'étudiant 'ETU001' :
Créez un déclencheur (trigger) pour enregistrer les modifications apportées aux étudiants (une nouvelle table qui contient l'ancienne valeur, la nouvelle valeur et la date de modification).
Stratégie :
1. Créer une table historique (log).
2. Trigger AFTER UPDATE.
3. Utiliser les pseudo-enregistrements :OLD et :NEW.
Structure recommandée pour AUDIT_ETUDIANTS :
ID_AUDIT (PK)
MATRICULE
ANCIEN_NOM / NOUVEAU_NOM
ANCIEN_PRENOM / NOUVEAU_PRENOM
DATE_MODIF
UTILISATEUR
Mettre en place une suppression en cascade à l'aide de déclencheurs (triggers). Lorsqu'un étudiant est supprimé, toutes ses évaluations doivent être supprimées automatiquement pour éviter les erreurs d'intégrité référentielle.
Note :
C'est une alternative logicielle aux contraintes de clé étrangère ON DELETE CASCADE.
Le trigger BEFORE DELETE s'exécute juste avant la suppression de l'étudiant, nettoyant d'abord les tables enfants.
Optimisation & Maintenance
21
Écrire du code qui fonctionne ne suffit pas. Un code PL/SQL professionnel doit être lisible, maintenable et performant pour supporter la charge des bases de données de production.
Utiliser des préfixes pour identifier la portée :
v_nom : Variable localep_nom : Paramètre de procédure/fonctiong_nom : Variable globale (package)c_nom : ConstanteRéduire les changements de contexte (Context Switches) :
Utiliser BULK COLLECT pour les requêtes ramenant beaucoup de lignes.
Utiliser FORALL pour les insertions/mises à jour de masse.
Toujours capturer les exceptions. Éviter WHEN OTHERS THEN NULL qui masque les erreurs critiques. Utiliser %TYPE et %ROWTYPE.
Exemple : Performance (FORALL)
Code 10.0Synthèse du cours
22
Blocs PL/SQL
Structure & Variables
Contrôle
IF, CASE, Boucles
Curseurs
Traitement ligne/ligne
Exceptions
Gestion d'erreurs
Procédures & Fonctions
Sous-programmes
Triggers
Automatisation
Collections
Tableaux & Varrays
TP Validé
10 Exercices résolus