3. 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
4.
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 AU LANGAGE 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'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;
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 de type 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 boucle de base
• syntaxe :
LOOP [label]
instructions ;
END LOOP [label] ;
• sortie de boucle :
EXIT [label] [WHEN condition]
16. 5.3. La boucle FOR
• Syntaxe :
For indice In [Reverse] exp1 ... exp2 Loop
instructions ;
End Loop ;
17. 5.4. La boucle while
• 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
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
25. 6.2. Fermeture d'un curseur explicite
• Syntaxe :
CLOSE nom_curseur ;
• action : libère la place mémoire
26. 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 ;
27. 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
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 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 ...)
34. 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;
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 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
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
43. 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;