Chap6.1 PL - SQL
Chap6.1 PL - SQL
Chap6.1 PL - SQL
2
Un bloc PLSQL est composé de trois parties:
DECLARATION
DECLARE – Optionnelle
déclaration variables, constantes, types,
curseurs,...
EXECUTABLE
…
BEGIN – Obligatoire
contient le code PL/SQL
…….
EXCEPTION – Optionnelle
END - Obligatoire;
/
3
Dans le code PL/SQL (partie procédural) nous pouvons avoir :
● des structures conditionnelles (IF-THEN-ELSE / IF-THEN-
ELSIF / CASE)
● des structures répétitives (WHILE, LOOP, FOR,...)
● des ordres LMD (SELECT, UPDATE, DELETE, INSERT,...)
● des appels de fonctions, procédures, packages,...
4
EXEMPLE
DECLARE
v_ename varchar(20);
BEGIN
Select last_name into v_ename from
employees where employee_id =7839;
END
;
/
Placer un point virgule (;) à la fin de d’une
instruction SQL ou PL/SQL
Utiliser un slash (/) pour exécuter un bloc
PL/SQL anonyme
5
Débute par le mot DECLARE et permet la
déclaration des variables et constantes.
EXEMPLE
V_No_Produit Number ;
V_Designation VARCHAR2(20) ;
V_PU NUMBER(6,2) := 100.00;
6
Intègre différents types d’instructions :
Instruction d’affectation
Instruction de contrôle de flux
Instruction SQL
Instruction curseur
7
Traite les erreurs qui se produisent pendant
l’exécution d’un programme PL/SQL
Peut être prédéfinie :
DUP_VAL_ON_INDEX : insertion d’une clé
dupliquée
NO_DATA_FOUND : instruction select ne
retournant aucune ligne
...
Peut être définie : traiter par le programmeur.
8
Blocs anonymes
Blocs PL/SQL non nommés, imbriqués dans une
application ou créés de façon interactive.
logés dans le serveur d’application (poste devlopp).
Ils sont déclarés dans une application à l’endroit de
leur exécution.
Ils sont disponibles dans tous les environnements
PL/SQL.
[DECLARE
<Déclarations>]
BEGIN
<Instructions>
[EXCEPTION
<Traitements des erreurs>]
END ;
9
Procédures et fonctions stockées
Blocs PL/SQL nommés et stockées sous forme d’objet de
base de données.
Résident sur le serveur de base de données Oracle.
Peuvent utiliser des paramètres d’entrée et de sortie.
Sont invoquées d’une manière répétitive.
10
Les variables sont déclarées et initialisées dans la
section déclaratives
De nouvelles valeurs sont affectées aux variables dans
la section exécutable
Passage des valeurs à des programmes par
l’intermédiaire de paramètres
11
Deux variables peuvent porter le même nom si elles
sont dans des blocs distincts
Les noms des variables doivent être différents des
noms des colonnes et des tables utilisés dans le bloc.
L’identifiant ne doit pas dépasser 30 caractères. Le
premier caractère doit être une lettre, les autres
peuvent être des lettres, des nombres ou des
caractères spéciaux.
12
INTEGER -- max 38chiffres
NUMBER -- max 125 chiffres
CHAR;-- Max 32767 caractères
VARCHAR2; --
DATE; -- 4712 avant AVJC à 9999 APJC
BOOLEAN :TRUE,FALSE,NULL
%TYPE : type de variable équivalent au type de colonne
d’une table ou d’une autre variable
%ROWTYPE : type de variable équivalent à une ligne
d’une table
13
Declare
v_remise CONSTANT real := 0.10;
v_hiredate date;
g_deptno number(2) NOT NULL := 10;
v_integer integer; -- max 38chiffres
v_number 1 number; -- max 125 chiffres
v_number2 number(38,3);
v_bool boolean; -- valeurs possibles TRUE, FALSE, NULL et NOT NULL
v_varchar2 varchar2(20); -- Max 32767 caractères
v_date date; -- Les dates peuvent aller de -4712 avant AVJC à 9999 APJC
14
Declare
v_ename emp.ename%type;
v_emp emp%rowtype;
v_n1 number(5,3);
V_n2 v_n1%type;
2 identifier type_name;
16
Déclarez des variables pour le stockage du nom, du
poste et du salaire d'un nouvel employé.
Exemple :
...
TYPE emp_record_type IS RECORD
(last_name VARCHAR2(25),
job_id VARCHAR2(10),
salary NUMBER(8,2));
emp_record emp_record_type;
...
17
Opérateur d’affectation (:=)
Mot clé DEFAULT
Contrainte NOT NULL
EXEMPLES
v_integer number := 12345;
v_bool Boolean :=TRUE;
v_char varchar(30) NOT NULL := 'SGBD';
v_date date DEFAULT '01-Janv-2009';
18
IF condition THEN instructions; END IF;
IF condition THEN instructions1;
ELSE instructions2;
END IF;
IF condition1 THEN instructions1;
ELSIF condition2;
THEN instructions2;
ELSIF ... ELSE instructions N;
END IF;
19
EXEMPLES
DECLARE
v1 integer := 1100;
v2 integer := 200;
BEGIN
IF v1 < v2 THEN
dbms_output.put_line('v1 < v2');
ELSE
dbms_output.put_line('v2 <= v1');
END IF;
END;
/
20
DECLARE
v1 number:= 685;
v2 number := 125;
V3 number :=870;
BEGIN
IF v1 < v2 THEN
IF v2<v3 then
dbms_output.put_line('v1 < v2 < v3');
ELSIF v3 < v1 then
dbms_output.put_line('v3 < v1 < v2');
ELSE
dbms_output.put_line('v1 <=v3 < v2');
END IF;
ELSIF v1 < v3 then
dbms_output.put_line('v2 < v1 < v3');
ELSIF v3<v2 then
dbms_output.put_line('v3 < v2 <= v1');
ELSE
dbms_output.put_line('v2 <= v3 <= v1');
END IF;
END;
/
21
CASE expression
WHEN valeur1 THEN instructions1;
WHEN valeur2 THEN instructions2;
…
ELSE instructionsN;
END CASE;
CASE
WHEN expr1 THEN instructions1;
WHEN expr2 THEN instructions2;
…
ELSE instructionsN;
END CASE;
22
WHILE condition LOOP
instructions;
END LOOP;
EXEMPLES
DECLARE
v1 integer :=1;
BEGIN
WHILE v1 <10 LOOP
dbms_output.put_line(v1);
v1 := v1+1;
END LOOP;
END;
/
23
LOOP
instructions;
EXIT [WHEN condition];
instructions;
END LOOP;
EXEMPLES
DECLARE
v1 integer :=1;
BEGIN
LOOP
dbms_output.put_line(v1);
EXIT WHEN v1 =10;
v1 := v1+1;
END LOOP;
END;/
24
FOR compteur IN inf..sup LOOP
instructions;
END LOOP;
EXEMPLES
DECLARE
v1 integer :=1;
BEGIN
FOR v1 IN 1..10 LOOP
dbms_output.put_line(v1);
END LOOP;
END;
/
25
Utilisation de la clause INTO pour identifier les variables
PL/SQL qui doivent recevoir des valeurs des colonnes des
tables d’une base de données.
DECLARE
v_col1 …
v_col2 …
…
v_coln …
BEGIN
SELECT {*|col1,col2, ….coln} INTO v_col1, v_col2, …
v_coln
FROM table1, table2 , …
WHERE condition
26
DECLARE
v_emp employees%ROWTYPE;
BEGIN
dbms_output.enable;
Select * into v_emp From employees where
employee_id = '100';
dbms_output.put_line('Nom employé :' ||
v_emp.last_name || chr(10)||
'Fonction : ' || v_emp.job_id || chr(10)||
'Departement : '|| v_emp.department_id ||
chr(10)||
'Date recrutement : '|| to_char(v_emp.hire_date,
'dd/mm/yyyy') || chr(10) ||
'Salaire : ' || v_emp.salary );
END;
/
27
Declare
salaire_moy employees.salary%type;
Begin
Select avg(salary) into salaire_moy From
employees
Where department_id=10;
dbms_output.put_line('Le salaire moyen des
employés du département 10 est : ' ||
to_char(salaire_moy));
End ;
/
28