Vous êtes sur la page 1sur 34

Interagir avec le serveur Oracle

Copyright © Oracle, 2004. Tous droits réservés.


Objectifs

A la fin de ce chapitre, vous pourrez :


• déterminer les instructions SQL pouvant être
incluses directement dans un bloc exécutable
PL/SQL
• manipuler des données à l'aide d'instructions LMD
dans du code PL/SQL
• utiliser des instructions de gestion des transactions
dans le code PL/SQL
• utiliser la clause INTO pour le stockage des valeurs
renvoyées par une instruction SQL
• distinguer les curseurs implicites des curseurs
explicites
• utiliser des attributs de curseur SQL

Copyright © Oracle, 2004. Tous droits réservés.


Instructions SQL en langage PL/SQL

• Extrayez une ligne de la base de données à l'aide


de la commande SELECT.
• Modifiez des lignes de la base de données en
utilisant des commandes LMD.
• Contrôlez une transaction avec la commande
COMMIT, ROLLBACK.

Copyright © Oracle, 2004. Tous droits réservés.


Instructions SELECT en langage PL/SQL

Extrayez les données de la base à l'aide d'une


instruction SELECT.
Syntaxe :
SELECT select_list
INTO {variable_name[, variable_name]...
| record_name}
FROM table
[WHERE condition];

Copyright © Oracle, 2004. Tous droits réservés.


Instructions SELECT en langage PL/SQL

• La clause INTO est obligatoire.


• Les interrogations doivent renvoyer une seule ligne.
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;
/

Copyright © Oracle, 2004. Tous droits réservés.


Extraire des données en langage PL/SQL

Extrayez les valeurs hire_date et salary de


l'employé désigné.
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;
/

Copyright © Oracle, 2004. Tous droits réservés.


Extraire des données en langage PL/SQL

Renvoyez la somme des salaires de tous les employés


du département désigné.
Exemple :
SET SERVEROUTPUT ON
DECLARE
sum_sal NUMBER(10,2);
deptno NUMBER NOT NULL := 60;
BEGIN
SELECT SUM(salary) -- group function
INTO sum_sal FROM employees
WHERE department_id = deptno;
DBMS_OUTPUT.PUT_LINE ('The sum of salary is '
|| sum_sal);
END;
/

Copyright © Oracle, 2004. Tous droits réservés.


Manipuler les données en langage PL/SQL

Modifiez des tables de base de données en utilisant


des instructions LMD :
• INSERT
DELETE
• UPDATE
• DELETE

INSERT

UPDATE

Copyright © Oracle, 2004. Tous droits réservés.


Insérer des données

Ajoutez les informations relatives à un nouvel employé


à la table EMPLOYEES.
Exemple :
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;
/

Copyright © Oracle, 2004. Tous droits réservés.


Mettre à jour des données

Augmentez le salaire de tous les employés chargés du


contrôle des stocks.
Exemple :
DECLARE
sal_increase employees.salary%TYPE := 800;
BEGIN
UPDATE employees
SET salary = salary + sal_increase
WHERE job_id = 'ST_CLERK';
END;
/

Copyright © Oracle, 2004. Tous droits réservés.


Supprimer des données

Supprimez les lignes appartenant au département 10 à


partir de la table employees.
Exemple :
DECLARE
deptno employees.department_id%TYPE := 10;
BEGIN
DELETE FROM employees
WHERE department_id = deptno;
END;
/

Copyright © Oracle, 2004. Tous droits réservés.


Curseur SQL

• Un curseur est un pointeur vers la zone de


mémoire privée allouée par le serveur Oracle.
• Il existe deux types de curseur :
– Curseurs implicites : créés et gérés en interne par
le serveur Oracle afin de traiter les instructions SQL
– Curseurs explicites : déclarés explicitement par le
programmeur

Copyright © Oracle, 2004. Tous droits réservés.


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 l'instruction SQL la plus
récente

Copyright © Oracle, 2004. Tous droits réservés.


Attributs de curseur SQL pour les
curseurs implicites
Supprimez de la table employees les lignes avec l'ID
d'employé désigné. Affichez le nombre de lignes
supprimées.
Exemple :
VARIABLE rows_deleted VARCHAR2(30)
DECLARE
empno employees.employee_id%TYPE := 176;
BEGIN
DELETE FROM employees
WHERE employee_id = empno;
:rows_deleted := (SQL%ROWCOUNT ||
' row deleted.');
END;
/
PRINT rows_deleted

Copyright © Oracle, 2004. Tous droits réservés.


Utiliser des curseurs explicites

Copyright © Oracle, 2004. Tous droits réservés.


Objectifs
A la fin de ce chapitre, vous pourrez :
• faire la différence entre un curseur implicite et un
curseur explicite
• déterminer quand et pourquoi utiliser un curseur
explicite
• déclarer et contrôler des curseurs explicites
• utiliser une boucle simple et une boucle FOR de
curseur pour extraire (fetch) des données
• déclarer et utiliser des curseurs avec des paramètres
• verrouiller des lignes à l'aide de la clause FOR
UPDATE
• référencer la ligne actuelle avec la clause WHERE
CURRENT

Copyright © Oracle, 2004. Tous droits réservés.


A propos des curseurs

A chaque instruction SQL exécutée par le serveur


Oracle est associé un curseur individuel :
• Curseurs implicites : déclarés et gérés par le
compilateur PL/SQL pour toutes les instructions
LMD et les instructions SELECT PL/SQL
• Curseurs explicites : déclarés et gérés par le
programmeur

Copyright © Oracle, 2004. Tous droits réservés.


Opérations de curseur explicite

Table
100 King AD_PRES
101 Kochhar AD_VP
Ensemble actif
102 De Haan AD_VP
. . .
. . .
. . .
139 Seo ST_CLERK
140 Patel ST_CLERK
. . .

Copyright © Oracle, 2004. Tous droits réservés.


Contrôler les curseurs explicites

Non

Oui
DECLARE OPEN FETCH VIDE? CLOSE

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


zone SQL l'ensemble la ligne l'existence l'ensemble
nommée actif en cours de lignes actif
dans des
variables • Si des
lignes
existent,
revenir à
FETCH

Copyright © Oracle, 2004. Tous droits réservés.


Contrôler les curseurs explicites

1 Ouverture du curseur
Pointeur de
curseur

2 Extraction (fetch)
d'une ligne
Pointeur de
curseur

Pointeur de
3 Fermeture du curseur
curseur

Copyright © Oracle, 2004. Tous droits réservés.


Déclarer le curseur

Syntaxe :
CURSOR cursor_name IS
select_statement;

Exemples :
DECLARE
CURSOR emp_cursor IS
SELECT employee_id, last_name FROM employees
WHERE department_id =30;
DECLARE
locid NUMBER:= 1700;
CURSOR dept_cursor IS
SELECT * FROM departments
WHERE location_id = locid;
...

Copyright © Oracle, 2004. Tous droits réservés.


Ouvrir le curseur

DECLARE
CURSOR emp_cursor IS
SELECT employee_id, last_name FROM employees
WHERE department_id =30;
...
BEGIN
OPEN emp_cursor;

Copyright © Oracle, 2004. Tous droits réservés.


Extraire des données du curseur

SET SERVEROUTPUT ON
DECLARE
CURSOR emp_cursor IS
SELECT employee_id, last_name FROM employees
WHERE department_id =30;
empno employees.employee_id%TYPE;
lname employees.last_name%TYPE;
BEGIN
OPEN emp_cursor;
FETCH emp_cursor INTO empno, lname;
DBMS_OUTPUT.PUT_LINE( empno ||' '||lname);
...
END;
/

Copyright © Oracle, 2004. Tous droits réservés.


Extraire des données du curseur

SET SERVEROUTPUT ON
DECLARE
CURSOR emp_cursor IS
SELECT employee_id, last_name FROM employees
WHERE department_id =30;
empno employees.employee_id%TYPE;
lname employees.last_name%TYPE;
BEGIN
OPEN emp_cursor;
LOOP
FETCH emp_cursor INTO empno, lname;
EXIT WHEN emp_cursor%NOTFOUND;
DBMS_OUTPUT.PUT_LINE( empno ||' '||lname);
END LOOP;
...
END;
/

Copyright © Oracle, 2004. Tous droits réservés.


Fermer le curseur

...
LOOP
FETCH emp_cursor INTO empno, lname;
EXIT WHEN emp_cursor%NOTFOUND;
DBMS_OUTPUT.PUT_LINE( empno ||' '||lname);
END LOOP;
CLOSE emp_cursor;
END;
/

Copyright © Oracle, 2004. Tous droits réservés.


Curseurs et enregistrements

Traitez les lignes de l'ensemble actif en extrayant


(fetch) les valeurs pour les placer dans un
enregistrement PL/SQL.
DECLARE
CURSOR emp_cursor IS
SELECT employee_id, last_name FROM employees
WHERE department_id =30;
emp_record emp_cursor%ROWTYPE;
BEGIN
OPEN emp_cursor;
LOOP
FETCH emp_cursor INTO emp_record;
...

Copyright © Oracle, 2004. Tous droits réservés.


Boucles FOR de curseur

Syntaxe :
FOR record_name IN cursor_name LOOP
statement1;
statement2;
. . .
END LOOP;

• La boucle FOR de curseur simplifie le traitement


des curseurs explicites.
• Des opérations d'ouverture, d'extraction (fetch),
de sortie et de fermeture ont lieu de manière
implicite.
• L'enregistrement est déclaré implicitement.

Copyright © Oracle, 2004. Tous droits réservés.


Boucles FOR de curseur

SET SERVEROUTPUT ON
DECLARE
CURSOR emp_cursor IS
SELECT employee_id, last_name FROM employees
WHERE department_id =30;
BEGIN
FOR emp_record IN emp_cursor
LOOP
DBMS_OUTPUT.PUT_LINE( emp_record.employee_id
||' ' ||emp_record.last_name);
END LOOP;
END;
/

Copyright © Oracle, 2004. Tous droits réservés.


Attributs d'un curseur explicite

Obtenir les informations d'état concernant 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 (fetch) ne renvoie pas de
ligne
%FOUND Booléen Prend la valeur TRUE si la dernière
extraction renvoie une ligne ;
complément de %NOTFOUND
%ROWCOUNT Nombre Prend la valeur correspondant au
nombre total de lignes renvoyées
jusqu'à présent

Copyright © Oracle, 2004. Tous droits réservés.


Attribut %ISOPEN

• Extrayez (fetch) les lignes uniquement lorsque le


curseur est ouvert.
• Utilisez l'attribut de curseur %ISOPEN avant de
réaliser une extraction pour déterminer si le
curseur est ouvert.
Exemple :
IF NOT emp_cursor%ISOPEN THEN
OPEN emp_cursor;
END IF;
LOOP
FETCH emp_cursor...

Copyright © Oracle, 2004. Tous droits réservés.


Exemple d'utilisation des attributs
%ROWCOUNT et %NOTFOUND
SET SERVEROUTPUT ON
DECLARE
empno employees.employee_id%TYPE;
ename employees.last_name%TYPE;
CURSOR emp_cursor IS SELECT employee_id,
last_name FROM employees;
BEGIN
OPEN emp_cursor;
LOOP
FETCH emp_cursor INTO empno, ename;
EXIT WHEN emp_cursor%ROWCOUNT > 10 OR
emp_cursor%NOTFOUND;
DBMS_OUTPUT.PUT_LINE(TO_CHAR(empno)
||' '|| ename);
END LOOP;
CLOSE emp_cursor;
END ;
/

Copyright © Oracle, 2004. Tous droits réservés.


Boucles FOR de curseur utilisant
des sous-interrogations

Il n'est pas nécessaire de déclarer le curseur.


Exemple :
SET SERVEROUTPUT ON
BEGIN
FOR emp_record IN (SELECT employee_id, last_name
FROM employees WHERE department_id =30)
LOOP
DBMS_OUTPUT.PUT_LINE( emp_record.employee_id ||'
'||emp_record.last_name);
END LOOP;
END;
/

Copyright © Oracle, 2004. Tous droits réservés.


Curseurs avec paramètres

Syntaxe :
CURSOR cursor_name
[(parameter_name datatype, ...)]
IS
select_statement;

• Transmettez des paramètres au curseur au


moment de son ouverture et de l'exécution
de l'interrogation.
• Ouvrez un curseur explicite à plusieurs reprises,
en renvoyant un ensemble actif différent à chaque
fois.
OPEN cursor_name(parameter_value,.....) ;

Copyright © Oracle, 2004. Tous droits réservés.


Curseurs avec paramètres

SET SERVEROUTPUT ON
DECLARE
CURSOR emp_cursor (deptno NUMBER) IS
SELECT employee_id, last_name
FROM employees
WHERE department_id = deptno;
dept_id NUMBER;
lname VARCHAR2(15);
BEGIN
OPEN emp_cursor (10);
...
CLOSE emp_cursor;
OPEN emp_cursor (20);
...

Copyright © Oracle, 2004. Tous droits réservés.