Académique Documents
Professionnel Documents
Culture Documents
Lotfi NAJDI
Année Universitaire 2020 / 2021
Licence Professionnelle Génie Informatique
Faculté Polydisciplinaire de Taroudant
Introduction au langage PL/SQL
langage PL/SQL
PL/SQL signifie "Procedural Language extension to SQL" (extension procédurale du langage SQL)
PL/SQL est le langage standard d'accès aux données d'Oracle Corporation pour les bases de
données relationnelles
PL/SQL offre une structure de bloc pour les unités de code exécutables.
• Curseurs
Contrôle amélioré des instructions SQL et leur exécution à l’aide des structures de contrôle.
• Réduction des échanges client et serveur (PL/SQL est exécuté sur le serveur)
• Possibilité de combiner plusieurs SQL dans un même programme (envoyer une bloc entier au
serveur au lieu d'envoyer les instructions SQL une par une)
SQL
IF...THEN
SQL
ELSE
SQL
END IF;
SQL
Blocs PL/SQL
• Procédures et fonctions
• Packages
• triggers
Blocs anonymes
Un bloc PL/SQL anonymes :
• En cas de besoin de réutilisation, on doit ré-exécuter le script qui crée le bloc anonyme
(recompilation et l‘exécution)
Sous Programmes
Un sous Programmes PL/SQL :
• bloc nommé (named block ) qui peut être bloc qui peut être invoqué
• Possède une signature : nom , liste des paramètres type et type de réponse
• Si le sous-programme comporte des paramètres, leurs valeurs peuvent être différentes pour
chaque appel.
declare
a number := 20;
b number := 30;
c number;
begin
c := a * b ;
end;
Créer un bloc anonyme
SET SERVEROUTPUT ON;
declare
a number := 20;
b number := 30;
c number;
begin
c := a * b ;
dbms_output.put_line(c);
end;
declare
v_first_name varchar(20);
begin
end;
Créer un bloc anonyme
• Une section exécutable (BEGIN … END) peut contenir des blocs imbriqués.
• Une section de traitement des exceptions peut contenir des blocs imbriqués.
Blocs imbriqués
Exemple :
DECLARE
v_ext_variable VARCHAR2(20):='GLOBAL VARIABLE';
BEGIN
DECLARE
v_loc_variable VARCHAR2(20):='VARIABLE LOCALE';
BEGIN
DBMS_OUTPUT.PUT_LINE(v_loc_variable);
DBMS_OUTPUT.PUT_LINE(v_ext_variable);
END;
DBMS_OUTPUT.PUT_LINE(v_ext_variable);
END;
Déclaration des variables PL/SQL
Traiter les variables en langage PL/SQL
Les variables :
• sont utilisées et font l'objet de l'affectation de nouvelles valeurs dans la section exécutable
Syntaxe :
identifier [CONSTANT] datatype [NOT NULL]
[:= | DEFAULT expr];
CONSTANT :
c’est une constante (doit être initialisée)
▫ NOT NULL :
on ne peut pas lui affecter une valeur nulle (sinon exception VALUE_ERROR)
▫ Initialisation :
:= (affectation)
DEFAULT
Attribut %TYPE
declare
v_first_name employees. first_name%TYPE;
begin
select first_name INTO v_first_name
FROM employees where employee_id = 100;
dbms_output.put_line('the first name of the employee is :' || v_first_name);
end;
Attribut %ROWTYPE
• Déclarez une variable correspondant à l'ensemble des colonnes d'une table ou d'une vue de base de
données.
• Les noms et types de données des champs de l'enregistrement sont issus des colonnes de la table ou de
la vue.
Syntaxe :
• Il n'est pas nécessaire de connaître le nombre et les types de données des colonnes sous-
DECLARE
v_emp_number number:= 124;
v_emp_rec employees%ROWTYPE;
BEGIN
SELECT * INTO v_emp_rec FROM employees
WHERE employees.employee_id = v_emp_number;
INSERT INTO retired_emps(empno, ename, job, mgr, dtembauche, leavedate, sal,
comm, deptno)
VALUES (v_emp_rec.employee_id, v_emp_rec.last_name,
v_emp_rec.job_id, v_emp_rec.manager_id,
v_emp_rec.HIRE_DATE, SYSDATE,
v_emp_rec.SALARY, v_emp_rec.commission_pct,
v_emp_rec.departement_id);
END;
Structures de contrôle
Contrôler le flux d'exécution
for
loop
while
Instruction IF
Syntaxe :
IF condition THEN
statements;
[ELSIF condition THEN
statements;]
[ELSE
statements;]
END IF;
Expressions CASE
CASE selector
WHEN expression1 THEN result1
WHEN expression2 THEN result2
...
WHEN expressionN THEN resultN
[ELSE resultN+1]
END;
/
Contrôle d'itération : Instructions LOOP
• Les boucles permettent d'exécuter plusieurs fois une instruction ou séquence d'instructions.
• Boucle de base
• Boucle FOR
• Boucle WHILE
Boucles de base
Syntaxe :
LOOP
statement1;
...
EXIT [WHEN condition];
END LOOP;
Boucles WHILE
Syntaxe :
Utilisez la boucle WHILE pour répéter des instructions tant qu'une condition renvoie TRUE.
Boucles FOR
• Un curseur est un pointeur vers la zone de mémoire privée allouée par le serveur Oracle.
• Un curseur est utilisé pour gérer le jeu de résultats d'une instruction SELECT.
• Implicite : créé et géré en interne par le serveur Oracle afin de traiter les instructions SQL
Grâce aux attributs de curseur SQL, vous pouvez tester le résultat de l'exécution des instructions
SQL.
SQL%FOUND Attribut booléen qui prend la valeur TRUE si la dernière instruction SQL a
renvoyé au moins une ligne
SQL%NOTFOUND Attribut booléen qui prend la valeur TRUE si la dernière instruction SQL n'a
renvoyé aucune ligne
SQL%ROWCOUNT Valeur entière qui représente le nombre de lignes affectées par la dernière
instruction SQL
Attributs de curseur SQL pour les curseurs implicites
Supprimez de la table EMPLOYEES les lignes correspondant à l'ID d'employé indiqué. Affichez le
nombre de lignes supprimées.
Exemple :
DECLARE
v_empno employees.employee_id%TYPE := 104;
BEGIN
DELETE FROM employees
WHERE employee_id = v_empno;
DBMS_OUTPUT.PUT_LINE (SQL%ROWCOUNT || ' lignes effacées.');
END;
Les curseurs explicites
Curseurs
A chaque instruction SQL exécutée par le serveur Oracle est associé un curseur individuel :
• Curseur implicite : Déclaré et géré par le compilateur PL/SQL pour toutes les instructions LMD et
Non
Oui
DECLARE OPEN FETCH VIDE? CLOSE
1 Ouverture du
curseur
Pointeur
de curseur
2 Extraction
d'une ligne
Pointeur
de curseur
3 Fermeture Pointeur
du curseur de curseur
Déclarer un curseur
Syntaxe :
CURSOR cursor_name IS
select_statement;
Exemple :
DECLARE
CURSOR c_emp_cursor IS
SELECT employee_id, first_name
FROM employees WHERE department_id =30;
Ouvrir le curseur
DECLARE
CURSOR c_emp_cursor IS
SELECT employee_id, first_name
FROM employees WHERE department_id =30;
..
BEGIN
OPEN c_emp_cursor;
END;
Extraire des données du curseur
DECLARE
CURSOR c_emp_cursor IS
SELECT employee_id, first_name
FROM employees WHERE department_id =30;
v_empno employees.employee_id%TYPE;
v_name employees.first_name%TYPE;
BEGIN
OPEN c_emp_cursor;
FETCH c_emp_cursor INTO v_empno, v_name;
DBMS_OUTPUT.PUT_LINE( v_empno ||' '|| v_name);
END;
Extraire des données du curseur loop
DECLARE
CURSOR c_emp_cursor IS
SELECT employee_id, first_name
FROM employees WHERE department_id =30;
v_empno employees.employee_id%TYPE;
v_name employees.first_name%TYPE;
BEGIN
OPEN c_emp_cursor;
LOOP
FETCH c_emp_cursor INTO v_empno, v_name;
EXIT WHEN c_emp_cursor%NOTFOUND;
DBMS_OUTPUT.PUT_LINE( v_empno ||' '|| v_name);
END LOOP;
END;
Fermer le curseur
...
BEGIN
OPEN c_emp_cursor;
LOOP
FETCH c_emp_cursor INTO v_empno, v_name;
EXIT WHEN c_emp_cursor%NOTFOUND;
DBMS_OUTPUT.PUT_LINE( v_empno ||' '|| v_name);
END LOOP;
CLOSE c_emp_cursor;
END;
Boucles FOR de curseur
DECLARE
CURSOR c_empl_cursor IS
SELECT employee_id, first_name
FROM employees WHERE department_id =30;
BEGIN
FOR emp_record IN c_empl_cursor
LOOP
DBMS_OUTPUT.PUT_LINE( emp_record.employee_id ||' '|| emp_record.first_name);
END LOOP;
END;
Attributs d'un curseur explicite
Utilisez des attributs de curseur explicite pour obtenir des informations d'état sur un curseur.
%NOTFOUND Booléen Prend la valeur TRUE si la dernière extraction ne renvoie pas de ligne
%FOUND Booléen Prend la valeur TRUE si la dernière extraction renvoie une ligne
%ROWCOUNT Nombre Prend la valeur correspondant au nombre total de lignes renvoyées jusqu'à
présent