Oracle PL SQL Complet
Oracle PL SQL Complet
Durée : 20 Heures
Enseignante : Madame IMA RASMATA
Spécialiste Oracle Database & Developpement ORACLE Période :
Oracle PL/SQL Developer Certified Associate
Février 2025
Téléphone : 00226 77 55 96 62/ 0 3 38 41
Partie I : Cours SQL ORACLE
Rappel
Par définition un système de gestion des bases de données est un ensemble de
programmes destinés à gérer les fichiers Oracle est constitué essentiellement des
couches suivantes :
1. Le noyau : dont le rôle est de
a. Optimisation dans l’exécution des requêtes
b. Gestion des accélérateurs (index et Clusters)
c. Stockage des données
d. Gestion de l’intégrité des données
e. Gestion des connexions à la base de données
f. Exécution des requêtes
d’une façon dynamique la base de données. Il permet ainsi de décrire les objets suivants :
a. Les objets de la base de données (Tables, SYNONYMES, VUES, COLONNES, …)
b. Les utilisateurs accédant à la base de données avec leurs privilèges (CONNECT,
RESOURCE et DBA).
outils d’oracle. Ainsi tout accès à la base de données est exprimé en langage SQL. Le
rôle de cette couche est d’interpréter les commandes SQL , de faire la vérification
syntaxique et sémantique et de les soumettre au noyau pour exécution
3. La couche PL/SQL : cette couche est une extension de la couche SQL puis que
Dans ce cours nous allons voir les différentes requêtes qui manipulent les
données. Ces requêtes s’appellent les DML (Data Manipulation Language).
Ils existent deux types de DML :
–Les requêtes de sélection (SELECT)
–Les requêtes de modification (INSERT, UPDATE et DELETE)
Nous pouvons ajouter dans la clause WHERE les opérateurs logiques pour appliquer
le filtre. L’opérateur AND vérifie que les deux conditions sont vraies, alors que
l’opérateur OR ne vérifie que l’une des deux conditions.
Nous utilisons les parenthèses pour prioriser les conditions. Dans l’exemple ci-dessus, les
conditions du filtre sont touts les employés qui sont embauchés avant le 01/01/2015 et
que leurs prénoms commencent par un A ou bien les employés qui sont embauchés
avant le 01/01/2015 et que leurs prénoms commencent par un B.
Il existe d’autre opérateur logique qu’on utilise dans la clause WHERE qu’on
va voir en détails dans d’autre cours. On va voir aussi dans d’autre cours la
sélection de plusieurs tables et les jointures.
2- Les requetes de modification : INSERT, UPDATE et DELETE
Pour modifier les données d’une table nous utilisons ces trois requêtes :
INSERT : Pour insérer une nouvelle ligne dans
une table. La syntaxe est comme suit :
INSERT INTO nom_de_la_table (col_1, col_2, … col_n) VALUES (val_1, val_2, … val_n);
Dans le deuxième exemple nous allons insérer un autre employé mais nous ne disposons que de
son matricule et son nom : INSERT INTO emp (EMPNO, ENAME) VALUES (2, 'Nom 2');
Les autres colonnes seront insérées comme vide.
Exemple :
UPDATE emp SET sal = 2000, hiredate = '01/02/2015' WHERE empno = 2;
Dans cet exemple nous avons modifié les données “sal” et “hiredate” par 2000 et 01/02/2015
pour l’employé numéro 2.
c) DELETE : Pour supprimer des lignes d’une
table. La syntaxe est comme suit :
DELETE FROM nom_de_la_table WHERE
condition;
Exemple :
Nous allons supprimer l’employé 2
DELETE FROM emp WHERE empno = 2;
NB: Si vous ne spécifier pas le WHERE dans les requêtes DELETE et UPDATE, alors toutes les
lignes de la table seront impactées par la MAJ.
Pour valider une MAJ dans la table il faut exécuter la
requête COMMIT COMMIT;
Dans le cas ou on veut annuler la MAJ, on exécute la
requête ROLLBACK ROLLBACK;
c) REGLES :
PL/SQL :
est un langage procédural qui intègre des ordres SQL de gestion de la base de données
- SELECT
- INSERT, UPDATE, DELETE
- COMMIT, ROLLBACK, SAVEPOINT
- TO_CHAR, TO_DATE, UPPER,
- définition de variables
- traitements conditionnels
- traitements répétitifs
- traitement des curseurs
- traitement des erreurs
3
Chapitre 2 : Structure d’un
bloc PL/SQL
CHAPITRE 2 : Structure d'un bloc PL/SQL
BEGIN [nom_du_bloc]
Instructions SQL et PL/SQL
EXCEPTION
Traitement des exceptions
(gestion des erreurs)
END [nom_du_bloc] ;
Remarques :
- les sections DECLARE et EXCEPTION sont facultatives.
- chaque instruction se termine par un ;
- Les commentaires :
-- sur une ligne
ou
/* sur plusieurs
lignes */
2. Structure d'un bloc PL/SQL (suite ...)
Exemple :
PROMPT nom du produit SQL
ACCEPT prod
DECLARE PL/SQL
qte NUMBER(5)
BEGIN
SELECT quantite INTO qte
FROM stock
WHERE produit= '&prod';
-- on contrôle le stock
IF qte > 0
THEN
UPDATE stock
SET quantite = quantite - 1
WHERE produit = '&prod'; 6
INSERT INTO vente
VALUES('&prod' || 'VENDU' , SYSDATE);
ELSE INSERT INTO commande
VALUES('&prod' || 'DEMANDE' , SYSDATE);
END IF;
COMMIT;
END;
/
7
Chapitre 3 : Les variables utilisées
dans PL/SQL
CHAPITRE 3 : Les variables utilisées dans PL/SQL
3.1. Les différents types de variables locales
Syntaxe :
nom_var TYPE_ORACLE;
Exemple :
DECLARE
nom CHAR(20);
prenom CHAR(15);
age NUMBER(3);
BEGIN
...
END;
10
3.1.2. Variables de type BOOLEEN
Syntaxe :
nom_var BOOLEAN;
Exemple :
DECLARE
retour BOOLEAN;
BEGIN
...
END;
11
3.1.3. Variables faisant référence au dictionnaire de données
Syntaxe :
nom_var [Link]%TYPE;
Exemple :
DECLARE
nom [Link]%TYPE;
BEGIN
...
END;
12
3.1.3. Variables faisant référence au dictionnaire de données (suite ...)
Syntaxe :
nom_var table%ROWTYPE;
Exemple :
DECLARE
ligne pilote%ROWTYPE;
BEGIN
...
END;
Remarque :
La structure ligne contient autant de variables que de colonnes de la table. Ces variables
portent le même nom et sont de même type que les colonnes de la table.
Pour y accéder :
13
ligne.<nom_col1>
ligne.<nom_col2>
...
ligne.<nom_coln>
14
3.1.3. Variables faisant référence au dictionnaire de données (suite ...)
Syntaxe :
nom_var2 nom_var1%TYPE;
Exemple :
DECLARE
ancien_sal NUMBER(5);
nouveau_sal ancien_sal%TYPE;--NUMBER(5);
BEGIN
...
END;
15
Type de
données
PL/SQL
17
18
20
3.1.4. Initialisation des variables
Avec :
opérateur :=
ou
SELECT ... INTO ...
Exemple :
DECLARE
var1CHAR(10) := 'DUPONT';
var2 NUMBER(5,2) := 100;
var3 CHAR(10);
var4DATE;
BEGIN
SELECT col1, col2
INTO var3, var4
FROM ... ;
..
END.;
Remarque : le SELECT doit ramener une et une seule ligne, sinon erreur. 16
3.1.5. Visibilité des variables
Une variable est visible dans le bloc où elle a été déclarée et dans les blocs imbriqués si elle n'a
pas été redéfinie.
DECLARE
var1NUMBER(3);
var2CHAR(10);
BEGIN
... var1 NUMBER(3)
... var2CHAR(10)
DECLARE
var1CHAR(10);
var3DATE;
BEGIN
... var1CHAR(10)
... var2
... var3
END;
...
DECLARE
17
var4NUMBER(5,2);
BEGIN
... var1 NUMBER(3)
... var2
... var4
END;
... var1 NUMBER(3)
... var2CHAR(10)
END;
Outre les variables locales vues précédemment, un bloc PL/SQL peut utiliser d'autres
variables :
18
- les variables définies en langage hôte (préfixée de :)
19
Chapitre 4 : Les Traitements
CHAPITRE 4 : Les traitements
4.1. IF : traitement conditionnel
Exécution d'un traitement en fonction d'une condition.
END IF;
Les opérateurs utilisés dans les conditions sont les mêmes que dans SQL :
21
Dès que l'une des conditions est vraie, le traitement qui suit le THEN est exécuté.
Si aucune condition n'est vraie, c'est le traitement qui suit le ELSE qui est exécuté.
22
4.2. Boucle de base LOOP : traitement répétitif
Exécution d'un traitement plusieurs fois, le nombre n'étant pas connu mais dépendant d'une
condition.
BEGIN
LOOP [label]
instructions;
END LOOP [label];
END;
23
VALUES (nb);
nb := nb + 1;
EXIT WHEN nb > 10;
END LOOP;
END ;
BEGIN
FOR indice IN [REVERSE] exp1 ... exp2
LOOP
instructions;
END LOOP;
END;
Remarques :
- inutile de déclarer indice 24
- indice varie de exp1 à exp2 de 1 en 1
- si REVERSE est précisé, indice varie de exp2 à exp1 avec un pas de -1.
25
BEGIN
WHILE condition
LOOP
instructions;
END LOOP;
END;
Exemple : reste de la division de 5432 par 5
DECLARE
reste NUMBER := 5432;
BEGIN
WHILE reste >= 5
LOOP
reste := reste -5;
END LOOP;
END;
26
Chapitre 5 : Les curseurs en
PL/SQL
CHAPITRE 5 : Les curseurs en PL/SQL
5.1. Définitions
- CURSEUR IMPLICITE :
curseur SQL généré et géré par le noyau pour chaque ordre SQL d'un bloc.
- CURSEUR EXPLICITE :
curseur SQL généré et géré par l'utilisateur pour traiter un ordre SELECT qui ramène plus
d'une ligne.
28
5.2. Curseur explicite
4 étapes :
- déclaration du curseur
- ouverture du curseur
- fermeture du curseur
29
5.2. Curseur explicite (suite ...)
Déclaration du curseur
Syntaxe :
DECLARE
CURSOR pl_niceIS
SELECT pl#, plnom , pilote
FROM WHERE adr='Nice';
BEGIN
... 30
END ;
5.2. Curseur explicite (suite ...)
Ouverture du curseur
Syntaxe :
OPEN nom_curseur ;
Exemple :
DECLARE
CURSOR pl_nice IS
SELECT pl#, plnom
32
FROM pilote
WHERE adr='Nice';
BEGIN
...
OPENpl_nice;
...
END ;
33
5.2. Curseur explicite (suite ...)
Après l'exécution du SELECT les lignes ramenées sont traitées une par une, la valeur de
chaque colonne du SELECT doit être stockée dans une variable réceptrice.
Syntaxe :
FETCH nom_curseur INTO liste_variables ;
Exemple :
DECLARE
CURSOR pl_nice IS
SELECT pl#, plnom, sal
FROM pilote
WHERE adr='Nice';
num [Link]#%TYPE;
nom [Link]%TYPE;
salaire [Link]%TYPE;
BEGIN
OPEN pl_nice;
34
LOOP
FETCH pl_nice INTO num, nom,salaire;
...
EXIT WHEN sal > 10000;
END LOOP;
END ;
35
Fermeture du curseur
Pour libérer la mémoire prise par le curseur, il faut le fermer dès qu'on n'en a plus besoin.
Syntaxe :
CLOSE nom_curseur ;
Exemple :
DECLARE
CURSOR pl_nice IS
SELECT pl#, plnom, sal
FROM pilote
WHERE adr='Nice';
num [Link]#%TYPE;
nom [Link]%TYPE;
salaire [Link]%TYPE;
BEGIN
OPEN pl_nice;
LOOP
FETCH pl_nice INTO num, nom,salaire;
...
EXIT WHEN sal > 10 000;
END LOOP;
CLOSE pl_nice;
END ;
21/02/2024 36
EXEMPLE: TYPE CURSOR
SET SERVEROUTPUT ON;
DECLARE
CURSOR CURSEUR1 IS SELECT * FROM etudiants;
ligne CURSEUR1%rowtype;
BEGIN
OPEN CURSEUR1;
LOOP
FETCH CURSEUR1 INTO ligne;
DBMS_OUTPUT.PUT_LINE('le nom est '|| [Link] || 'le
prenom est '||
[Link]);
EXIT WHEN curseur1%NOTFOUND;
END LOOP;
CLOSE CURSEUR1;
END; 21/02/2024 37
5.3. Les attributs d'un curseur
%FOUND
dernière ligne traitée
%NOTFOUND
21/02/2024 38
5.3. Les attributs d'un curseur
Pour tout curseur (implice ou explicite) il existe des indicateurs sur leur état.
%FOUND
Pour tout curseur (implice ou explicite) il existe des indicateurs sur leur état.
%ROWCOUNT
40
5.3.1. %FOUND
TRUE
TRUE
21/02/2024 41
5.3.1. %FOUND (suite ...)
Exemple :
DECLARE
CURSOR pl_nice IS
SELECT pl#, plnom, sal
FROM pilote
WHERE adr='Nice';
num [Link]#%TYPE;
nom [Link]%TYPE;
salaire [Link]%TYPE;
BEGIN
OPEN pl_nice;
FETCH pl_nice INTO num, nom,salaire;
WHILE pl_nice%FOUND
LOOP
...
FETCH pl_nice INTO num,
nom,salaire;
END LOOP;
CLOSE pl_nice;
END ;
21/02/2024 42
5.3.2. %NOTFOUND
TRUE
21/02/2024 43
5.3.3. %ISOPEN
Exemple 1 :
DECLARE
CURSOR pl_nice IS
SELECT pl#, plnom, sal
FROM pilote
WHERE adr='Nice';
num [Link]#%TYPE;
nom [Link]%TYPE;
salaire [Link]%TYPE;
BEGIN
IF NOT(pl_nice%ISOPEN)
THEN
OPEN pl_nice;
END IF;
...
END ;
21/02/2024 44
5.3.3. %ISOPEN
Exemple 2 :
IF emp_curseur%isopen THEN
FETCH ...
ELSE
OPEN emp_curseur
END IF
21/02/2024 45
5.3.4. %ROWCOUNT
21/02/2024 46
5.4. Simplification d'écriture
Au lieu de déclarer autant de variables que d'attributs ramenés par le SELECT du curseur, on peut utiliser une
structure.
Syntaxe :
DECLARE
CURSOR nom_curseur IS ordre_select;
nom_structure nom_curseur%ROWTYPE;
21/02/2024 47
5.4. Simplification d'écriture
Au lieu de déclarer autant de variables que d'attributs ramenés par le SELECT du curseur, on peut utiliser une
structure.
Syntaxe :
DECLARE
CURSOR nom_curseur IS ordre_select;
nom_structure nom_curseur%ROWTYPE;
21/02/2024 48
5.4.2. Traitement du curseur
Au lieu d'écrire :
DECLARE
CURSOR nom_curseur IS SELECT ... ;
nom_struct nom_curseur%ROWTYPE;
BEGIN
OPEN nom_curseur;
LOOP
FETCH nom_curseur INTO nom_struct;
EXIT WHEN nom_curseur%NOTFOUND;
...
END LOOP;
CLOSE nom_curseur;
END;
il suffit d'écrire :
DECLARE
CURSOR nom_curseur IS SELECT ... ;
BEGIN
FOR nom_struct IN nom_curseur LOOP
...
END LOOP;
END;
21/02/2024 49
5.4.2. Traitement du curseur (suite ...)
ou encore :
LOOP
...
END LOOP;
21/02/2024 50
Chapitre 6 : La Gestion des
exceptions en PL/SQL
I) Gestion des Erreurs (EXCEPTION)
1. - Exception
• Une exception est une erreur qui survient durant une exécution
• 2 types d’exception :
– Interne
– Une erreur interne est produite quand un bloc PL/Sql viole une règle d'Oracle ou dépasse une limite dépendant du système
d'exploitation.
• Les exceptions externes sont générées par l’utilisateur (stock à zéro, ...).
I.2 - Intercepter les Exceptions - Syntaxe
EXCEPTION
WHEN exception1 [OR exception2 . . .] THEN
statement1; statement2;
...
[WHEN exception3 [OR exception4 . . .] THEN
statement1; statement2;
. . .]
[WHEN OTHERS THEN
statement1; statement2;
. . .]
– Utilisez le gestionnaire d’erreurs OTHERS et placez le en dernier lieu après tous les autres
gestionnaire d’erreurs, sinon il interceptera toutes les exceptions mêmes celle qui sont prédéfinies.
• Les noms des exceptions pré-définies oracle sont regroupées dans ce tableau :
• CURSOR_ALREADY_OPEN : tentative d’ouverture d’un curseur déjà ouvert..
• DUP_VAL_ON_INDEX: insertion d’une ligne en doublon
• INVALID_CURSOR : opération incorrecte sur un curseur, comme par exemple la fermeture d’un curseur qui n’a pas été ouvert.
• LOGIN_DENIED : connexion à la base échouée car le nom utilisateur ou le mot de passe est invalide.
• NO_DATA_FOUND : déclenché si la commande SELECT INTO ne retourne aucune ligne ou si on fait référence à un enregistrement non
initialise d’un tableau PL/SQL.
• TIMEOUT_ON_RESOURCE : dépassement du temps dans l’attente de libération des ressources (lié aux paramètres de la base).
• TOO_MANY_ROWS : la commande SELECT INTO retourne plus d’une ligne.
DECLARE
v_sal [Link]%type;
BEGIN
SELECT sal INTO v_sal from emp;
EXCEPTION
WHEN TOO_MANY_ROWS then ... ;
-- gérer erreur trop de lignes WHEN
NO_DATA_FOUND then ... ;
-- gérer erreur pas de ligne
WHEN OTHERS then ... ;
-- gérer toutes les autres erreurs
END ;
Vous pouvez intercepter une erreur oracle non pré-définie en la déclarant au préalable, ou en utilisant
la commande OTHERS, L’exception
déclarée et implicitement déclenchée
Exemple :Capturer l’erreur du Serveur Oracle numéro -2292 correspondant à la violation d’une contrainte d’intégrité.
DECLARE
e_emps EXCEPTION;
PRAGMA EXCEPTION_INIT (e_emps, -2292);
v_deptno [Link]%type:=&p_deptno;
BEGIN
Delete from dept
Where deptno=v_deptno;
Commit;
EXCEPTION
WHEN e_emps THEN
dbms_output.put_line(‘Suppression impossible du dept : ‘ || to_char(v_deptno) || ‘employés existant ‘);
END;
I.5 - Exceptions Utilisateur (externes)
Nom_ano Exception;
EXCEPTION
WHEN (Nom_ano) then (traitement); DECLARE
...
Nom_ano EXCEPTION;
BEGIN
instructions ;
IF (condition_anomalie) THEN RAISE Nom_ano;
...
EXCEPTION
WHEN Nom_ano THEN (traitement);
END ;
On sort du bloc après l'exécution du traitement d'erreur.
Exemple :
DECLARE
Erreur_comm exception ;
v_pilot pilote%rowtype ;
BEGIN
Select * into v_pilot From PiloteWhere nopilot =‘7100’ ;
If v_pilot.comm > [Link] Then
Raise erreur_comm ;
END IF.
...... EXECPTION
When erreur_comm then
Insert into erreur values(v_pilot.nom, ‘ Commission> salaire’) ;
When NO_DATA_FOUND Then
Insert into erreur values(v_pilot.nopilot, ‘ non trouvé’) ;
END ;
I.6 - Fonctions d’interception des erreurs
• SQLCODE
• SQLERRM
Lorsqu’une exception est intercetée par la clause WHEN OTHERS, vous pouvez utiliser un ensemble de fonctions standard pour identifier l’erreur.
DECLARE
v_error_code NUMBER;
v_error_message VARCHAR2(255);
BEGIN
EXCEPTION
...
WHEN OTHERS THEN
ROLLBACK;
v_error_code := SQLCODE;
v_error_message := SQLERRM;
insert into erreur values(v_error_code, v_error_message);
END;
Chapitre 7 : Modularité
(Procédure, Fonction et Package)
PROCEDURES, FONCTIONS ET PACKAGES
1. - Généralité
• Mettre en œuvre une architecture client/serveur de procédures et rendre indépendant le code client de celui des procédures (à
l’API près)
• Masquer la complexité du code SQL (simple appel de procédure avec passage d’arguments)
• Sécuriser l’accès aux données (accès à certaines tables seulement à travers les procédures)
• Optimiser le code (les procédures sont compilées avant l’exécution du programme et elles sont exécutées immédiatement si elles
se trouvent dans la SGA (zone mémoire gérée par ORACLE). De plus une procédure peut être exécutée par plusieurs utilisateurs.
• de regrouper des procédures ou des fonctions (ou les deux). On évite ainsi d’avoir autant de sources que de procédures.
• De travailler en équipes et l’architecture applicative peuvent donc plus facilement s’organiser du côté serveur, où les packages
regrouperont des procédures à forte cohésion intra (Sélection de tous les articles, Sélection d’un article, Mise à jour d’un article,
Suppression d’un article, Ajout d’un article).
• Les packages sont utilisés comme de simples librairies par les programmes clients (librairies distantes « sur le serveur »)
• Les équipes de développement doivent prendre garde à ne pas travailler chacune dans « leur coin »
• Les développeurs ne doivent pas perdre de vue la logique globale de l’application et les scénarios
d’activité des opérateurs de saisie.
• A l’extrême, on peut finir par coder une procédure extrêmement sophistiquée qui n’est
sollicitée qu’une fois par an pendant une seconde. Ou encore, une gestion complexe de
verrous pour des accès concurrent qui n’ont quasiment jamais lieu.
• .
2- Procédures
EXCEPTION BEGIN
Procédure Exemple
Il faut compiler le fichier sql qui s’appelle ici modifie_salaire.sql (attention dans cet exemple le nom du script correspond à celui de la procédure,
c’est bien le nom du script sql qu’il faut passer en argument à la commande start).
SQL>start modifie_salaire
Procedure created.
Appel de la procédure modifie_salaire
begin
modifie_salaire (15,-0.5);
end;
/
• L’utilisation d’un script qui contient les 4 lignes précédentes est bien sûr également possible : [Link]
begin
modifie_salaire (15,-0.5); end;
/
• Lancement du script [Link] :
• Une fonction est une procédure qui retourne une valeur. La seule différence syntaxique par rapport à une procédure se traduit par la
présence du mot clé RETURN.
• Une fonction précise le type de donnée qu’elle retourne dans son prototype (signature de la fonction).
Ex c e pt i o n
END [<nom_proc>];
/
Fonction -Exemple
EN D
;
/
CREATE OR REPLACE PACKAGE nom_package IS définitions des types utilisés dans le package;
prototypes de toutes les procédures et fonctions du package;
END nom_package;
/
• Le premier END marque la fin de l’en tête du package. Cette partie doit se terminer par / pour que l’en tête soit compilé.
• Le corps (body) du package consiste à implémenter (définir) l’ensemble des procédures ou fonctions qui le constitue. Chaque procédure
est définie normalement avec ses clauses BEGIN ... END.
end ges_emp;
/
Compilation du package paquet1
SQL> begin
2 ges_emp.augmente_salaire(4,50);
3 end;
4/
PL/SQL procedure successfully completed.
• Exécution de la procédure augmente_salaire du package ges_emp SQL> begin
2 ges_emp.augmente_salaire(4,50);
3 end;
4/
PL/SQL procedure successfully completed.
Chapitre 8 : Triggers
Déclencheurs (TRIGGERs)
1. - Définition
Les triggers sont des simples procédures stockées qui s’exécutent implicitement lorsqu’une instruction INSERT, DELETE ou UPDATE porte sur la
table (ou dans certains, cas sur la Vue associée).
2. - Syntaxe
3. - Types de déclencheurs
1. peut être le nom d'un autre objet (table, vue, procédure) mais à éviter.
4- Option BEFOR/AFTER
Déclencheurs
• S'il n'y a pas de liste, le trigger est déclenché pour toute instruction UPDATE portant sur la table.
Les triggers lignes
• Pour les triggers lignes, on peut introduire une restriction sur les lignes à l'aide d'une expression logique SQL : c'est la clause WHEN :
– Cette expression est évaluée pour chaque ligne affectée par le trigger.
– Le trigger n'est déclenché sur une ligne que si l'expression WHEN est vérifiée pour cette ligne.
– Il est exécuté si l'instruction de déclenchement se produit et si la clause de restriction WHEN, le cas échéant, est évaluée à vrai.
END ;
;
Exemple2 de trigger table
CREATE OR REPLACETRIGGER PERSON_UPDATE_SALAIREBEFORE UPDATE
ON Employe
BEGIN
UPDATE Employe
SET sal=sal+(sal*0.1);
employé
2 rows updated.
III.6 - Les noms de corrélation (OLD/New)
• Lors de la création de triggers lignes, il est possible d’avoir accès à la valeur ancienne et la valeur nouvelle grâce aux mots clés OLD et
NEW.
– Il n’est pas possible d’avoir accès à ces valeurs dans les triggers de table.
Quand un trigger comporte plusieurs instructions de déclenchement (par exemple INSERT OR DELETE OR UPDATE),
on peut utiliser des prédicats conditionnels (INSERTING, DELETING et UPDATING) pour exécuter des blocs de code
Exemple :
......
IF INSERTING THEN ........END IF;
IF UPDATING THEN .........END IF;
...... END;
Developpement sous Oracle : Oracle SQL, PL/SQL & Oracle Forms Année Académique : 2023-2024 88
Création de triggers de ligne à l'aide de Procédure Builder
Developpement sous Oracle : Oracle SQL, PL/SQL & Oracle Forms Année Académique : 2023-2024 89
Utilisation des qualificatifs OLD et NEW
Developpement sous Oracle : Oracle SQL, PL/SQL & Oracle Forms Année Académique : 2023-2024 90
Restriction d'un trigger de ligne
SQL>CREATE OR REPLACE TRIGGER derive_commission_pct
2 BEFORE INSERT OR UPDATE OF sal ON emp
3 FOR EACH ROW
4 WHEN ([Link] = 'SALESMAN')
5 BEGIN
6 IF INSERTING
7 THEN :[Link] := 0;
8 ELSIF :[Link] IS NULL
9 THEN :[Link] := 0;
10 ELSE :[Link] := :[Link] * (:[Link]/:[Link]);
11 END IF;
12END;
13 /
Developpement sous Oracle : Oracle SQL, PL/SQL & Oracle Forms Année Académique : 2023-2024 91
Démonstration : triggers
CREATE OR REPLACE TRIGGER audit_emp_trig
AFTER UPDATE or INSERT or DELETE on EMP
FOR EACH ROW
BEGIN
IF DELETING THEN var_pack.set_g_del(1);
ELSIF INSERTING THEN var_pack.set_g_ins(1);
ELSIF UPDATING ('SAL')
THEN var_pack.set_g_up_sal(1);
ELSE var_pack.set_g_upd(1);
END IF;
END audit_emp_trig;
Developpement sous Oracle : Oracle SQL, PL/SQL & Oracle Forms Année Académique : 2023-2024 92
Tableau comparatif
Triggers / Procédures stockées
Triggers Procédure
Developpement sous Oracle : Oracle SQL, PL/SQL & Oracle Forms Année Académique : 2023-2024 93
Gestion des triggers
Désactivation ou réactivation d'un trigger de
base de données :
ALTER TRIGGER trigger_name DISABLE | ENABLE;
Developpement sous Oracle : Oracle SQL, PL/SQL & Oracle Forms Année Académique : 2023-2024 94
Syntaxe DROP TRIGGER
Exemple
SQL> DROP TRIGGER secure_emp;
Trigger dropped
Developpement sous Oracle : Oracle SQL, PL/SQL & Oracle Forms Année Académique : 2023-2024 95
Chapitre 9 : Concepts avancés
sur les curseurs explicites
Objectifs
A la fin de ce chapitre,vous pourrez:
7-
Curseurs paramétrés
Syntaxe:
CURSOR cursor_name
[(parameter_name datatype, ...)]
IS
select_statement;
7-
98
Curseurs paramétrés
Transmettre le numero du service et l’intitulé du
poste à la clause WHERE, dans l’instruction SELECT
du curseur
DECLARE
CURSOR emp_cursor
(p_deptno NUMBER, p_job VARCHAR2) IS
SELECT employee_id, last_name
FROM employees
WHERE department_id = p_deptno
AND job_id = p_job;
BEGIN
OPEN emp_cursor (80, 'SA_REP');
. . .
CLOSE emp_cursor;
OPEN emp_cursor (60, 'IT_PROG');
. . .
END;
7-
99
Clause FOR UPDATE
Syntaxe:
SELECT ...
FROM ...
FOR UPDATE [OF column_reference][NOWAIT];
7-
Clause FOR UPDATE
7-
Clause WHERE CURRENT OF
Syntaxe:
WHERE CURRENT OF cursor ;
7-
102
Clause WHERE CURRENT OF
DECLARE
CURSOR sal_cursor IS
SELECT e.department_id, employee_id, last_name, salary
FROM employees e, departments d
WHERE d.department_id = e.department_id
and d.department_id = 60
FOR UPDATE OF salary NOWAIT;
BEGIN
FOR emp_record IN sal_cursor
LOOP
IF emp_record.salary < 5000 THEN
UPDATE employees
SET salary = emp_record.salary * 1.10
WHERE CURRENT OF sal_cursor;
END IF;
END LOOP;
END;
/
7-
103
Curseurs contenant des sous-
interrogations
Example:
DECLARE
CURSOR my_cursor IS
SELECT t1.department_id,
t1.department_name, [Link]
FROM departments t1,
(SELECT department_id,COUNT(*) AS STAFF
FROM employees GROUP BY department_id) t2
7-
104
Synthèse
7-
ORACLE PL/SQL
Questions
21/02/2024 147