Académique Documents
Professionnel Documents
Culture Documents
1
Procédure
2
Syntaxe de Procédure
Remarque
-Le mode in est le mode par défaut.
4 4
Syntaxe Procédure
de PL/SQL(suite)
– Liste_variables_constantes :
définit les variables et les constantes locales de la
procédure.
– Liste_instructions:
Liste des instructions de la procédure
5 5
Procédure (exemple )
Declare
nemp integer ;
Procedure augment_salaire(num_emp in int) is
Begin
Update emp
Set salaire = salaire *1.1
Where nemp=num_emp;
commit;
End augment_salaire;
Begin -- bloc anonyme
nemp:=10;
augment_salaire(nemp) ;
End ;
6 6
Syntaxe de PL/SQL:Fonction
Declare
Function nom_fonction [(liste_paramètres)] return type is
[liste_variables_constantes]
begin
liste_instructions ;
return valeur_retour ;
end [nom_fonction] ;
7 7
Fonction (exemple)
Declare
num_serv integer;
Function service_salaire(num_service in integer)
return number is
Total_salaire number ;
Begin
select sum(salaire) into Total_salaire
From emp
Where nserv=num_service;
Return Total_salaire;
End service_salaire;
Begin --bloc anonyme
num_serv :=10;
dbms_output.put_line(service_salaire(num_serv));
End; 8 8
Bloc anonyme
9
Syntaxe de PL/SQL
§ Bloc anonyme
Syntaxe
Declare
Liste_variables_constantes_procedures_fonctions ;
Begin
Liste_instructions ;
End ;
10 10
Bloc anonyme (exemple)
Declare
max constant int :=10 ;
procedure modif_salaire is
begin
update emp
set salaire =salaire*1.1
where nemp between 1 and max ;
commit;
end;
begin
modif_salaire;
end;
11 11
§ Procédure stockée(cataloguée)
Syntaxe de création
Create [or replace] procedure nomProcedure(…)
is|as
déclarations
begin
…
end;
/
Drop procedure nomProcedure;
Syntaxe
create [or replace] function nomFonction(…) return
type
is|as
…
13 13
On appelle « fonctions » ou « procédures cataloguées »
(ou stockées), car ils sont compilés et résident dans la
base de données.
14
Avantages Procédure stockées
- Alléger les échanges entre client et serveur de la BD,
en stockant au niveau du serveur les procédures
régulièrement utilisées
16 16
§ Fonction stockée(exemple )
Create Function somSal(pserv number) return number
is
sal number;
Begin
Select sum(salaire) into sal from emp
Where nserv=pserv;
return sal;
End;
17 17
Procédure : description
18 18
Les Procédures
Application : à tester
Exemple 1 :
create or replace procedure listTypeJob(vjob IN varchar2, result OUT
number) IS
BEGIN
SELECT count(*) INTO result FROM emp where job=vjob;
END;
/
19
Procédure : récupération des résultats sous
Appel sous SQL*PLUS
SQL*PLUS
Déclarer la variable
Exécuter la procédure
Visualiser le résultat
20
Procédure : Appel dans un bloc PL/SQL
Exemple 2:
SET SERVEROUT ON
DECLARE
result NUMBER;
vjob emp.job%TYPE;
BEGIN
vjob:=‘MANAGER’;
listTypeJob(vjob,result);
DBMS_OUTPUT.PUT_LINE(‘nbre :’|| result);
END;
/
21
Procédure : Appel dans un bloc PL/SQL
22
L’appel d’une procédure stockée peut être réalisé :
● sous l’interface de commande SQL*Plus (top level) ;
● à partir d’une commande SQL (SELECT, INSERT,
UPDATE ou DELETE) ;
● à partir d’un programme PL/SQL (bloc, fonction ou
procédure) ;
● à partir d’un déclencheur.
23
Il est aussi possible d’appeler une procédure stockée
dans une insertion, une modification ou une
suppression.
24
Fonction
25
Créer une fonction qui augmente le salaire (à l affichage), en lui passan
num employe + l augmentation et retourne nv salaire)
create or replace function AugSal(vempno emp.empno%type,
vporcent NUMBER) return number
IS
vsal emp.sal%type;
BEGIN
SELECT sal INTO vSal FROM emp WHERE empno = vempno ;
vsal :=vsal + vsal*vporcent;
return vSal;
END;
26
Fonction
27
Fonction: Appel dans un bloc PL/SQL
Ou encore :
28
SET SERVEROUT ON
DECLARE
vSal emp.sal%type;
vporcent NUMBER;
BEGIN
Select sal into vsal FROM emp where empno=7900;
DBMS_OUTPUT.PUT_LINE('Salaire avant Aug:'||vsal);
vSal:=AugSal(7900,50);
DBMS_OUTPUT.PUT_LINE('Salaire après Aug:'||vsal);
END;
29
Pour exécuter un sous programme (fonction ou procédure) d’un autre
schéma il faut :
détenir le privilège EXECUTE sur le sous programme en question :
exemple : GRANT EXECUTE ON nomPrcedure to hr ;
ou EXECUTE ANY PROCEDURE to hr;
motionner le schéma contenant le sous programme à l’appel de ce
dernier
exemple : scott.AugSal(7900,50);
30
1- Ecrire une fonction qui calcul le factoriel d’un nombre.
31
Les droits d’exécution
GRANTOR
GRANTEE
SQL> CONNECT scott/tiger
SQL> GRANT EXECUTE ON AugSal TO betty;
SQL> CONNECT / AS SYSDBA
SQL> SELECT grantee,privilege,table_name
FROM DBA_TAB_PRIVS
WHERE grantee='BETTY';
Remarque :
Pour recompiler un sous-programme d’un autre schéma il faut détenir le
droits ALTER ANY PROCEDURE
33
Suppression de procédures ou fonctions
34
pour consulter le code d’une fonction ou procédure
consulter USER_SOURCE :
SELECT text FROM USER_SOURCE where name=‘nom_fct ou procédure';
Interroger USER_OBJECTS :
- select object_name from user_objects where object_type='FUNCTION';
37
Synatxe :
38
1- Spécification :
END gestEmp ;
39
2- Implémentation :
return vSal;
END;
End gestEmp ;
Préfixer la fonction ou la procédure par le nom du
package :
Exemple :
41
Pour créer un paquetage dans son propre schéma, il faut détenir le
privilège CREATE PROCEDURE
Pour pouvoir créer un paquetage dans un autre schéma, il faut avoir le
privilège CREATE ANY PROCEDURE
Pour qu’un user puisse exécuter une fonction ou procédure d’un package :
42
Quelques packages utiles
UTL_FILE:
Les procédures de ce package (UTL_FILE )permettent de manipuler
les fichiers et répertoires du système d’exploitation.
UTL_FILE.FOPEN
UTL_FILE.PUT
UTL_FILE.PUTF
UTL_FILE.GET_LINE
UTL_FILE.FSEEK
UTL_FILE.IS_OPEN
43
Compilation et Suppression des objets
Compilation :
Procédure : ALTER PROCEDURE nom_procédure COMPILE
Fonction : ALTER FUNCTION nom_fonction COMPILE
Spécification de paquetage : ALTER PACKAGE nom_package COMPILE PACKAGE
Corps de paquetage : ALTER PACKAGE nom_package COMPILE BODY
Spécification + Corps de paquetage : ALTER PACKAGE nom_package COMPILE
Suppression:
Procédure : DROP PROCEDURE nom_procédure
Fonction : DROP FUNCTION nom_fonction
Paquetage entier : DROP PACKAGE nom_package
Corps de paquetage : DROP PACKAGE BODY nom_package
44
1- Ecrire un package qui contient la fonction factoriel mise en place
précédemment.
Tester le bon fonctionnement (exécution).
Tester l’appel de cette fonction à partir d’un autre schéma autre que celui où
elle a été crée.
45 45
create or replace package pack1 as
function fact(n in number) return number ;
end pack1;
/
create or replace package body pack1 as
function fact(n in number) return number is
Begin
if n=0 then
return (1);
Else return (n*fact(n-1));
End if;
End;
end pack1;
Exemple d’utilisation :
declare vresult number;
begin
vresult :=pack1.fact(4);
dbms_output.put_line('valeur en euros :' ||vresult );
end;
/
1- Créer le type référence de curseur et afin d’utiliser ensuite le type, il faut le créer dans
un paquetage :
create or replace package packCurType AS
type curseur_type is ref cursor;
end packCurType ;
2- Créer la fonction
create or replace function listdept(num integer)
return packCurType.curseur_type is
empcurseur packCurType .curseur_type;
begin
open empcurseur for
select ename, deptno from emp where deptno = num;
return empcurseur;
close empcurseur ;
end;
47
Question : comment écrire une fonction (ou une procédure) qui renvoie un
curseur ?. Exemple avec un curseur qui contient le résultat de cette
requête :
select ename, deptno from emp where deptno = num;
avec num : paramètre de la fonction
proposition :
1. Créer un type pour la référence de curseur qu’on va renvoyer
2. Créer la fonction qui renvoie la référence de curseur
Appel :
declare
cu packCurType.curseur_type;
c1 emp.ename%type;
c2 emp.empno%type;
Begin
cu :=listdept(20);
end;