0-HISTORIQUE DE PL/SQL
0.1 Les origines
PL/SQL a été introduit par Oracle Corporation à la fin des années 1980, à un moment où les
bases de données relationnelles étaient de plus en plus utilisées pour gérer de grands volumes
de données.
À cette période, SQL était le langage standard pour interagir avec les bases de données, mais
il présentait une grande limitation :
SQL est déclaratif → on dit quoi faire mais pas comment le faire.
Cette limite devenait problématique pour :
• automatiser des traitements,
• faire des calculs complexes,
• contrôler la logique métier,
• répéter des actions.
Oracle décide alors de créer un langage complémentaire à SQL, capable de gérer la logique
procédurale directement dans la base : PL/SQL.
0.2 Dates importantes
Année Événement
1988 Introduction officielle de PL/SQL avec Oracle 6
1991 Oracle 7 → apparition des procédures stockées & triggers
1997 Oracle 8 → collections et objets PL/SQL
1999 Oracle 8i → BULK COLLECT et FORALL
2001 Oracle 9i → SQL dynamique amélioré
2004 Oracle 10g → performances PL/SQL optimisées
2007 Oracle 11g → compilation native, nouveaux types
2013 Oracle 12c → sécurisation et performances accrues
2018 Oracle 18c/19c → fonctionnalités Cloud & optimisation automatique
0.3 Pourquoi Oracle a créé PL/SQL ?
Parce que SQL seul ne suffisait pas.
SQL :
• ne gère pas les boucles,
• ne gère pas les conditions complexes,
• ne permet pas de stocker des variables,
• ne permet pas de créer des programmes réutilisables,
Recap - Programmation PL/SQL - MASI 1
• ne gère pas les exceptions.
PL/SQL ajoute une vraie couche de programmation au moteur SQL, permettant de créer :
• des applications bancaires,
• des systèmes d’entreprise critiques,
• des traitements massifs,
• des workflows complets,
• des calculs automatisés.
Oracle cible dès le départ les banques, les télécoms, les hôpitaux, les gouvernements, etc.
1 – INTRODUCTION À PL/SQL
1.1 Qu’est-ce que PL/SQL ?
PL/SQL signifie Procedural Language/SQL. C’est un langage procédural intégré à Oracle.
Il permet de combler les limites de SQL simple :
• Ajouter des variables
• Gérer les conditions, les boucles
• Faire du traitement séquentiel
• Créer des procédures, fonctions, triggers
• Automatiser des opérations
PL/SQL = SQL + IF + BOUCLES + PROCEDURES + ERREURS
Il est exécuté par le moteur SQL*Plus, Oracle Forms, Oracle DB, Oracle Apex…
1.2 Avantages de PL/SQL
• Performances élevées (moins d’allers-retours réseau)
• Sécurité (accès contrôlé)
• Réutilisation du code (packages, fonctions)
• Robustesse (gestion d’erreurs avancée)
• Productivité (scripts automatisés)
1.3 Architecture de PL/SQL
Un programme est compilé dans Oracle, puis stocké en code intermédiaire.
Il peut être exécuté très rapidement grâce au compilateur PL/SQL intégré au moteur Oracle.
Recap - Programmation PL/SQL - MASI 2
2 – STRUCTURE D’UN BLOC PL/SQL
Structure générale :
DECLARE
-- Variables
BEGIN
-- Instructions
EXCEPTION
-- Gestion des erreurs
END;
/
Sections détaillées :
Section Description
DECLARE Déclaration des variables (optionnelle)
BEGIN Zone d’exécution
EXCEPTION Traitement des erreurs
END Fin du bloc
3 – DÉCLARATION ET TYPES DE
DONNÉES
3.1 Les types de données
Numériques
• NUMBER(p,s)
• PLS_INTEGER
• BINARY_INTEGER
Chaînes
• VARCHAR2(n)
• CHAR(n)
• CLOB
Dates
• DATE
• TIMESTAMP
• INTERVAL
Booléens
Recap - Programmation PL/SQL - MASI 3
• BOOLEAN (existe en PL/SQL mais pas en SQL)
3.2 Déclarer une variable
DECLARE
v_nom VARCHAR2(30);
v_age NUMBER(3) := 25;
v_salaire NUMBER DEFAULT 250000;
3.3 Constantes
pi CONSTANT NUMBER := 3.14;
3.4 Attributs %TYPE et %ROWTYPE
%TYPE
Prend le même type qu’une colonne.
DECLARE
v_sal [Link]%TYPE;
%ROWTYPE
Prend toute une ligne.
DECLARE
v_emp employe%ROWTYPE;
4 – LES INSTRUCTIONS
CONDITIONNELLES
4.1 IF – THEN – ELSE
IF v_age > 18 THEN
DBMS_OUTPUT.PUT_LINE('Adulte');
ELSE
DBMS_OUTPUT.PUT_LINE('Mineur');
END IF;
4.2 ELSIF
Recap - Programmation PL/SQL - MASI 4
IF note >= 16 THEN
mention := 'Très Bien';
ELSIF note >= 14 THEN
mention := 'Bien';
ELSIF note >= 12 THEN
mention := 'Assez Bien';
ELSE
mention := 'Insuffisant';
END IF;
4.3 CASE
CASE sexe
WHEN 'M' THEN lib := 'Homme';
WHEN 'F' THEN lib := 'Femme';
ELSE lib := 'Autre';
END CASE;
5 – BOUCLES
5.1 Boucle simple
LOOP
compteur := compteur + 1;
EXIT WHEN compteur = 10;
END LOOP;
5.2 Boucle WHILE
WHILE v_x < 100 LOOP
v_x := v_x + 10;
END LOOP;
5.3 Boucle FOR
FOR i IN 1..10 LOOP
DBMS_OUTPUT.PUT_LINE('i = ' || i);
END LOOP;
5.4 Boucle FOR inversée
FOR i IN REVERSE 10..1 LOOP
DBMS_OUTPUT.PUT_LINE(i);
END LOOP;
Recap - Programmation PL/SQL - MASI 5
6 – CURSEURS
Un curseur permet de parcourir plusieurs lignes d’une table.
6.1 Curseur explicite
DECLARE
CURSOR c IS SELECT nom, salaire FROM employe;
v_nom [Link]%TYPE;
v_sal [Link]%TYPE;
BEGIN
OPEN c;
LOOP
FETCH c INTO v_nom, v_sal;
EXIT WHEN c%NOTFOUND;
DBMS_OUTPUT.PUT_LINE(v_nom || ' - ' || v_sal);
END LOOP;
CLOSE c;
END;
/
6.2 Curseur avec paramètres
CURSOR c(p_dep NUMBER) IS
SELECT nom FROM employe WHERE departement = p_dep;
6.3 Curseurs implicites
Oracle gère automatiquement :
• SQL%NOTFOUND
• SQL%ROWCOUNT
• SQL%FOUND
Exemple :
UPDATE employe SET salaire = salaire + 50000 WHERE departement = 2;
IF SQL%ROWCOUNT > 0 THEN
DBMS_OUTPUT.PUT_LINE('Mise à jour faite');
END IF;
Recap - Programmation PL/SQL - MASI 6
7 – EXCEPTIONS (GESTION DES
ERREURS)
7.1 Exceptions prédéfinies
• NO_DATA_FOUND
• TOO_MANY_ROWS
• ZERO_DIVIDE
• DUP_VAL_ON_INDEX
Exemple :
BEGIN
SELECT nom INTO v_nom FROM employe WHERE id = 1;
EXCEPTION
WHEN NO_DATA_FOUND THEN
DBMS_OUTPUT.PUT_LINE('Aucun employé trouvé');
END;
7.2 Exceptions personnalisées
DECLARE
e_solde_negatif EXCEPTION;
BEGIN
IF solde < 0 THEN
RAISE e_solde_negatif;
END IF;
EXCEPTION
WHEN e_solde_negatif THEN
DBMS_OUTPUT.PUT_LINE('Solde négatif interdit');
END;
8 – PROCÉDURES, FONCTIONS,
PACKAGES
8.1 Procédures
CREATE OR REPLACE PROCEDURE ajouter_client(p_nom VARCHAR2) IS
BEGIN
INSERT INTO client(nom) VALUES(p_nom);
END;
/
8.2 Fonctions
Recap - Programmation PL/SQL - MASI 7
CREATE OR REPLACE FUNCTION getSalaire(p_id NUMBER)
RETURN NUMBER IS
v_sal NUMBER;
BEGIN
SELECT salaire INTO v_sal FROM employe WHERE id = p_id;
RETURN v_sal;
END;
/
8.3 Packages
Spécification
CREATE OR REPLACE PACKAGE pkg_employe IS
PROCEDURE ajouter(...);
FUNCTION total RETURN NUMBER;
END;
/
Corps
CREATE OR REPLACE PACKAGE BODY pkg_employe IS
...
END;
/
9 – TRIGGERS
Trigger Before Insert
CREATE OR REPLACE TRIGGER trg_bi_employe
BEFORE INSERT ON employe
FOR EACH ROW
BEGIN
:new.date_creation := SYSDATE;
END;
/
Trigger After Update
CREATE OR REPLACE TRIGGER trg_au_log
AFTER UPDATE ON employe
FOR EACH ROW
BEGIN
INSERT INTO log_table VALUES(...);
END;
/
Recap - Programmation PL/SQL - MASI 8
10 – TABLEAUX (COLLECTIONS)
PL/SQL possède trois types de collections :
1. VARRAY
2. Nested Table
3. Associative Array (index-by)
Exemple :
TYPE t_noms IS TABLE OF VARCHAR2(30);
v_liste t_noms := t_noms('Jean', 'Paul', 'Marc');
11 – BULK COLLECT ET FORALL
Pour optimiser les performances sur les gros volumes.
11.1 BULK COLLECT
SELECT nom BULK COLLECT INTO v_noms FROM employe;
11.2 FORALL
FORALL i IN v_ids.FIRST..v_ids.LAST
DELETE FROM employe WHERE id = v_ids(i);
12 – DYNAMIQUE SQL
Avec EXECUTE IMMEDIATE
EXECUTE IMMEDIATE 'DELETE FROM employe WHERE id = :x'
USING 10;
Recap - Programmation PL/SQL - MASI 9