PL/SQL
M.M.Gammoudi
Professeur
ISAMM Manouba
E-mail: mohamed.gammoudi@fst.rnu.tn
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;

Plsql

  • 1.
  • 2.
    Avantages du PL/SQL Portabilité Déclarationdes variables Programmer avec des structures de contrôle des langages procéduraux (traitement conditionnel, traitement répétitif, …) Gestion des erreurs.
  • 3.
  • 4.
    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
  • 5.
    Structure d’un bloc PL/SQL DECLARE v_variableVARCHAR2(5); BEGIN SELECT nom_colonne INTO v_variable FROM nom_table; •EXCEPTION -Optionnel WHEN nom_exception THEN … •END;
  • 6.
    Utilisation des Variables Onutilise les variables pour : Le stockage temporaire de données La manipulation de valeurs stockées La possibilité de réutilisation Une maintenance plus facile
  • 7.
    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:
  • 8.
    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.
  • 9.
    Types de données Scalaires VARCHAR2(maximum_length) NUMBER DATE CHAR [(maximum_length)] LONG BOOLEAN BINARY_INTEGER
  • 10.
    Déclaration des Variables Scalaires Exemples v_jobVARCHAR2(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;
  • 11.
    L’Attribut %TYPE Déclarer unevariable à 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
  • 12.
    Déclarer des Variables avecl’Attribut %TYPE Exemples … v_name emp.ename%TYPE; v_balance NUMBER(7,2); v_min_balance v_balance%TYPE := 10; …
  • 13.
    Référencer des Variables non-PL/SQL Stockerle 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;
  • 14.
    VARIABLE g_monthly_sal NUMBER; ACCEPTp_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.
  • 15.
    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 (**)
  • 16.
    Opérateurs en PL/SQL Incrementerl’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);
  • 17.
    Instructions SQL en PL/SQL Extraireune 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.
  • 18.
    Instructions SELECT en PL/SQL Extraireune ligne de la base de données avec select Syntaxe SELECT select_list INTO { variable_name [, variable_name] … | record_name} FROM table WHERE condition;
  • 19.
    Instructions SELECT en PL/SQL Laclause 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;
  • 20.
    Extraire des donnéesen 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;
  • 21.
    Extraire des donnéesen 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;
  • 22.
    Manipuler des donnéesen PL/SQL Modifier le contenu des tables de la base de données à l’aide des commandes LMD suivantes: INSERT UPDATE DELETE
  • 23.
    Insérer des données Ajouterles informations concernant un nouvel employé à la table emp. Exemple BEGIN INSERT INTO emp(empno, ename, job, deptno) VALUES (50,’HARDING’, ‘CLERK’, 10); End;
  • 24.
    Mettre à jourdes 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;
  • 25.
    Supprimer des données Supprimerles 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;
  • 26.
    Instructions COMMIT et ROLLBACK Unetransaction 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.
  • 27.
  • 28.
    Le processus d’exécution PL/SQL Vouspouvez 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
  • 29.
    Instructions IF Syntaxe Instruction IFsimple: 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;
  • 30.
    Contrôles Itératifs: instructions LOOP Lesboucles 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
  • 31.
    Boucles Basiques Syntaxe LOOP instruction1; . .. EXIT [WHEN condition]; END LOOP; Où : condition est une variable booléenne ou une expression
  • 32.
    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;
  • 33.
    Boucles FOR Syntaxe Le compteurest déclaré implicitement FOR counter in [REVERSE] borne_inférieure..borne_supérieure LOOP instruction1; instruction2; . . . END LOOP;
  • 34.
    Boucles WHILE Syntaxe WHILE conditionLOOP instruction1; instruction2; . . . END LOOP;
  • 35.
    Travailler avec des typesde données Composés
  • 36.
    PL/SQL Records Ils sontcomposé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.
  • 37.
    Créer un RecordPL/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]
  • 38.
    Créer un RecordPL/SQL Exemple … TYPE emp_record_type IS RECORD (ename VARCHAR2(10) , job VARCHAR2(9), sal NUMBER(7,2)); emp_record emp_record_type; …
  • 39.
    L’attribut %ROWTYPE Il permetde 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;
  • 40.
  • 41.
    A propos desCurseurs 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.
  • 42.
    Fonctionnement des curseurs Explicites 7369SMITH CLERK 7566 JONES MANAGER 7788 SCOTT ANALYST 7876 ADAMS CLERK 7902 FORD ANALYST Curseur Ensemble actif de lignes (Active Set) Ligne courante
  • 43.
    Contrôler les Curseurs Explicites DECLAREOPEN 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
  • 44.
    Ouvrir un Curseur Syntaxe Ouvrirle 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;
  • 45.
    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];
  • 46.
    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;
  • 47.
    Fermer un Curseur Syntaxe Fermerle 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;
  • 48.
    Attributs d’un curseurSQL 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
  • 49.
    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;
  • 50.
    Curseurs et Records Traiterles 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;
  • 51.
    Curseur dans uneboucle 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;
  • 52.
    Curseur dans uneboucle 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;