Académique Documents
Professionnel Documents
Culture Documents
PL/SQL
REGLES
Traitements séquentiels.
Gestion desexceptions.
Avantages de PL/SQL
Intégration
Amélioration des performances
Portabilité
Développement modulaire
DÉVELOPPER UN BLOC
SIMPLE PL/SQL PL
Structure d'un Block PL/SQL
[ DECLARE ]
- Variables, constantes, curseurs,
exceptions utilisateurs
BEGIN
- Ordres SQL
- Instructions de Contrôle PL/SQL [
EXCEPTION ]
- Traitements à effectuer lors d'erreurs
END ;
STRUCRURED’UN
BLOCPL/SQL
BLOC PL/SQL
• Lescommentairessont possibles/ * * / .
Identifiants :
🞑 Peuvent contenir jusqu'à 30 caractères.
🞑 Ne peuvent pas contenir de mots réservés à moins qu'ils
ou d'une colonne.
Règles Syntaxiques d'un Bloc PL/SQL
DECLARE
table_based_record table_name%ROWTYPE;
DECLARE
r_emp employees%ROWTYPE;
n_emp_id employees.employee_id%TYPE := 200;
BEGIN
SELECT *
INTO r_emp
FROM employees
WHERE employee_id = n_emp_id;
-- print out the employee's first name
DBMS_OUTPUT.PUT_LINE(r_emp.first_name);
END;
/
Les variables - Record
IF statement:
IF condition THEN
sequence_of_statements;
END IF;
IF-THEN-ELSE statement:
IF condition THEN
sequence_of_statements;
ELSE
sequence_of_else_statements;
END IF;
Les structures de contrôle
IF-THEN-ELSIF Statement
IF condition1 THEN
sequence_of_statements1
ELSIF condition2 THEN
sequence_of_statements2
ELSE
sequence_of_statements3
END IF;
Exemple
216
Les structures de contrôle
CASE Statement
CASE [TRUE | selector]
WHEN expression1 THEN
sequence_of_statements1;
WHEN expression2 THEN
sequence_of_statements2;
...
WHEN expressionN THEN
sequence_of_statementsN;
[ELSE sequence_of_statementsN+1;]
END CASE [label_name];
NB :PL / SQL ajoutera la clause ELSE implicite suivante: ELSE RAISE CASE_NOT_FOUND;
Les structures de contrôle
LOOP Statement
LOOP
sequence_of_statements;
END LOOP;
Il doit y avoir au moins une instruction exécutable entre les mots clés LOOP et
END LOOP. La séquence d'instructions est exécutée à plusieurs reprises jusqu'à
atteindre une sortie de boucle. PL / SQL fournit des instructions EXIT et EXIT-
WHEN pour vous permettre de terminer une boucle.
Les structures de contrôle
LOOP Statement
Une boucle peut avoir une étiquette facultative qui est un identifiant non
déclaré entouré par des crochets doubles «étiquette». L'étiquette de la boucle
apparaît au début et à la fin de l'instruction PL / SQL LOOP. Une étiquette de
boucle est utilisée pour qualifier le nom de la variable de compteur de boucle
lorsqu'une boucle est imbriquée dans une autre boucle.
<<label>>
LOOP
sequence_of_statements;
END LOOP label;
Les structures de contrôle
223
Exercice:
SET SERVEROUTPUT ON -- sous SQL pLUS
DECLARE i NUMBER:= 4;
BEGIN
LOOP
IF (MOD(i,3)=0) THEN
DBMS_OUTPUT.PUT_LINE (i || ‘ est un multiple de 3’);
END IF;
IF (MOD(i,4)=0) THEN
DBMS_OUTPUT.PUT_LINE (i || ‘ est un multiple de 4’);
END IF;
IF (MOD(i,5)=0) THEN
DBMS_OUTPUT.PUT_LINE (i || ‘ est un multiple de 5’);
END IF;
i := i+1;
EXIT WHEN i>32;
END LOOP; 224
END;
Les structures de contrôle
PL
Exceptions
Oracle
Exception SQLCODE Description
Error
Il est déclenché lorsqu'une instruction SELECT INTO ne
NO_DATA_FOUND 01403 +100
renvoie aucune ligne.
Non
Oui
DECLARE OPEN FETCH VIDE ? CLOSE
Exemple :
DECLARE
CURSOR c1 IS
SELECT employee_id, last_name
FROM employees;
CURSOR c2 IS
SELECT *
FROM departments
WHERE department_id = 10;
BEGIN
...
Il est important de noter que le nom du curseur n’est pas une variable. Par conséquent, vous ne pouvez pas l’utiliser
comme variable, telle que l’affecter à un autre curseur ou l’utiliser dans une expression.
Ouvrir le curseur
Syntaxe :
OPEN cursor_name;
DECLARE
v_empid employees.employee_id%TYPE;
... v_ename employees.last_name%TYPE;
OPEN i NUMBER := 1;
defined_cursor;
LOOP CURSOR c1 IS
FETCHSELECT employee_id,
defined_cursor INTOlast_name
defined_variables
EXIT FROM employees;
WHEN ...;
BEGIN
...
OPEN
-- c1; the retrieved data
Process
...FOR i IN 1..10 LOOP
END; FETCH c1 INTO v_empid, v_ename;
...
END LOOP;
END ;
Fermer le curseur
Syntaxe :
CLOSE cursor_name;
DECLARE
CURSOR c1 IS
SELECT employee_id, last_name
FROM employees;
BEGIN
FOR emp_record IN c1 LOOP
Syntaxe :
BEGIN SELECT ... COMMIT;
EXCEPTION
WHEN NO_DATA_FOUND THEN
statement1;
statement2;
WHEN TOO_MANY_ROWS THEN
statement1;
WHEN OTHERS THEN
statement1;
statement2;
statement3;
END;
Erreur non prédéfinie
Intercepter une violation de contrainte d'intégrité
(code d'erreur du serveur Oracle -2292)
DECLARE
e_products_invalid EXCEPTION; 1 1
PRAGMA EXCEPTION_INIT (
e_products_invalid, -2292); 2 2
v_message VARCHAR2(50);
BEGIN
. . . 3
EXCEPTION
WHEN e_products_invalid THEN
:v_message := 'Product ID specified is not valid.';
. . .
END;
Exception définie par l'utilisateur
Pour intercepter une exception définie par l'utilisateur, vous devez la déclarer et la
déclencher explicitement.
DECLARE
nom_erreur EXCEPTION; 1
. . .
BEGIN
. . .IF (Problème) THEN
RAISE nom_erreur; 2
. . .
EXCEPTION
WHEN nom_erreur THEN 3
(traitement de l’erreur);
. . .
END;
RAISE_APPLICATION_ERROR
Syntaxe :
raise_application_error (error_number,
message[, {TRUE | FALSE}]);
PL
Définition d'une procédure
(DECLARE)
RQ : DATATYPE ne peut être que la
définition %TYPE ou %ROWTYPE, ou un BEGIN
type de données explicite sans
EXCEPTION
spécification de taille.
END;
Créer des procédures avec des paramètres
IN OUT IN OUT
Mode par défaut Doit être indiqué Doit être indiqué
La valeur est transmise au Est renvoyé à Est transmis à un sous-
sous-programme l'environnement programme ; est renvoyé à
appelant l'environnement appelant
176 p_id
Par défaut, le paramètre IN est transmis par référence et les paramètres OUT et IN OUT sont transmis
par valeur.
Exemples de paramètres OUT
171 p_id
SMITH p_name
7400 p_salary
0.15 p_comm
Exemples de paramètres OUT
emp_query.sql
CREATE OR REPLACE PROCEDURE query_emp
(p_id IN employees.employee_id%TYPE,
p_name OUT employees.last_name%TYPE,
p_salary OUT employees.salary%TYPE,
p_comm OUT employees.commission_pct%TYPE)
IS
BEGIN
SELECT last_name, salary, commission_pct
INTO p_name, p_salary, p_comm
FROM employees
WHERE employee_id = p_id;
END query_emp;
Visualiser des paramètres OUT
PRINT g_name
RQ :
--N'indiquez pas de taille pour une variable hôte de type NUMBER.
--La longueur par défaut d'une variable de type CHAR ou VARCHAR2 est de 1, si
aucune valeur n'est indiquée entre parenthèses.
Paramètres IN OUT
PRINT g_phone_no
EXECUTE format_phone (:g_phone_no)
PRINT g_phone_no
Méthodes de transmission des paramètres
BEGIN
add_dept; ----????
add_dept ('TRAINING', 2500);
add_dept ( p_loc => 2400, p_name =>'EDUCATION');
add_dept ( p_loc => 1200) ;
END;
…
Déclarer des sous-programmes
leave_emp2.sql
DECLARE
v_id NUMBER := 163;
BEGIN
raise_salary(v_id); --invoke procedure
COMMIT;
...
END;
Appeler une procédure depuis une
autre procédure
Procédure appelée
Procédure appelante PROCEDURE
PROC2 ...
PROCEDURE IS
PROC1 ... ...
IS BEGIN
... ... Exception déclenchée
BEGIN EXCEPTION
... ... Exception traitée
PROC2(arg1); END PROC2;
...
EXCEPTION La procédure
...
END PROC1; appelante reprend
le contrôle
Exceptions non traitées
Procédure appelée
Procédure appelante
PROCEDURE
PROCEDURE PROC2 ...
PROC1 ... IS
IS ...
... BEGIN
BEGIN ... Exception déclenchée
... EXCEPTION
... Exception non traitée
PROC2(arg1); END PROC2;
...
EXCEPTION
...
END PROC1; La section de traitement
des exceptions de la
procédure appelante a
repris le contrôle
Supprimer des procédures
Supprimer une procédure stockée dans la
base de données.
Syntaxe:
DROP PROCEDURE procedure_name
Exemple:
DROP PROCEDURE raise_salary;
Présentation des fonctions stockées
RETURN v_salary
4 PRINT g_salary
Exemple d'appel de fonctions dans des expressions SQL
get_salary.sql
CREATE OR REPLACE FUNCTION get_sal
(p_id IN employees.employee_id%TYPE)
RETURN NUMBER
IS
v_salary employees.salary%TYPE :=0;
BEGIN
SELECT salary
INTO v_salary
FROM employees
WHERE employee_id = p_id;
RETURN v_salary;
END get_sal;
Supprimer des fonctions
Supprimer une fonction stockée.
Syntaxe :
DROP FUNCTION function_name
Exemple:
DROP FUNCTION get_sal;
Procédure Fonction
Paramètre IN Paramètre IN
Environnement Environnement
Paramètre OUT
appelant appelant
Paramètre IN OUT
(DECLARE) (DECLARE)
BEGIN BEGIN
EXCEPTION EXCEPTION
END; END;
Comparer les procédures et les fonctions
Procédures Fonctions
S'exécutent en tant Sont appelées dans une
qu'instruction PL/SQL expression
Ne contiennent pas de Doivent contenir une clause
clause RETURN dans l'en-tête RETURN dans l'en-tête
Peuvent transférer zéro, une Doivent renvoyer une seule
ou plusieurs valeurs valeur
Peuvent contenir une Doivent contenir au moins
instruction RETURN une instruction RETURN
Avantages liés aux procédures et aux
fonctions stockées
Performances améliorées
Facilité de maintenance
Sécurité et intégrité accrues des données
Clarté améliorée du code
Triggers PL/SQL
PL
Types de déclencheur
Un déclencheur :
est une procédure ou un bloc PL/SQL associé à la base de
données, à une table, à une vue ou à un schéma
s'exécute de façon implicite lorsqu'un événement donné se
produit
il peut s'agir d'un :
déclencheur applicatif, qui s'exécute lorsqu'un événement se produit dans une
application donnée
déclencheur de base de données, qui s'exécute lorsqu'un événement de type
données (LMD) ou système (connexion ou arrêt) se produit dans un schéma ou
une base de données
Règles relatives à la conception de
déclencheurs
• Il est conseillé de concevoir des déclencheurs pour :
exécuter des actions associées
centraliser des opérations globales
• Si le code PL/SQL est très long, créer des procédures stockées et les
appeler dans un déclencheur
Application
…
Créer des déclencheurs LMD
RQ
Les déclencheurs sur ligne utilisent des noms de corrélation pour accéder aux
anciennes ou nouvelles valeurs de colonne de la ligne en cours de traitement.
La taille d'un déclencheur est limitée à 32 Ko.
Séquence d'exécution
Action de déclenchement
Déclencheur sur
instruction BEFORE
…
Déclencheur sur ligne BEFORE
Déclencheur sur ligne AFTER
Déclencheur sur instruction
AFTER
Séquence d'exécution
Syntaxe :
Exemple :
CREATE OR REPLACE TRIGGER secure_emp
BEFORE INSERT ON employees
BEGIN
IF (TO_CHAR(SYSDATE,'DY') IN ('SAT','SUN')) OR
(TO_CHAR(SYSDATE,'HH24:MI')
NOT BETWEEN '08:00' AND '18:00')
THEN RAISE_APPLICATION_ERROR (-20500,'You may
insert into EMPLOYEES table only
during business hours.');
END IF;
END;
/
UPDATE employees
SET salary = 15500
WHERE last_name = 'Russell';
Utiliser les qualificatifs OLD et NEW
UPDATE employees
SET salary = 5000, last_name = 'Smith'
WHERE employee_id = 999;
Application
INSERT
TABLE1
Déclencheur
INSTEAD OF
UPDATE
MY_VIEW TABLE2
Créer un déclencheur INSTEAD OF
Syntaxe :
CREATE [OR REPLACE] TRIGGER trigger_name
INSTEAD OF
event1 [OR event2 OR event3]
ON view_name
[REFERENCING OLD AS old | NEW AS new]
[FOR EACH ROW]
trigger_body
RQ : Les déclencheurs INSTEAD OF ne peuvent être écrits que pour des vues. Les options
BEFORE et AFTER ne sont pas valides.
Créer un déclencheur INSTEAD OF Exemple
END;
Créer un déclencheur INSTEAD OF
…
…
Différences entre les déclencheurs de base de données et les
procédures stockées
Déclencheurs Procédures
BEFORE
…
INSERT
ligne
Gérer les déclencheurs