Académique Documents
Professionnel Documents
Culture Documents
11g
Chap 2 : PL/SQL
Le langage PL/SQL :
2
Définition du langage PL/SQL
3
Structure d'un bloc PL/SQL
DECLARE (facultatif)
Variables, curseurs, exceptions définies par l'utilisateur
BEGIN (obligatoire)
- Instructions SQL
- Instructions PL/SQL
EXCEPTION (facultatif)
Actions à effectuer lorsque des erreurs se produisent
END; (obligatoire)
4
Types de bloc PL/SQL
5
Types de bloc PL/SQL
6
Structures de programme
7
Environnements de programmation PL/SQL
8
Créer un bloc anonyme
9
Tester la sortie d'un bloc PL/SQL
10
Tester la sortie d'un bloc PL/SQL
11
Utilisation des variables
Les noms :
12
Utilisation des variables
Syntaxe :
Exemples :
DECLARE
emp_hiredate DATE;
emp_deptno NUMBER(2) NOT NULL := 10;
location VARCHAR2(13) := 'Atlanta';
c_comm CONSTANT NUMBER := 1400;
13
Utilisation des variables
SET SERVEROUTPUT ON
DECLARE
Myname VARCHAR2(20);
BEGIN
DBMS_OUTPUT.PUT_LINE('My name is: '||Myname);
Myname := 'nabil';
DBMS_OUTPUT.PUT_LINE('My name is: '||Myname);
END;
/
SET SERVEROUTPUT ON
DECLARE
Myname VARCHAR2(20):= 'nabil';
BEGIN
Myname := 'noufal';
DBMS_OUTPUT.PUT_LINE('My name is: '||Myname);
END;
14
Utilisation des variables
SET SERVEROUTPUT ON
DECLARE
event VARCHAR2(15);
BEGIN
event := q'!Father's day!';
DBMS_OUTPUT.PUT_LINE('3rd Sunday in June is : '||event);
event := q'[Mother's day]';
DBMS_OUTPUT.PUT_LINE('2nd Sunday in May is :'||event);
END;
15
Types de variable
…
16
Types de variable
VARCHAR2 (maximum_length)
NUMBER [(precision, scale)]
DATE
CHAR [(maximum_length)]
LONG
etc
17
Utilisation des variables
Exemples :
DECLARE
emp_job VARCHAR2(9);
count_loop BINARY_INTEGER := 0;
dept_total_sal NUMBER(9,2) := 0;
18
L'attribut %TYPE
L'attribut %TYPE est le plus souvent utilisé lorsque la valeur stockée dans la
variable est issue d'une table de la base de données.
19
L'attribut %TYPE
Syntaxe :
identifier table.column_name%TYPE;
Exemples :
emp_lname employees.last_name%TYPE;
balance NUMBER(7,2);
20
Utilisation des variables
21
Utilisation des variables
Variables de substitution
• Elles sont utilisées afin d'éviter le codage en dur des valeurs pouvant être
obtenues lors de l'exécution.
22
Utilisation des variables
Exemple
VARIABLE emp_salary NUMBER
SET AUTOPRINT ON
DECLARE
empno NUMBER(6):=&empno;
BEGIN
SELECT salary INTO :emp_salary
FROM employees WHERE employee_id = empno;
END;
23
Ecrire des instructions exécutables
les délimiteurs
24
Ecrire des instructions exécutables
Opérateurs en langage PL/SQL
25
Ecrire des instructions exécutables
Blocs imbriqués
DECLARE
outer_variable VARCHAR2(20):='GLOBAL VARIABLE';
BEGIN
DECLARE
inner_variable VARCHAR2(20):='LOCAL VARIABLE';
BEGIN
DBMS_OUTPUT.PUT_LINE(inner_variable);
DBMS_OUTPUT.PUT_LINE(outer_variable);
END;
DBMS_OUTPUT.PUT_LINE(outer_variable);
END;/
26
Portée et visibilité des variables
DECLARE
father_name VARCHAR2(20):='Patrick';
date_of_birth DATE:='20-Apr-1972';
BEGIN
DECLARE
child_name VARCHAR2(20):='Mike';
date_of_birth DATE:='12-Dec-2002';
BEGIN
DBMS_OUTPUT.PUT_LINE('Father''s Name: '||father_name);
DBMS_OUTPUT.PUT_LINE('Date of Birth: '||date_of_birth);
DBMS_OUTPUT.PUT_LINE('Child''s Name: '||child_name);
END;
DBMS_OUTPUT.PUT_LINE('Date of Birth: '||date_of_birth);
END;
/
27
Qualifier un identificateur
<<outer>>
DECLARE
father_name VARCHAR2(20):='Patrick';
date_of_birth DATE:='20-Apr-1972';
BEGIN
DECLARE
child_name VARCHAR2(20):='Mike';
date_of_birth DATE:='12-Dec-2002';
BEGIN
DBMS_OUTPUT.PUT_LINE('Father''s Name: '||father_name);
DBMS_OUTPUT.PUT_LINE('Date of Birth: ‘||outer.date_of_birth);
DBMS_OUTPUT.PUT_LINE('Child''s Name: '||child_name);
DBMS_OUTPUT.PUT_LINE('Date of Birth: '||date_of_birth);
END;
END;
28
Instructions SELECT en langage PL/SQL
Syntaxe :
SELECT select_list
INTO {variable_name[, variable_name]…| record_name}
FROM table
[WHERE condition];
Exemple :
SET SERVEROUTPUT ON
DECLARE
fname VARCHAR2(25);
BEGIN
SELECT first_name INTO fname
FROM employees WHERE employee_id=200;
DBMS_OUTPUT.PUT_LINE(' First Name is : '||fname);
END;
/
30
Instructions SELECT en langage PL/SQL
Exemple
DECLARE
emp_hiredate employees.hire_date
%TYPE;
emp_salary employees.salary
%TYPE;
BEGIN
SELECT hire_date, salary
INTO emp_hiredate, emp_salary
FROM employees
WHERE employee_id = 100;
END;
31
Instructions INSERT en langage PL/SQL
BEGIN
INSERT INTO employees
(employee_id, first_name, last_name, email, hire_date, job_id, salary)
VALUES
(employees_seq.NEXTVAL, 'Ruth', 'Cores‘, 'RCORES',sysdate, 'AD_ASST', 4000);
END;
/
32
Instructions UPDATE en langage PL/SQL
Exemple :
DECLARE
sal_increase employees.salary%TYPE := 800;
BEGIN
UPDATE employees
SET salary = salary + sal_increase
WHERE job_id = 'ST_CLERK';
END;
/
33
Instructions DELETE en langage PL/SQL
Exemple :
DECLARE
deptno employees.department_id%TYPE := 10;
BEGIN
DELETE FROM employees
WHERE department_id = deptno;
END;
34
Instructions MERGEE en langage PL/SQL
L'instruction MERGE permet d'insérer ou de mettre à jour des lignes dans une
table, en utilisant les données d'une autre table.
Chaque ligne est insérée ou mise à jour dans la table cible, en fonction d'une
condition d'équijointure.
35
Instructions MERGEE en langage PL/SQL
DECLARE
empno EMPLOYEES.EMPLOYEE_ID%TYPE := 100;
BEGIN
MERGE INTO copy_emp c
USING employees e
ON (e.employee_id = empno)
WHEN MATCHED THEN
UPDATE SET
c.first_name = e.first_name,
c.last_name = e.last_name,
c.email = e.email, WHEN NOT MATCHED THEN
c.phone_number = e.phone_number, INSERT VALUES(e.employee_id, e.first_name,
c.hire_date = e.hire_date, e.last_name,
c.job_id = e.job_id, e.email, e.phone_number, e.hire_date,
c.salary = e.salary, e.job_id,
c.commission_pct = e.commission_pct, e.salary, e.commission_pct, e.manager_id,
c.manager_id = e.manager_id, e.department_id);
c.department_id = e.department_id END;
36
Instructions MERGEE en langage PL/SQL
Si une correspondance est trouvée, la ligne de la table COPY_EMP est mise à jour par
rapport à celle de la table employees.
37
Les instructions de contrôle
Contrôler le flux
d'exécution
38
Instructions IF
Exemple:
SET SERVEROUTPUT ON
DECLARE
myage number:=31;
BEGIN
IF myage < 11
THEN
DBMS_OUTPUT.PUT_LINE(' I am a child ');
ELSE
DBMS_OUTPUT.PUT_LINE(' I am not a child ');
END IF;
END;
40
Expressions CASE
Syntaxe :
CASE selector
[ELSE resultN+1]
END;
41
Expressions CASE
Exemple:
SET SERVEROUTPUT ON
DECLARE
grade CHAR(1) := UPPER('&grade');
appraisal VARCHAR2(20);
BEGIN
appraisal :=
CASE grade
WHEN 'A' THEN 'Excellent'
WHEN 'B' THEN 'Very Good'
WHEN 'C' THEN 'Good'
ELSE 'No such grade'
END;
DBMS_OUTPUT.PUT_LINE ('Grade: '|| grade || ‘ Appraisal ' || appraisal);
END;
42
instruction LOOP
Syntaxe :
LOOP -- initialisation
instruction1 -- instructions
...
EXIT [WHEN condition]; -- EXIT instruction
END LOOP; -- fermeture de la boucle
43
Instruction LOOP
Exemple:
DECLARE
countryid locations.country_id%TYPE := 'CA';
loc_id locations.location_id%TYPE;
counter NUMBER(2) := 1;
new_city locations.city%TYPE := 'Montreal';
BEGIN
SELECT MAX(location_id) INTO loc_id FROM locations
WHERE country_id = countryid;
LOOP
INSERT INTO locations(location_id, city, country_id)
VALUES((loc_id + counter), new_city, countryid);
counter := counter + 1;
EXIT WHEN counter > 3;
END LOOP;
END;
/
44
Instruction WHILE
Syntaxe :
45
instruction WHILE
Exemple:
DECLARE
countryid locations.country_id%TYPE := 'CA';
loc_id locations.location_id%TYPE;
new_city locations.city%TYPE := 'Montreal';
counter NUMBER := 1;
BEGIN
SELECT MAX(location_id) INTO loc_id FROM locations
WHERE country_id = countryid;
46
instruction FOR
Syntaxe :
instruction1;
instruction2;
...
END LOOP;
47
instruction FOR
Exemple:
DECLARE
countryid locations.country_id%TYPE := 'CA';
loc_id locations.location_id%TYPE;
new_city locations.city%TYPE := 'Montreal';
BEGIN
SELECT MAX(location_id) INTO loc_id
FROM locations
WHERE country_id = countryid;
FOR i IN 1..3 LOOP
END LOOP;
END;
48
Boucles imbriquées et Etiquettes
BEGIN
<<Maitre_loop>>
LOOP
v_counter := v_counter+1;
EXIT WHEN v_counter>10;
<<Detail_loop>>
LOOP
...
EXIT Maitre_loop WHEN total_done = 'YES';
-- Quitter les 2 boucles
EXIT WHEN Detail_done = 'YES';
-- Quitter la boucle détail seulement
...
END LOOP Detail_loop;
...
END LOOP Maitre_loop;
END;
/
49
Les Curseurs
50
Curseurs Implicites et Explicites
51
Curseurs Explicites
52
Curseurs Explicites
SET SERVEROUTPUT ON;
DECLARE
v_emp scott.emp%rowtype;
CURSOR c_emp IS
SELECT ename, job
FROM scott.emp
WHERE job = 'SALESMAN';
BEGIN
OPEN c_emp;
IF c_emp%ISOPEN =TRUE THEN
dbms_output.put_line('Curseur is OPEN');
END IF;
LOOP
FETCH c_emp INTO v_emp.ename, v_emp.job;
IF c_emp%NOTFOUND THEN
IF c_emp%ROWCOUNT = 0 THEN
dbms_output.put_line('Job = SALESMAN INNEXISTANT');
ELSE
dbms_output.put_line('Fin De Boucle, Nbr Enreg = ' || c_emp%ROWCOUNT);
END IF;
EXIT;
ELSIF c_emp%FOUND THEN
dbms_output.put_line('Name = '||v_emp.ename || ' Job = ' || v_emp.job);
END IF;
END LOOP;
CLOSE c_emp;
IF c_emp%ISOPEN = FALSE THEN
dbms_output.put_line('Curseur is CLOSE');
END IF;
END;
53
Contrôler les Curseurs Explicites
si OUI, Retourner
Oui à FETCH
DECLARE OPEN
OPEN Existence? Close
Close
FETCH
FETCH
Cursor Cursor
Cursor Cursor
Cursor
Non
Créer une zone SQL Identifier Charger la ligne Tester l’existence Libérer l’ensemble
nommée l’ensemble actif courante dans des de lignes actif
de lignes variables
54
Contrôler les Curseurs Explicites
Syntaxe :
CURSOR cursor_name IS
select_statement;
Exemple:
DECLARE
CURSOR emp_cursor IS
SELECT empno, ename
FROM emp;
CURSOR dept_cursor IS
SELECT *
FROM dept
WHERE deptno = 10;
BEGIN
56
Ouvrir un Curseur
L’instruction OPEN
Syntaxe
OPEN cursor_name;
57
L’instruction FETCH
Syntaxe
58
L’instruction FETCH
59
Fermer un Curseur
• L’instruction CLOSE
Syntaxe
CLOSE cursor_name;
60
Les Attributs d’un Curseur Explicite
61
Les Attributs d’un Curseur Explicite
62
Curseurs et Records
Pour traiter les lignes de l’Ensemble Actif,
– faire le fetch dans le Record.
– les valeurs de la ligne sont chargées directement dans les
champs correspondant du record.
– La variable record peut être déclarée en utilisant l’attribut
%ROWTYPE
DECLARE
CURSOR emp_cursor IS
SELECT empno, ename
FROM emp;
emp_record emp_cursor%ROWTYPE;
BEGIN
OPEN emp_cursor;
LOOP
FETCH emp_cursor INTO emp_record;
...
63
Curseur dans une boucle FOR
64
Curseur dans une boucle FOR
Exemple:
Declare
-- Déclaration du curseur
CURSOR C_EMP IS
Select * From EMP
Where job = 'CLERK‘ ;
Begin
For Cur IN C_EMP Loop
dbms_output.put_line( To_char( Cur.empno ) || ' - ' || Cur.ename ) ;
End loop ;
End ;
/
7369 - SMITH
7876 - ADAMS
7900 - JAMES
7934 - MILLER
65
Curseur dans une boucle FOR
Exemple:
DECLARE
CURSOR emp_cursor IS
SELECT ename, deptno
FROM emp;
BEGIN
FOR emp_record IN emp_cursor LOOP
-- un open et un fetch implicites ont lieu
IF emp_record.deptno = 30 THEN
...
END LOOP; -- un close implicite a lieu
END;
66
Exemple:
67
Les Exceptions
68
Traitement des Exceptions
• Comment la traiter ?
– En l’interceptant dans le traitement des exceptions
– En la propageant à l’environnement appelant
69
Traitement des Exceptions
70
Traitement des Exceptions
71
Interception d’une Exception
72
Interception d’une Exception
Syntaxe :
EXCEPTION
WHEN exception1 [OR exception2 . . .] THEN
instruction1;
instruction2;
...
[WHEN exception3 [OR exception4 . . .] THEN
instruction1;
instruction2;
. . .]
[WHEN OTHERS THEN
instruction1;
instruction2;
. . .]
73
Erreurs Oracle pré-définies
74
Interception des erreurs Oracle pré-définies
DECLARE
e_invalid_product EXCEPTION;
BEGIN
UPDATE product
SET descrip = '&product_description'
WHERE prodid = &product_number;
IF SQL%NOTFOUND THEN
RAISE e_invalid_product;
END IF;
COMMIT;
EXCEPTION
WHEN e_invalid_product THEN
DBMS_OUTPUT.PUT_LINE('Numéro de produit invalide.');
END;
77
Fonctions d’interception des Erreurs
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 erreurs VALUES(v_error_code,v_error_message);
78