Vous êtes sur la page 1sur 48

BASES DE DONNEES AVANCEES

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 intègre de manière transparente les structures procédurales au langage SQL


langage PL/SQL

 PL/SQL offre une structure de bloc pour les unités de code exécutables.

 PL/SQL fournit des structures procédurales :

• Variables, constantes et types de données

• Structures de contrôle (tests, boucles ..etc. )

• Curseurs

• Programmes réutilisables (procédures , fonctions ..etc.)

 PL/SQL exploite les avantages du langage SQL en proposant aussi de la programmation.


Intérêt du langage PL/SQL

 Intégration de structures procédurales au langage SQL

 Contrôle amélioré des instructions SQL et leur exécution à l’aide des structures de contrôle.

 Amélioration des performances

• 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)

 Développement de programme modulaire

 Intégration aux outils Oracle

SQL
IF...THEN
SQL
ELSE
SQL
END IF;
SQL
Blocs PL/SQL

 PL/SQL est un langage structuré en blocs.

 PL/SQL permet de rendre le code modulaire par l'utilisation :

• Blocs anonymes (Anonymous blocks)

• Procédures et fonctions

• Packages

• triggers
Blocs anonymes
Un bloc PL/SQL anonymes :

• Blocs PL/SQL non nommés

• Constitue la structure en bloc fondamentale de PL/SQL

• Compilés chaque fois

• Non stockés dans la base de données pour une utilisation ultérieure

• Pas d'appel possible par d'autres applications

• Ne renvoient pas de valeurs et ne peuvent pas accepter de paramètres

• 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.

• Correspond soit à une procédure, soit à une fonction.

• Les sous-programmes peuvent être regroupés en packages PL/SQL.


Blocs anonymes

[DECLARE -- Declaration Section (Optional)


variable declarations; ... ]
BEGIN -- Executable Section (Mandatory)
SQL or PL/SQL statements;
[EXCEPTION -- Exception Section (Optional)
WHEN exception THEN statements; ]
END; -- End of Block (Mandatory)
Blocs anonymes , Procédures et fonctions

Bloc anonyme Procédure Fonction

[DECLARE] PROCEDURE name FUNCTION name


IS RETURN datatype
IS
BEGIN BEGIN BEGIN
--statements --statements --statements
RETURN value;
[EXCEPTION] [EXCEPTION] [EXCEPTION]

END; END; END;


Créer un bloc anonyme

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;

On peut utiliser un package Oracle prédéfini et sa procédure : DBMS_OUTPUT.PUT_LINE


Pour afficher le résultat dans la sortie
Créer un bloc anonyme

Entrez le bloc anonyme dans l'espace de travail SQL Developer :


Créer un bloc anonyme

declare

v_first_name varchar(20);

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;
Créer un bloc anonyme

Entrez le bloc anonyme dans l'espace de travail SQL Developer :


Blocs imbriqués

Les blocs PL/SQL peuvent être imbriqués.

• 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 déclarées et initialisées dans la section déclarative

• sont utilisées et font l'objet de l'affectation de nouvelles valeurs dans la section exécutable

• sont transmises en tant que paramètres aux sous-programmes PL/SQL

• sont utilisées pour contenir la sortie d'un sous-programme PL/SQL


Déclarer et initialiser des variables PL/SQL

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

 L’attribut %TYPE est utilisé pour déclarer une variable en fonction :

• d'une définition de colonne de base de données

• d'une autre variable déjà déclarée

 L’attribut %TYPE doit est préfixé avec :

• la table et la colonne de base de données

• le nom de la variable déclarée


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.

• Faites précéder %ROWTYPE du nom de la table ou de la 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 :

DECLARE identifier reference%ROWTYPE;

DECLARE v_emp_rec employees%ROWTYPE;


Avantages liés à l'utilisation de l'attribut %ROWTYPE

• Il n'est pas nécessaire de connaître le nombre et les types de données des colonnes sous-

jacentes ; en outre, ces derniers peuvent changer lors de l'exécution.

• L'attribut %ROWTYPE permet d'extraire une ligne avec l'instruction SELECT *.


Attribut %ROWTYPE : Exemple

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

• Une expression CASE sélectionne un résultat et le renvoie.

• Pour sélectionner le résultat, l'expression CASE utilise des expressions.


La valeur renvoyée par ces expressions est utilisée pour sélectionner une
ou plusieurs alternatives.

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.

• Il existe trois types de boucle :

• Boucle de base

• Boucle FOR

• Boucle WHILE
Boucles de base

Syntaxe :

LOOP
statement1;
...
EXIT [WHEN condition];
END LOOP;
Boucles WHILE

Syntaxe :

WHILE condition LOOP


statement1;
statement2;
...
END LOOP;

Utilisez la boucle WHILE pour répéter des instructions tant qu'une condition renvoie TRUE.
Boucles FOR

• Utilisez une boucle FOR pour simplifier le contrôle du nombre d'itérations.

• Ne déclarez pas le compteur (sa déclaration est implicite).

FOR compteur IN [REVERSE]


lower_bound..upper_bound LOOP
statement1;
statement2;
...
END LOOP;
Curseur SQL

• 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.

• Il existe deux types de curseur :

• Implicite : créé et géré en interne par le serveur Oracle afin de traiter les instructions SQL

• Explicite : déclaré explicitement par le programmeur


Attributs de curseur SQL pour les curseurs implicites

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

les instructions PL/SQL SELECT

• Curseur explicite : Déclaré et géré par le programmeur


Contrôler les curseurs explicites

Non

Oui
DECLARE OPEN FETCH VIDE? CLOSE

• Créer • Identifier • Charger la • Tester • Libérer


une zone l'ensemble ligne en l'existence l'ensemble
SQL actif cours de lignes actif
nommée dans des dans le
variables curseur
• S'il n'y a plus
de lignes à
traiter
revenir
FETCH
Contrôler les curseurs explicites

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.

Attribut Type Description

%ISOPEN Booléen Prend la valeur TRUE si le curseur est ouvert

%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

Vous aimerez peut-être aussi