Abdelkhalek Benhoumine
 Première partie
Introduction au langage PL/SQL
Les variables
Traitements conditionnels
Traitements répétitifs
Les curseurs
Gestion d’exceptions
Procédures, Fonctions
Deuxième partie
Triggers
PLAN DU COURS
• Le cadre ( Framework ) est une description non-technique de comment le document
est structuré
• Les fondements (Foundation) contient l'essentiel de SQL3 incluant les types de
données abstraits et le modèle objet-relationnel
• L'interface d'appel client (SQL/CLI) permet le dialogue client/serveur,
• Le langage des procédures stockées (SQL/PSM ) permet la spécification des
procédures stockées,
• L'intégration aux langages classiques (SQL/Bindings) reprend l' «embedded »
SQL-2 et l'étend à SQL3
• La gestion des transactions (SQL/XA ) est une spécification de l'interface pour
moniteur transactionnel distribué.
• La gestion du temps (SQL/Temporal ) définit le support du temps et les intervalles...
• L'accès aux données externes (SQL/MED) permet l'utilisation de SQL pour accèder à
ds données non SQL,
• L'intégration aux langages objets (SQL/OBJ ) définit l'utilisation de SQL depuis un
langage objet
2. INTRODUCTION AU LANGAGE PL/SQL
2.1. Le bloc PL/SQL
2.1,1. Structure d'un bloc
2.1.2. Exemple
Comparaison avec SQL
 SQL :
 langage non procédural
 PL/SQL :
 langage procédural, qui intègre des ordres SQL
 SELECT, INSERT, UPDATE, DELETE
 INSERT, UPDATE, DELETE
 gestion des transactions : COMMIT, ROLLBACK, SAVEPOINT
 langage à part entière comprenant
 Définition de variables, constantes, expressions, affectations
 Traitements conditionnels, répétitifs
 Traitement des curseurs (et de collections)
 Traitement des erreurs et d’exceptions
 Modularité (sous-programmes)
2.2. Structure d'un bloc
• Le bloc
* interprète un ensemble de commandes
* est composé de 3 sections :
DECLARE
déclaration variables, constantes,
exceptions et curseurs
BEGIN [nom-bloc]
instructions SQL et extensions
EXCEPTION
Traitement des exceptions
END ; ou END nombloc;
3. Les variables
3.1. Types de variables utilisées
3.2. Déclaration des variable
3.3. Initialisation et visibilité
3.2. Variables de type simple
• Exemple :
Declare
nom char (15) ;
salaire number (7, 2) ;
embauche DATE ; DD-MON-YY
réponse boolean ; valeur : TRUE, FALSE, NULL
2.2.2. Exemple : CONTRÔLE de STOCK
Accept nom-prod Prompt ‘ nom du produit désiré’
Declare
qte-stock number (5) ;
Begin
Select quantité into qte-stock From Stock
Where produit= '&nom-prod' ;
If qte-stock > 0
Then Update stock Set quantité = quantité - 1
Where produit = '&nom-prod' ;
Insert into Ventes Values (&nom-prod ||'VENDU');
Else Insert into Ventes
Values (&nom-prod || 'demandé');
end if;
commit;
end;
3.3. Exemple
Declare
nom_emp char (15) ;
salaire emp.sal%TYPE ;
commission emp.comm%TYPE ;
nom_départ char (15) ;
Begin
Select ename, sal, comm, dname
Into nom_emp, salaire, commission, nom_départ
Fom emp, dept
Where ename = 'MILLER' and
emp.deptno=dept.deptno;
...
End;
4. Traitements conditionnels
• Définition :
• exécution d'instructions suivant le résultat d'une condition
• Syntaxe :
If condition1 Then traitement1 ;
elsif condition2 then traitement2 ;
else traitement3 ;
end if;
• Opérateurs utilisés dans les conditions :
• ce sont les mêmes que dans SQL
5. Traitements répétitifs
• Définition :
• possibilité d'effectuer des traitements répétitifs : clause
LOOP
• Quatre types de boucles :
• la boucle de base
• la boucle FOR
• la boucle WHILE
• la boucle CURSOR ... FOR
5.2. La boucle de base
• syntaxe :
LOOP [label]
instructions ;
END LOOP [label] ;
• sortie de boucle :
EXIT [label] [WHEN condition]
5.3. La boucle FOR
• Syntaxe :
For indice In [Reverse] exp1 ... exp2 Loop
instructions ;
End Loop ;
5.4. La boucle while
• exécution tant que condition vérifiée
• Syntaxe :
While condition Loop
instructions ;
End loop ;
• exemple : reste de 7324 div 9
Declare
reste number := 7324 ;
Begin
While reste >= 9 loop
reste := reste - 9 ;
end loop ;
insert into resultat values (reste, 'Reste de la division');
End ;
5.4. La boucle while
6. Les curseurs
en PL/SQL
6.1. Définition et types
6.2. Etapes d'utilisation d'un curseur implicite
6.3. Attributs d'un curseur
6.4. Simplification d'écriture
6.2. Utilisation d'un curseur
explicite
• Les étapes De Déclaration : 4 étapes
6.2. Déclaration d'un curseur explicite
6.2. Ouverture d'un curseur explicite
l'ouverture se fait dans la section Begin
• syntaxe : OPEN nom_curseur;
6.2. Traitement des lignes
• Le Fetch ramène une ligne à la fois.
6.2. Exemple
6.2. Fermeture d'un curseur explicite
• Syntaxe :
CLOSE nom_curseur ;
• action : libère la place mémoire
6.2. Exemple
Declare
cursor dept_10 is
select ename, sal from emp
where deptno = 10 order by sal ;
nom emp.ename%TYPE ;
salaire emp.sal%TYPE ;
Begin
Open dept_10 ;
Loop
Fetch dept_10 into nom, salaire ;
If salaire > 2500
then insert into résultat values (nom,salaire);
end if;
exit when salaire = 5 000 ;
end loop ;
close dept_10 ;
End ;
6.3. Les attributs d'un curseur
• Définition : indicateurs sur l'état d'un curseur.
• %FOUND : dernière ligne traitée
• %NOTFOUND : id
• %ISOPEN : ouverture d'un curseur
• %ROWCOUNT : nombre de lignes déjà traitées
6.3.1. Attribut %FOUND
(resp. %NOTFOUND)
6.3.3. Attribut %ISOPEN
6.3.4. Attribut %ROWCOUNT
6.4. Simplification d'écriture
• déclaration de variables :
Declare
cursor nom_curseur is ordre_select ;
nom_struct nom_curseur%Rowtype ;
• éléments de la structure identifiés par :
nom_struct.nom_colonne
• structure renseignée par le Fetch :
Fetch nom_curseur into nom_struct ;
6.5. Curseur paramétré
• Objectif : réutiliser un même curseur avec des valeurs
différentes dans un même bloc PL/SQL
• Syntaxe :
Declare
cursor nom_curseur (par1 type, par2 type, ...) is
ordre_select
Begin
Open nom_curseur (val1, val2, ...) ;
6.6.La clause CURRENT OF
• Objectif :
• Accéder directement en modification ou en suppression à la
ligne ramenée par Fetch
• il faut verouiller les lignes lors de la déclaration du curseur (
... For Update of nom_col ...)
6.6. Exemple 1
Declare
Cursor c1 is
select ename, sal from emp
for update of sal ;
Begin
For c1_rec in c1
Loop If c1_rec.sal > 1 500
Then Insert into resultat
values (c1_rec.ename, c1_rec.sal * 1.3);
Update emp set sal = sal * 1.3
Where Current of c1 ; end if,
end loop ;
end;
7. Gestion des
erreurs
7.1. Section EXCEPTION
7.2. Anomalie progr. utilisateur
7.3. Erreur Oracle
7.1. Section Exception
• Notion d'exception : traitement d'erreurs
• Types d'erreurs :
• erreurs internes Oracle (Sqlcode <> 0)
• erreurs programme utilisateur
• Règles à respecter :
• définir et donner un nom à chaque erreur
• associer ce nom à la section Exception (partie declare)
• définir le traitement dans la partie Exception
7.2. Anomalies du programme
 Syntaxe :
Declare
nom_erreur exception ;
...
Begin
...
If (anomalie) then raise nom_erreur ;
...
Exception When nom_erreur then (traitement) ;
 Sortie du bloc après exécution du traitement
7.4. Diagnostic d’erreurs
• SQLCODE : renvoie le code de l'erreur courante (valeur
numérique)
• SQLERRM [(code_erreur)] :
• renvoie le libellé de l'erreur courante.
Declare
nom char (10) ;
code number ;
lg number ;
mess char (50) ;
Begin
Select ename into nom from emp
Where empno = 9999 ;
Exception
When others then code := sqlcode ;
mess := sqlerrm ; lg := length (mess) ;
Insert into resultat values (code, lg, mess) ;
Commit ;
End ;
7.4. Exemple
_ NO_DATA_FOUND
– TOO_MANY_ROWS
– INVALID_CURSOR
– ZERO_DIVIDE
– DUP_VAL_ON_INDEX
DECLARE
e_insert_excep EXCEPTION;
PRAGMA EXCEPTION_INIT(e_insert_excep, -01400);
BEGIN
//
// Traitement
//
EXCEPTION
WHEN e_insert_excep THEN
DBMS_OUTPUT.PUT_LINE('INSERT OPERATION FAILED');
DBMS_OUTPUT.PUT_LINE(SQLERRM);
END;
8. Sous-programmes
8.1. Déclaration
8.2. Les procédures
8.3. Les fonctions
8.4. Les packages
8.4. Exemple de package
package actions_emp is -- spécification
procedure offre_prime (id_emp number);
procedure embauche (id_emp number, nom char, ...);
procedure licencie (id_emp number);
END actions_emp;
package BODY actions_emp is
procedure offre_prime (id_emp number) IS ...
procedure embauche (id_emp number, nom char, ...) IS
Begin INSERT INTO emp (...)
End embauche;
procedure licencie (id_emp number) IS ...
END action_emp;
LE LANGAGE PL/SQL :
2° PARTIE
9. Déclencheurs
(Triggers)
9.1. Définition
9.2. Caractéristiques
9.3. Utilisations

cours Plsql _ abdelkhalek benhoumine

  • 1.
  • 3.
     Première partie Introductionau langage PL/SQL Les variables Traitements conditionnels Traitements répétitifs Les curseurs Gestion d’exceptions Procédures, Fonctions Deuxième partie Triggers PLAN DU COURS
  • 5.
    • Le cadre( Framework ) est une description non-technique de comment le document est structuré • Les fondements (Foundation) contient l'essentiel de SQL3 incluant les types de données abstraits et le modèle objet-relationnel • L'interface d'appel client (SQL/CLI) permet le dialogue client/serveur, • Le langage des procédures stockées (SQL/PSM ) permet la spécification des procédures stockées, • L'intégration aux langages classiques (SQL/Bindings) reprend l' «embedded » SQL-2 et l'étend à SQL3 • La gestion des transactions (SQL/XA ) est une spécification de l'interface pour moniteur transactionnel distribué. • La gestion du temps (SQL/Temporal ) définit le support du temps et les intervalles... • L'accès aux données externes (SQL/MED) permet l'utilisation de SQL pour accèder à ds données non SQL, • L'intégration aux langages objets (SQL/OBJ ) définit l'utilisation de SQL depuis un langage objet
  • 6.
    2. INTRODUCTION AULANGAGE PL/SQL 2.1. Le bloc PL/SQL 2.1,1. Structure d'un bloc 2.1.2. Exemple
  • 7.
    Comparaison avec SQL SQL :  langage non procédural  PL/SQL :  langage procédural, qui intègre des ordres SQL  SELECT, INSERT, UPDATE, DELETE  INSERT, UPDATE, DELETE  gestion des transactions : COMMIT, ROLLBACK, SAVEPOINT  langage à part entière comprenant  Définition de variables, constantes, expressions, affectations  Traitements conditionnels, répétitifs  Traitement des curseurs (et de collections)  Traitement des erreurs et d’exceptions  Modularité (sous-programmes)
  • 8.
    2.2. Structure d'unbloc • Le bloc * interprète un ensemble de commandes * est composé de 3 sections : DECLARE déclaration variables, constantes, exceptions et curseurs BEGIN [nom-bloc] instructions SQL et extensions EXCEPTION Traitement des exceptions END ; ou END nombloc;
  • 9.
    3. Les variables 3.1.Types de variables utilisées 3.2. Déclaration des variable 3.3. Initialisation et visibilité
  • 10.
    3.2. Variables detype simple • Exemple : Declare nom char (15) ; salaire number (7, 2) ; embauche DATE ; DD-MON-YY réponse boolean ; valeur : TRUE, FALSE, NULL
  • 11.
    2.2.2. Exemple :CONTRÔLE de STOCK Accept nom-prod Prompt ‘ nom du produit désiré’ Declare qte-stock number (5) ; Begin Select quantité into qte-stock From Stock Where produit= '&nom-prod' ; If qte-stock > 0 Then Update stock Set quantité = quantité - 1 Where produit = '&nom-prod' ; Insert into Ventes Values (&nom-prod ||'VENDU'); Else Insert into Ventes Values (&nom-prod || 'demandé'); end if; commit; end;
  • 12.
    3.3. Exemple Declare nom_emp char(15) ; salaire emp.sal%TYPE ; commission emp.comm%TYPE ; nom_départ char (15) ; Begin Select ename, sal, comm, dname Into nom_emp, salaire, commission, nom_départ Fom emp, dept Where ename = 'MILLER' and emp.deptno=dept.deptno; ... End;
  • 13.
    4. Traitements conditionnels •Définition : • exécution d'instructions suivant le résultat d'une condition • Syntaxe : If condition1 Then traitement1 ; elsif condition2 then traitement2 ; else traitement3 ; end if; • Opérateurs utilisés dans les conditions : • ce sont les mêmes que dans SQL
  • 14.
    5. Traitements répétitifs •Définition : • possibilité d'effectuer des traitements répétitifs : clause LOOP • Quatre types de boucles : • la boucle de base • la boucle FOR • la boucle WHILE • la boucle CURSOR ... FOR
  • 15.
    5.2. La bouclede base • syntaxe : LOOP [label] instructions ; END LOOP [label] ; • sortie de boucle : EXIT [label] [WHEN condition]
  • 16.
    5.3. La boucleFOR • Syntaxe : For indice In [Reverse] exp1 ... exp2 Loop instructions ; End Loop ;
  • 17.
    5.4. La bouclewhile • exécution tant que condition vérifiée • Syntaxe : While condition Loop instructions ; End loop ;
  • 18.
    • exemple :reste de 7324 div 9 Declare reste number := 7324 ; Begin While reste >= 9 loop reste := reste - 9 ; end loop ; insert into resultat values (reste, 'Reste de la division'); End ; 5.4. La boucle while
  • 19.
    6. Les curseurs enPL/SQL 6.1. Définition et types 6.2. Etapes d'utilisation d'un curseur implicite 6.3. Attributs d'un curseur 6.4. Simplification d'écriture
  • 20.
    6.2. Utilisation d'uncurseur explicite • Les étapes De Déclaration : 4 étapes
  • 21.
    6.2. Déclaration d'uncurseur explicite
  • 22.
    6.2. Ouverture d'uncurseur explicite l'ouverture se fait dans la section Begin • syntaxe : OPEN nom_curseur;
  • 23.
    6.2. Traitement deslignes • Le Fetch ramène une ligne à la fois.
  • 24.
  • 25.
    6.2. Fermeture d'uncurseur explicite • Syntaxe : CLOSE nom_curseur ; • action : libère la place mémoire
  • 26.
    6.2. Exemple Declare cursor dept_10is select ename, sal from emp where deptno = 10 order by sal ; nom emp.ename%TYPE ; salaire emp.sal%TYPE ; Begin Open dept_10 ; Loop Fetch dept_10 into nom, salaire ; If salaire > 2500 then insert into résultat values (nom,salaire); end if; exit when salaire = 5 000 ; end loop ; close dept_10 ; End ;
  • 27.
    6.3. Les attributsd'un curseur • Définition : indicateurs sur l'état d'un curseur. • %FOUND : dernière ligne traitée • %NOTFOUND : id • %ISOPEN : ouverture d'un curseur • %ROWCOUNT : nombre de lignes déjà traitées
  • 28.
  • 29.
  • 30.
  • 31.
    6.4. Simplification d'écriture •déclaration de variables : Declare cursor nom_curseur is ordre_select ; nom_struct nom_curseur%Rowtype ; • éléments de la structure identifiés par : nom_struct.nom_colonne • structure renseignée par le Fetch : Fetch nom_curseur into nom_struct ;
  • 32.
    6.5. Curseur paramétré •Objectif : réutiliser un même curseur avec des valeurs différentes dans un même bloc PL/SQL • Syntaxe : Declare cursor nom_curseur (par1 type, par2 type, ...) is ordre_select Begin Open nom_curseur (val1, val2, ...) ;
  • 33.
    6.6.La clause CURRENTOF • Objectif : • Accéder directement en modification ou en suppression à la ligne ramenée par Fetch • il faut verouiller les lignes lors de la déclaration du curseur ( ... For Update of nom_col ...)
  • 34.
    6.6. Exemple 1 Declare Cursorc1 is select ename, sal from emp for update of sal ; Begin For c1_rec in c1 Loop If c1_rec.sal > 1 500 Then Insert into resultat values (c1_rec.ename, c1_rec.sal * 1.3); Update emp set sal = sal * 1.3 Where Current of c1 ; end if, end loop ; end;
  • 35.
    7. Gestion des erreurs 7.1.Section EXCEPTION 7.2. Anomalie progr. utilisateur 7.3. Erreur Oracle
  • 36.
    7.1. Section Exception •Notion d'exception : traitement d'erreurs • Types d'erreurs : • erreurs internes Oracle (Sqlcode <> 0) • erreurs programme utilisateur • Règles à respecter : • définir et donner un nom à chaque erreur • associer ce nom à la section Exception (partie declare) • définir le traitement dans la partie Exception
  • 37.
    7.2. Anomalies duprogramme  Syntaxe : Declare nom_erreur exception ; ... Begin ... If (anomalie) then raise nom_erreur ; ... Exception When nom_erreur then (traitement) ;  Sortie du bloc après exécution du traitement
  • 38.
    7.4. Diagnostic d’erreurs •SQLCODE : renvoie le code de l'erreur courante (valeur numérique) • SQLERRM [(code_erreur)] : • renvoie le libellé de l'erreur courante.
  • 39.
    Declare nom char (10); code number ; lg number ; mess char (50) ; Begin Select ename into nom from emp Where empno = 9999 ; Exception When others then code := sqlcode ; mess := sqlerrm ; lg := length (mess) ; Insert into resultat values (code, lg, mess) ; Commit ; End ; 7.4. Exemple
  • 40.
    _ NO_DATA_FOUND – TOO_MANY_ROWS –INVALID_CURSOR – ZERO_DIVIDE – DUP_VAL_ON_INDEX
  • 41.
    DECLARE e_insert_excep EXCEPTION; PRAGMA EXCEPTION_INIT(e_insert_excep,-01400); BEGIN // // Traitement // EXCEPTION WHEN e_insert_excep THEN DBMS_OUTPUT.PUT_LINE('INSERT OPERATION FAILED'); DBMS_OUTPUT.PUT_LINE(SQLERRM); END;
  • 42.
    8. Sous-programmes 8.1. Déclaration 8.2.Les procédures 8.3. Les fonctions 8.4. Les packages
  • 43.
    8.4. Exemple depackage package actions_emp is -- spécification procedure offre_prime (id_emp number); procedure embauche (id_emp number, nom char, ...); procedure licencie (id_emp number); END actions_emp; package BODY actions_emp is procedure offre_prime (id_emp number) IS ... procedure embauche (id_emp number, nom char, ...) IS Begin INSERT INTO emp (...) End embauche; procedure licencie (id_emp number) IS ... END action_emp;
  • 44.
    LE LANGAGE PL/SQL: 2° PARTIE
  • 45.
    9. Déclencheurs (Triggers) 9.1. Définition 9.2.Caractéristiques 9.3. Utilisations