Documente Academic
Documente Profesional
Documente Cultură
PL/SQL
Laboratoire RIADI-ENSI
Avantages du PL/SQL
Portabilité
Déclaration des variables
Programmer avec des structures de
contrôle des langages procéduraux
(traitement conditionnel, traitement
répétitif, …)
Gestion des erreurs.
Déclarer des variables
Structure d’un bloc
PL/SQL
DECLARE
DECLARE -Optionnel
-Optionnel
–Variables,
–Variables,curseurs,
curseurs,exceptions
exceptionsdéfinies
définiespar
parl’utilisateur.
l’utilisateur.
••BEGIN
BEGIN -Obligatoire
-Obligatoire
–Insructions
–InsructionsSQL
SQL
–Instuctions
–InstuctionsPL/SQL
PL/SQL
•EXCEPTION
•EXCEPTION -Optionnel
-Optionnel
–Actions
–Actionsààréaliser
réaliserlorsqu’une
lorsqu’uneerreur
erreurse
seproduit
produit
•END;
•END; -Obligatoire
-Obligatoire
Structure d’un bloc
PL/SQL
DECLARE
DECLARE
v_variable
v_variable VARCHAR2(5);
VARCHAR2(5);
BEGIN
BEGIN
SELECT
SELECT nom_colonne
nom_colonne
INTO
INTO v_variable
v_variable
FROM
FROM nom_table;
nom_table;
•EXCEPTION
•EXCEPTION -Optionnel
-Optionnel
WHEN
WHENnom_exception
nom_exceptionTHEN
THEN
……
•END;
•END;
Utilisation des Variables
On utilise les variables pour :
Le stockage temporaire de données
La manipulation de valeurs stockées
La possibilité de réutilisation
Une maintenance plus facile
Déclarer des Variables
PL/SQL
Syntaxe
Identifiant
Identifiant[CONSTANT]
[CONSTANT]datatype
datatype[NOT
[NOTNULL]
NULL]
[:=
[:=| |DEFAULT
DEFAULTexpr];
expr];
Exemples
Declare
Declare
v_hiredate
v_hiredate DATE;
DATE;
v_deptno
v_deptno NUMBER(2)
NUMBER(2)NOT
NOTNULL:=10;
NULL:=10;
v_location
v_location VARCHAR2(13)
VARCHAR2(13):=
:=‘Atlanta’;
‘Atlanta’;
c_comm
c_comm CONSTATNT
CONSTATNTNUMBER:=1400:
NUMBER:=1400:
Déclarer des Variables
PL/SQL
Règles à suivre
Suivre des conventions de dénomination
Initialiser des variables définies avec la
contrainte NOT NULL
Initialisation à l’aide de l’opérateur
d’affectation (:=) ou du mot réservé
DEFAULT
Déclarer un seul identifiant par ligne.
Types de données
Scalaires
VARCHAR2 (maximum_length)
NUMBER
DATE
CHAR [(maximum_length)]
LONG
BOOLEAN
BINARY_INTEGER
Déclaration des Variables
Scalaires
Exemples
v_job
v_job VARCHAR2(9);
VARCHAR2(9);
v_count
v_count BINARY_INTEGER
BINARY_INTEGER:= :=0;
0;
v_total_sal
v_total_sal NUMBER(9,2)
NUMBER(9,2):=0;
:=0;
V_orderdate
V_orderdate DATE
DATE:=
:=SYSDATE
SYSDATE+7;+7;
C_tax_rate
C_tax_rate CONSTANT
CONSTANTNUMBER(3,2)
NUMBER(3,2):= :=8.25;
8.25;
V_valid
V_valid BOOLEAN
BOOLEANNOT
NOTNULL
NULL:= :=TRUE;
TRUE;
L’Attribut %TYPE
Déclarer une variable à partir de :
z La définition d’une colonne de la base de
données
z La définition d’une variable précédemment
déclarée
Préfixer %TYPE avec :
z La table et la colonne de la base
z Le nom de la variable précédemment
déclarée
Déclarer des Variables
avec l’Attribut %TYPE
Exemples
…
…
v_name
v_name emp.ename%TYPE;
emp.ename%TYPE;
v_balance
v_balance NUMBER(7,2);
NUMBER(7,2);
v_min_balance
v_min_balance v_balance%TYPE
v_balance%TYPE:=
:=10;
10;
…
…
Référencer des Variables
non-PL/SQL
DECLARE
DECLARE
v_sal
v_sal NUMBER(9,2)
NUMBER(9,2):= :=&p_annual_sal;
&p_annual_sal;
BEGIN
BEGIN
:g_monthly_sal
:g_monthly_sal:=
:=v_sal
v_sal/ /12;
12;
END;
END;
//
PRINT
PRINT g_monthly_sal
g_monthly_sal
Opérateurs en PL/SQL
Logiques
Arithmétiques Identiques à
Concaténation ceux de SQL
INSERT
UPDATE
DELETE
Insérer des données
Ajouter les informations concernant un
nouvel employé à la table emp.
Exemple
BEGIN
BEGIN
INSERT
INSERTINTO
INTOemp(empno,
emp(empno,ename,
ename,job,
job,deptno)
deptno)
VALUES
VALUES(50,’HARDING’,
(50,’HARDING’,‘CLERK’,
‘CLERK’,10);
10);
End;
End;
Mettre à jour des
données
Augmenter le salaire de tous les
employés de la table emp dont la
fonction est analyste.
Exemple
DECLARE
DECLARE
v_sal_increase
v_sal_increase emp.sal%TYPE
emp.sal%TYPE:=
:=2000;
2000;
BEGIN
BEGIN
UPDATE
UPDATE emp
emp
SET
SET sal
sal==sal
sal++v_sal_increase
v_sal_increase
WHERE
WHERE job
job==‘ANALYST’;
‘ANALYST’;
END;
END;
Supprimer des données
Supprimer les enregistrements dont le
département est le 10 dans la table
emp.
Exemple
DECLARE
DECLARE
v_deptno
v_deptno emp.deptno%TYPE
emp.deptno%TYPE:= :=10;
10;
BEGIN
BEGIN
DELETE
DELETE FROM
FROM emp
emp
WHERE
WHERE deptno
deptno==v_
v_deptno;
deptno;
END;
END;
Instructions
COMMIT et ROLLBACK
z La boucle WHILE
Boucles Basiques
Syntaxe
LOOP
LOOP
instruction1;
instruction1;
......
EXIT
EXIT [WHEN
[WHENcondition];
condition];
END
ENDLOOP;
LOOP;
Où
Où:: condition
conditionest
estune
unevariable
variablebooléenne
booléenneou
ouune
uneexpression
expression
Boucles Basiques
Exemple
DECLARE
DECLARE
v_ordid
v_ordid item.ordid.%TYPE
item.ordid.%TYPE:= :=601;
601;
v_counter
v_counter NUMBER(2)
NUMBER(2) := :=1;
1;
BEGIN
BEGIN
LOOP
LOOP
INSERT
INSERTINTO
INTOitem(ordid,
item(ordid,itemid)
itemid)
VALUES
VALUES(v_ordid,
(v_ordid,v_counter);
v_counter);
v_counter
v_counter:=
:=v_counter
v_counter++1;1;
EXIT
EXITWHEN
WHENv_counter
v_counter>>10;
10;
END
ENDLOOP;
LOOP;
END;
END;
Boucles FOR
Syntaxe
FOR
FORcounter
counterin
in[REVERSE]
[REVERSE]
borne_inférieure..borne_supérieure
borne_inférieure..borne_supérieureLOOP
LOOP
instruction1;
instruction1;
instruction2;
instruction2;
......
END
ENDLOOP; LOOP;
WHILE
WHILEcondition
condition LOOP
LOOP
instruction1;
instruction1;
instruction2;
instruction2;
......
END
ENDLOOP; LOOP;
Travailler avec des
types de données
Composés
PL/SQL Records
Ils sont composés d’un ou plusieurs
champs de types: scalaire, RECORD
Ils traitent un ensemble de Champs
comme une unité logique.
Ils sont pratiques pour extraire et
manipuler une ligne d’une table de la
base.
Créer un Record PL/SQL
Syntaxe
TYPE
TYPEtype_nom
type_nomIS ISRECORD
RECORD
(field_declaration
(field_declaration[,[,field_declaration]…);
field_declaration]…);
Identifier
Identifiertype_name;
type_name;
Où field_declaration est
Field_name
Field_name{field_type
{field_type| |variable%TYPE
variable%TYPE
| |table.column%TYPE
table.column%TYPE| |table%ROWTYPE}
table%ROWTYPE}
[[NOT
[[NOTNULL]
NULL]{:=
{:=| |DEFAULT}
DEFAULT}expr]
expr]
Créer un Record PL/SQL
Exemple
……
TYPE
TYPEemp_record_type
emp_record_typeIS
ISRECORD
RECORD
(ename
(ename VARCHAR2(10)
VARCHAR2(10),,
job
job VARCHAR2(9),
VARCHAR2(9),
sal
sal NUMBER(7,2));
NUMBER(7,2));
emp_record
emp_record emp_record_type;
emp_record_type;
……
L’attribut %ROWTYPE
Il permet de définir une variable à partir d’un
ensemble de colonnes d’une table ou d’une
vue de la base de données.
Préfixer %ROWTYPE par le nom de la table
ou de la vue.
Les champs du Record prennent les Noms et
les Types des colonnes de la table ou de la
vue.
DECLARE
DECLARE
emp_record
emp_record emp%ROWTYPE;
emp%ROWTYPE;
Écrire des curseurs
Explicites
A propos des Curseurs
Chaque instruction SQL exécutée a son
propre curseur individuel qui lui est
associé :
Curseurs implicites : déclarés pour
toutes les instructions LMD et SELECT
PL/SQL
Curseurs explicites : déclarés et
nommés par le programmeur.
Fonctionnement des
curseurs Explicites
7369
7369 SMITH
SMITH CLERK
CLERK
7566
7566 JONES
JONES MANAGER
MANAGER Ligne
Curseur
Curseur 7788
7788 SCOTT
SCOTT ANALYST
ANALYST
7876
7876 ADAMS
ADAMSCLERK
CLERK courante
7902
7902 FORD
FORD ANALYST
ANALYST
Contrôler les Curseurs
Explicites
oui
non
OPEN
EX
DECLARE FETCH CLOSE
IS
T?
Créer une Identifier Charger la -Tester Linérer
zone SQL l’ensmble ligne courante l’existence l’ ensemble
nommée actif de dans les de lignes actif
lignes variables - si OUI,
Retourner à FETCH
Ouvrir un Curseur
Syntaxe
OPEN
OPEN cursor_name;
cursor_name;
Ouvrir le curseur pour exécuter la requête et
identifier l’Ensemble de lignes actif.
Si la requête ne retourne pas de lignes,
aucune exception n’est signalée.
Utilisez les attributs du curseur pour tester le
résultat après affectation.
Ramener les données à
partir du Curseur
Syntaxe
FETCH
FETCHcursor_name
cursor_nameINTO
INTO[variable1,
[variable1,variable2,
variable2,…]
…]
| |record_name];
record_name];
Chargez les valeurs de la ligne courante dans
des variables de sortie.
Prévoir le même nombre de variables.
Ajuster la position des variables par rapport
aux colonnes.
Tester si le curseur contient des lignes.
Ramener les données à
partir du Curseur
Exemple: ramener les 10 premiers employés
DECLARE
DECLARE
v_empno
v_empnoemp.empno%TYPE;
emp.empno%TYPE;
v_ename
v_ename emp.ename%TYPE;
emp.ename%TYPE;
CURSOR
CURSORemp_cursor
emp_cursorIS
IS
SELECT empno,ename
SELECT empno,ename
FROM
FROM emp; emp;
BEGIN
BEGIN
OPEN
OPENemp_cursor;
emp_cursor;
FOR
FOR i i IN
IN 1..10
1..10 LOOP
LOOP
FETCH
FETCH emp_cursor
emp_cursor INTO
INTOv_empno,
v_empno,v_ename;
v_ename;
……
END
ENDLOOP;
LOOP;
END;
END;
Fermer un Curseur
Syntaxe
CLOSE
CLOSE cursor_name;
cursor_name;
END;
END;