3. Introduction
• Ces objets sont stockés une seule fois
dans la base
• Ils sont partageables et gérées par
plusieurs applications de façon
centralisée
• Ils sont soumis à tous les mécanismes
de sécurité et de confidentialité
10/12/13
Page 3
4. Introduction
• Pour créer un objet procédural, il faut
posséder les privilèges
– CREATE PROCEDURE (création locale)
– CREATE ANY PROCEDURE (création dans
d'autres schémas)
10/12/13
Page 4
5. Introduction
• Pour exécuter un objet procédural, il faut
posséder les privilèges
– EXECUTE PROCEDURE (exécution locale)
– EXECUTE ANY PROCEDURE (exécution
dans d'autres schémas)
• Pour donner à un autre utilisateur le droit
d'exécution
– GRANT EXECUTE ON ma_procédure TO autre_utilisateur
10/12/13
Page 5
6. Procédure
• Est un bloc PL/SQL nommé pouvant contenir
–
–
–
–
–
•
•
•
•
Des commandes SQL (LMD)
Des instructions PL/SQL
Des variables et des constantes
Des curseurs
Un gestionnaire d'erreurs
Peut être paramétrée et exécutée
Utilisée pour réaliser une (ou plusieurs) action(s)
Peut être récursif et surchargé
Est compilé avant le stockage
– Ne nécessite plus d'analyse ni de compilation à l'exécution
– Sa mise en mémoire permettra d'améliorer les performances
10/12/13
Page 6
7. Procédure
• Concernant la sécurité
– On peut autoriser l'accès à certaines tables
uniquement à travers des procédures sans
avoir des droits d'accès aux tables en
dehors des procédures
10/12/13
Page 7
8. Procédure
• Concernant l'intégrité
– Les procédures assurent la même
fonctionnalité indépendamment de la partie
appelante
– La recompilation d'une procédure en cas de
modification n'exige pas la recompilation de
l'ensemble du code de l'application
10/12/13
Page 8
9. Procédure
• Concernant les performances
– Réduction du trafic sur le réseau par la soumission
d'un bloc PL/SQL au lieu de plusieurs commandes
SQL
– Compilation des procédures cataloguées (le moteur
ne recompile pas les procédures au moment de
l'exécution
– Exécution immédiate de la procédure si elle est
dans la SGA (pas d'accès disque)
– Partage de l'exécution d'une procédure par
plusieurs utilisateurs (notion de mémoire partagée)
10/12/13
Page 9
10. Procédure
• Structure générale
PROCEDURE nom_procédure [(paramètres, …)] {IS | AS}
Déclaration des variables locales
BEGIN
Instructions SQL et PL/SQL
EXCEPTION
Traitement des exceptions
END [nom_procédure];
10/12/13
Page 10
11. Procédure
• Création
CREATE [OR REPLACE] PROCEDURE [schéma.]nom_procédure
[(paramètres, …)] {IS | AS}
Déclaration des variables locales
BEGIN
Instructions SQL et PL/SQL
EXCEPTION
Traitement des exceptions
END [nom_procédure];
Nomparametre [ IN | OUT | IN OUT] type [{:=default}]
10/12/13
Page 11
IN: variable passée en entrée (Par défaut)
OUT : variable renseignée par la procédure puis envoyée à l'appelant
IN OUT : passage par référence
Le type ne doit pas contenir d'indication sur sa taille
12. Procédure
• Exemple : Augmentation de salaire
10/12/13
Page 12
CREATE OR REPLACE PROCEDURE Augmentation_salaire
(NumSal integer, Montant Real) IS
SalaireActuel Real;
SalaireNull Exception;
BEGIN
SELECT sal into SalaireActuel FROM emp where empno = NumSal;
IF (SalaireActuel IS NULL) THEN
RAISE SalaireNull;
ELSE UPDATE emp set sal = sal + Montant Where empno = NumSal;
END IF;
EXCEPTION
WHEN no_data_found THEN
dbms_output.put_line(NumSal || 'Est inconnu');
WHEN SalaireNull THEN
dbms_output.put_line(NumSal || 'a un Salaire Null');
END Augmentation_Salaire;
/
13. Procédure
• Exécution de la procédure
AugmentationSalaire
BEGIN
A partir d'une autre procédure …
AugmentationSalaire (100, 1000);
…
A partir de SQL*Plus
10/12/13
Page 13
SQL> EXECUTE AugmentationSalaire (100, 1000);
14. Procédure
• Mais PL/SQL exige la déclaration d'une
procédure avant de l'utiliser
DECLARE
PROCEDURE AccorderAugmentation (. . .) IS
BEGIN
AugmentationSalaire (. . .); -- non déclarée
END;
PROCEDURE AugmentationSalaire (. . .) IS
BEGIN
...
END;
...
10/12/13
Page 14
15. Procédure
• Mais PL/SQL exige la déclaration d'une
procédure avant de l'utiliser
Solution 1
DECLARE
PROCEDURE AugmentationSalaire (. . .) IS
BEGIN
...
END;
PROCEDURE AccorderAugmentation (. . .) IS
BEGIN
AugmentationSalaire (. . .); -- déjà déclarée
END;
...
10/12/13
Page 15
16. Procédure
• Mais PL/SQL exige la déclaration d'une
procédure avant de l'utiliser
Solution 2
DECLARE
PROCEDURE AugmentationSalaire (…); --forward declaration
PROCEDURE AccorderAugmentation (. . .) IS
BEGIN
AugmentationSalaire (. . .); -- déjà déclarée
END;
PROCEDURE AugmentationSalaire (. . .) IS
BEGIN
...
END;
...
10/12/13
Page 16
17. Procédure
• Surcharge ou overloading
– Possible dans un bloc ou un package
– Pas possible si seulement les noms des
paramètres ou leur mode de passage sont
différents
DECLARE
….
PROCEDURE Augmentation_salaire (NumSal integer, Montant Real) IS
…
END Augmentation_Salaire;
PROCEDURE Augmentation_salaire (Montant Real) IS
…
END Augmentation_Salaire;
/
10/12/13
Page 17
18. Procédure
• Modification d'une procédure
– Après n'importe quelle modification dans
une procédure, on est obligé de recompiler
avec
SQL> ALTER PROCEDURE [Schéma.]nom_procédure COMPILE;
• Exemple
SQL> ALTER PROCEDURE AugmentationSalaire COMPILE;
10/12/13
Page 18
20. Procédure
• Exemple
CREATE PROCEDURE suppression_Salarié (num_emp number) AS
BEGIN
DELETE FROM emp WHER empno = num_emp;
END
/
Quelles sont les erreurs identifiées ?
SQL> SHOW ERRORS
ERRO….
10/12/13
Page 20
21. Procédure
• Exemple
CREATE PROCEDURE suppression_Salarié (num_emp number) AS
BEGIN
DELETE FROM emp WHER empno = num_emp;
END
/
Quelles sont les erreurs identifiées ?
– On peut également interroger
• USER_ERRORS, ALL_ERRORS,
DBA_ERRORS
10/12/13
Page 21
22. Procédure
• Les sources de vos procédures sont
stockées dans
– USER_SOURCE
– ALL_SOURCE
– DBA_SOURCE
10/12/13
Page 22
23. Procédure externe
• A partir de la version 8i, on peut intégrer
des procédures écrites dans d'autres
langages (Java, C, Pascal, etc.)
10/12/13
Page 23
24. Fonction
• Est une procédure qui renvoie une valeur
• Possède dans sa structure la clause
supplémentaire RETURN
• Peut être utilisée dans les requêtes SQL
FUNCTION nom_fonction [(paramètres, …)] RETURN type {IS | AS}
Déclaration des variables locales
BEGIN
Instructions SQL et PL/SQL
RETURN (valeur);
EXCEPTION
Traitement des exceptions
END [nom_fonction];
10/12/13
Page 24
Nomparamètre [IN] type [, nomparamètre2 [IN] type …
Où type ne doit pas contenir d'indication sur la taille
25. Fonction
• Création d'une fonction stockée
CREATE [OR REPLACE] FUNCTION [schéma.]nom_fonction
[(paramètres, …)] RETURN type {IS | AS}
Déclaration des variables locales
BEGIN
Instructions SQL et PL/SQL
RETURN (Valeur);
EXCEPTION
Traitement des exceptions
END [nom_fonction];
10/12/13
Page 25
26. Fonction
• Exemple d'une fonction
VérificationSalaire
CREATE or replace FUNCTION VérificationSalaire (NumGrade integer, Montant Real)
RETURN boolean AS
MinSalaire Real;
MaxSalaire Real;
BEGIN
SELECT losal, hisal INTO MinSalaire, MaxSalaire
FROM salgrade WHERE grade = NumGrade;
RETURN ((Montant >= MinSalaire) AND (Montant <= MaxSalaire));
END VérificationSalaire;
/
10/12/13
Page 26
27. Fonction
• Exécution de la fonction
VérificationSalaire
A partir d'une autre procédure
A partir de SQL*Plus
10/12/13
Page 27
BEGIN
…
IF VérificationSalaire (100, 1000) THEN
…
SQL> select VérificationSalaire (100, 1000) FROM Dual;
29. Fonction
• Surcharge ou overloading
– Pas possible si seul le type retourné est
différent
10/12/13
Page 29
30. Package
• Permet d'encapsuler dans une unité de la
BDD plusieurs
– Procédures, fonctions, curseurs et variables
• Ne peut pas être appelé, paramétré, ou
imbriqué
• Apporte plusieurs avantages
– Meilleure gestion de privilèges
– Meilleur moyen de structuration et de d'organisation
– Meilleures performances
• Le moteur charge au noyau le package entier
10/12/13
Page 30
31. Package
• Se compose de deux parties
Spécification
Application
Corps
10/12/13
Page 31
BDD Oracle
32. Package
• Création d'un Package
– Création des spécifications
• Consiste à déclarer les procédures, fonctions, constates,
variables, et les exceptions accessibles par le public
autorisé
– Création du corps
• Consiste à définir les procédures, fonctions, constates,
variables, et les exceptions déclarées dans la section
spécifications du package
• Peut contenir également d'autres objets (privés) non
déclarés dans la spécification qui seront inaccessibles en
dehors du corps du package
• Toute l'implémentation est cachée aux applications
10/12/13
Page 32
33. Package
• Création d'un Package
– Création de la section spécification
CREATE [OR REPLACE] PACKAGE [Schéma.]nom_package {IS |AS}
Déclatation des variables globales
Interface des sous-programmes
END [nom_package];
10/12/13
Page 33
34. Package
• Création d'un Package
– Création du corps
CREATE [OR REPLACE] PACKAGE BODY [Schéma.]nom_package {IS |AS}
Déclaration des variables locales
corps des sous-programmes publics et privés
BEGIN
….
END [nom_package];
10/12/13
Page 34
35. Package
• Exemple
CREATE OR REPLACE PACKAGE Gestion_Salarié IS
FUNCTION Embaucher (nom VARCHAR2, fonction VARCHAR2, Chef NUMBER,
eentrée DATE, salaire NUMBER, commission NUMBER, NuméroDept NUMBER)
RETURN NUMBER;
PROCEDURE Suppression_Salarié (NuméroSalarié NUMBER);
PROCEDURE Augmentation_Salaire (NumSal NUMBER, Montant REAL);
END Gestion_Salarié ;
10/12/13
Page 35
36. Package
• Exemple
CREATE OR REPLACE PACKAGE BODY Gestion_Salarié IS
FUNCTION Embaucher (nom VARCHAR2, fonction VARCHAR2, Chef NUMBER, dateentrée DATE, salaire NUMBER,
commission NUMBER, NuméroDept NUMBER) RETURN NUMBER
IS
Nouveau NUMBER(8);
BEGIN
SELECT MAX(empno)+1 INTO Nouveau FROM emp;
INSERT INTO emp VALUES (Nouveau, nom, fonction, chef, dateentrée, salaire, commission, NuméroDept);
RETURN (Nouveau);
END Embaucher;
PROCEDURE Suppression_Salarié (NuméroSalarié NUMBER);
…
END Suppression_Salarié;
PROCEDURE Augmentation_Salaire (NumSal NUMBER, Montant REAL);
…
END Augmentation_Salaire;
END Gestion_Salarié ;
10/12/13
Page 36
37. Package
• Appel d'une procédure ou fonction packagée
A partir de SQL*Plus
SQL> EXECUTE Nompackage.nom_procédure [(paramètre)];
A partir d'une autre procédure
10/12/13
Page 37
BEGIN
…
Nompackage.nomprocédure [(paramètres)];
…