Upload
az-za
View
124
Download
0
Embed Size (px)
Citation preview
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.
Declarer des variables
Structure d’un bloc
PL/SQL
DECLARE -Optionnel
–Variables, curseurs, exceptions définies par l’utilisateur.
• BEGIN -Obligatoire
–Insructions SQL
–Instuctions PL/SQL
•EXCEPTION -Optionnel
–Actions à réaliser lorsqu’une erreur se produit
•END; -Obligatoire
Structure d’un bloc
PL/SQL
DECLARE
v_variable VARCHAR2(5);
BEGIN
SELECT nom_colonne
INTO v_variable
FROM nom_table;
•EXCEPTION -Optionnel
WHEN nom_exception THEN
…
•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
Exemples
Identifiant [CONSTANT] datatype [NOT NULL]
[:= | DEFAULT expr];
Declare
v_hiredate DATE;
v_deptno NUMBER(2) NOT NULL:=10;
v_location VARCHAR2(13) := ‘Atlanta’;
c_comm CONSTANT 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 VARCHAR2(9);
v_count BINARY_INTEGER := 0;
v_total_sal NUMBER(9,2) :=0;
V_orderdate DATE := SYSDATE +7;
C_tax_rate CONSTANT NUMBER(3,2) := 8.25;
V_valid BOOLEAN NOT NULL := TRUE;
L’Attribut %TYPE
Déclarer une variable à partir de :
La définition d’une colonne de la base de données
La définition d’une variable précédemment déclarée
Préfixer %TYPE avec :
La table et la colonne de la base
Le nom de la variable précédemment déclarée
Déclarer des Variables
avec l’Attribut %TYPE
Exemples
…
v_name emp.ename%TYPE;
v_balance NUMBER(7,2);
v_min_balance v_balance%TYPE := 10;
…
Référencer des Variables
non-PL/SQL
Stocker le salaire mensuel dans une
variable hôte SQL*Plus
Référencer les variables non-PL/SQL
en tant que variables hôtes.
Préfixer les références de deux points
(:).
:g_monthly_sal := v_sal / 12;
VARIABLE g_monthly_sal NUMBER;
ACCEPT p_annual_sal PROMPT ‘Entrer le salaire annuel : ‘
DECLARE
v_sal NUMBER(9,2) := &p_annual_sal;
BEGIN
:g_monthly_sal := v_sal / 12;
END;
/
PRINT g_monthly_sal
Exemple: calculer le salaire mensuel, basé sur le
salaire annuel fourni par l’utilisateur.
Opérateurs en PL/SQL
Logiques
Arithmétiques
Concaténation Identiques à
Parenthèses pour ceux de SQL contrôler l’ordre des opérations
Opérateur exponentiel (**)
Opérateurs en PL/SQL
Incrementer l’index pour une boucle.
Définir la valeur d’un indicateur
booléen.
Valider le numéro d’un employé s’il
contient une valeur
V_count := v_count + 1;
V_equal := (v_n1 = v_n2);
V_valid := (v_empno IS NOT NULL);
Instructions SQL en
PL/SQL Extraire une ligne de la base de données grâce à la commande SELECT.Un seul jeu de valeurs peut être retourné.
Modifier des lignes dans la base en utilisant des commandes LMD.
Contrôler une transaction avec les commandes COMMIT, ROLLBACK
Déterminer l’issue d’une commande LMD avec des curseurs implicites.
Instructions SELECT en
PL/SQL
Extraire une ligne de la base de données
avec select
Syntaxe
SELECT select_list
INTO { variable_name [, variable_name] …
| record_name}
FROM table
WHERE condition;
Instructions SELECT en
PL/SQL
La clause INTO est obligatoire
Exemple
DECLARE
v_deptno NUMBER(2);
v_loc VARCHAR2(15);
BEGIN
SELECT deptno, loc
INTO v_deptno, v_loc
FROM dept
WHERE dname = ‘SALES’;
…
END;
Extraire des données en
PL/SQL
Extraire la date de commande et la date
d’expédition pour la commande spécifiée.
DECLARE
v_orderdate ord.orderdate%TYPE;
v_shipdate ord.shipdate%TYPE;
BEGIN
SELECT orderdate, shipdate
INTO v_orderdate v_shipdate
FROM ord
WHERE id = 620;
…
END;
Extraire des données en
PL/SQL
Retourner la somme des salaires de
tous les employés du service spécifié.
DECLARE
v_sum_sal emp.sal%TYPE;
v_deptno NUMBER NOT NULL := 10;
BEGIN
SELECT SUM(SAL) -- group function
INTO v_sum_sal
FROM emp
WHERE deptno = v_deptno;
…
END;
Manipuler des données en
PL/SQL
Modifier le contenu des tables de la
base de données à l’aide des
commandes LMD suivantes:
INSERT
UPDATE
DELETE
Insérer des données
Ajouter les informations concernant un
nouvel employé à la table emp.
Exemple
BEGIN
INSERT INTO emp(empno, ename, job, deptno)
VALUES (50,’HARDING’, ‘CLERK’, 10);
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
v_sal_increase emp.sal%TYPE := 2000;
BEGIN
UPDATE emp
SET sal = sal + v_sal_increase
WHERE job = ‘ANALYST’;
END;
Supprimer des données
Supprimer les enregistrements dont le
département est le 10 dans la table
emp.
Exemple
DECLARE
v_deptno emp.deptno%TYPE := 10;
BEGIN
DELETE FROM emp
WHERE deptno = v_ deptno;
END;
Instructions
COMMIT et ROLLBACK
Une transaction est initialisée par la
première commande LMD, et doit être
suivi d’un COMMIT ou d’un
ROLLBACK.
Utilisez les instructions SQL COMMIT
ou ROLLBACK pour terminer de façon
explicite une transaction.
Structures de Contrôle
Le processus
d’exécution PL/SQL
Vous pouvez modifier l’enchaînement logique des instructions en utilisant des instructions conditionnelles IF ou des structures de boucles.
Instructions conditionnelles IF:
IF-THEN-END-IF
IF-THEN-ELSE-END-IF
IF-THEN-ELSIF-END-IF
Instructions IF
Syntaxe
Instruction IF simple: Si le nom de l’employé est Osborne, lui associer le numéro
de manager 22.
IF condition THEN instructions;
[ELSIF condition THEN instructions;]
[ELSE instructions;]
END IF;
IF v_ename = ‘OSBORNE’ THEN
v_mgr := 22;
END IF;
Contrôles Itératifs:
instructions LOOP
Les boucles permettent de réaliser
plusieurs fois une instruction ou une
séquence d’instructions.
Il y a trois types de boucles :
La boucle Basique
La boucle FOR
La boucle WHILE
Boucles Basiques
Syntaxe
LOOP
instruction1;
. . .
EXIT [WHEN condition];
END LOOP;
Où : condition est une variable booléenne ou une expression
Boucles Basiques
Exemple
DECLARE
v_ordid item.ordid.%TYPE := 601;
v_counter NUMBER(2) := 1;
BEGIN
LOOP
INSERT INTO item(ordid, itemid)
VALUES (v_ordid, v_counter);
v_counter := v_counter + 1;
EXIT WHEN v_counter > 10;
END LOOP;
END;
Boucles FOR
Syntaxe
Le compteur est déclaré implicitement
FOR counter in [REVERSE]
borne_inférieure..borne_supérieure LOOP
instruction1;
instruction2;
. . .
END LOOP;
Boucles WHILE
Syntaxe
WHILE condition LOOP
instruction1;
instruction2;
. . .
END 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
Où field_declaration est
TYPE type_nom IS RECORD
(field_declaration [, field_declaration]…);
Identifier type_name;
Field_name {field_type | variable%TYPE
| table.column%TYPE | table%ROWTYPE}
[[NOT NULL] {:= | DEFAULT} expr]
Créer un Record PL/SQL
Exemple
…
TYPE emp_record_type IS RECORD
(ename VARCHAR2(10) ,
job VARCHAR2(9),
sal NUMBER(7,2));
emp_record 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
emp_record 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 SMITH CLERK
7566 JONES MANAGER
7788 SCOTT ANALYST
7876 ADAMS CLERK
7902 FORD ANALYST
Curseur
Ensemble actif de lignes
(Active Set)
Ligne
courante
Contrôler les Curseurs
Explicites
DECLARE OPEN FETCH CLOSE
oui
non
Créer une Identifier Charger la -Tester Libé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
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.
OPEN cursor_name;
Ramener les données à
partir du Curseur
Syntaxe
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.
FETCH cursor_name INTO [variable1, variable2, …]
| record_name];
Ramener les données à
partir du Curseur
Exemple: ramener les 10 premiers employés
DECLARE
v_empno emp.empno%TYPE;
v_ename emp.ename%TYPE;
CURSOR emp_cursor IS
SELECT empno,ename
FROM emp;
BEGIN
OPEN emp_cursor;
FOR i IN 1..10 LOOP
FETCH emp_cursor INTO v_empno, v_ename;
…
END LOOP;
END;
Fermer un Curseur
Syntaxe
Fermer le curseur après avoir terminé le
traitement des lignes.
N’essayer pas de ramener les données
d’un curseur s’il a été fermé.
CLOSE cursor_name;
Attributs d’un curseur SQL
Grâce aux attributs d’un curseur SQL, vous
pouvez tester l’issue de vos instructions SQL.
SQL%ROWCOUNT Nombre d’enregistrements traités
par la dernière instruction SQL
(une valeur entière)
SQL%FOUND Attribut booléen qui vaut TRUE si
la dernière instruction SQL a
traité un ou plusieurs
enregistrements
SQL%NOTFOUND Attribut booléen qui vaut TRUE si
la dernière instruction SQL n’ a
traité aucun enregistrements
SQL%ISOPEN Vaut toujours FALSE car PL/SQL
ferme les curseurs implicites
immédiatement après leur
exécution
Attributs d’un curseur
SQL Exemple : ramener les 10 premiers employés
DECLARE
v_empno emp.empno%TYPE;
v_ename emp.ename%TYPE;
CURSOR emp_cursor IS
SELECT empno,ename
FROM emp;
BEGIN
OPEN emp_cursor;
FOR i IN 1..10 LOOP
FETCH emp_cursor INTO v_empno, v_ename;
EXIT WHEN emp_cursor%ROWCOUNT > 10
OR emp_cursor%NOTFOUND;
…
END LOOP;
CLOSE emp_cursor;
END;
Curseurs et Records
Traiter les lignes de l’ensemble actif en
ramenant les valeurs dans un RECORD
PL/SQL
DECLARE
CURSOR emp_cursor IS
SELECT empno,ename
FROM emp;
emp_recored emp_cursor%ROWTYPE;
BEGIN
OPEN emp_cursor;
LOOP
FETCH emp_cursor INTO emp_record;
…
END LOOP.
END;
Curseur dans une boucle
FOR
Syntaxe
Simplification d’écriture pour les curseurs implicites.
Ouverture, fetch et fermeture implicite du curseur.
Le record est déclaré implicitement.
FOR record_name IN cursor_name LOOP
statement1;
statement2;
. . .
END LOOP;
Curseur dans une boucle
FOR
Exemple : ramener tous employés un à
un
DECLARE
CURSOR emp_cursor IS
SELECT empno,ename
FROM emp;
BEGIN
FOR emp_record IN emp_cursor LOOP
IF ………. …
…..
END LOOP;
END;