3.SGBD (Procédure & Fonctions)
3.SGBD (Procédure & Fonctions)
3.SGBD (Procédure & Fonctions)
Transact-SQL
Les Procédure & Fonctions
Procédures Stockées
Une procédure stockée (Stored Procedure pour SQL Server) est une suite d’instructions SQL
stockées dans la base de données et pouvant être exécutée par appel de son nom avec ou
sans paramètre.
Les procédures stockées diffèrent des instructions SQL :
• Leur syntaxe est vérifiée et elles sont compilées. C’est le code compilé qui est utilisé lors
des appels
• Ne sont pas appelées automatiquement, mais doivent faire l’objet d’un appel explicite de la
part de l’utilisateur.
• Peuvent être appelées par plusieurs applications frontales
Avantages :
• Améliorent les performances par utilisation du code compilé
• Renforcent l’intégrité de la base : en centralisant les
traitements en un endroit unique unicité du code
1
2/8/2014
Procédures Stockées
Syntaxe
CREATE PROC[EDURE] procedure_name
[ { @parameter data_type }
[ VARYING ] [ = default ] [ OUTPUT ]
] [ ,...n ]
[ WITH
{ RECOMPILE | ENCRYPTION | RECOMPILE , ENCRYPTION } ]
[ FOR REPLICATION ]
AS sql_statement [ ...n ]
@parameter : Un paramètre de la procédure.
Default : Valeur par défaut pour le paramètre. La valeur par défaut peut contenir des caractères génériques
(%, _, [] et [^]) si la procédure utilise le nom du paramètre avec le mot clé LIKE
OUTPUT: Indique que le paramètre est un paramètre de retour renvoyé par la procédure.
Procédures Stockées
{RECOMPILE | ENCRYPTION | RECOMPILE, ENCRYPTION}
RECOMPILE indique que SQL Server n'utilise pas le cache pour le plan de cette procédure et que la
procédure est recompilée à l'exécution. Utilisez l'option RECOMPILE lorsque vous utilisez des valeurs
temporaires ou atypiques sans remplacer le plan d'exécution placé en mémoire cache.
ENCRYPTION : indique que SQL Server crypte l'entrée de la table syscomments contenant le texte de
l'instruction CREATE PROCEDURE. L'utilisation de l'argument ENCRYPTION évite la publication de la
procédure dans le cadre de la réplication SQL Server.
FOR REPLICATION : Indique que les procédures stockées créées pour la réplication ne peuvent pas être
exécutées sur l'abonné. Une procédure stockée créée avec l'option FOR REPLICATION est utilisée comme
filtre de procédure stockée et n'est exécutée que pendant la réplication. Cette option ne peut pas être
utilisée avec l'option WITH RECOMPILE.
La taille maximale d'une procédure stockée est limitée à 128 Mo.
Une procédure stocké peut retourné une valeur statique entier pour indiqué sont état d’exécution : if
condition RETURN -1
Pour supprimer une PS : Drop Proc procedure_name
Pour Modifier une PS : Alter Proc procedure_name paramètre as sql_stat
2
2/8/2014
Procédures Stockées
Exemple : Factoriel Appel d’une Procédure StockéeStocké
Use DB_Calcul
Go
Exec Factoriel 5
Create Proc Factoriel @n int
Go
as
begin ou
declare @f int, @i int
set @f=@f*@i
set @i=@i+1
end
End
Go
Procédures Stockées
Exemple : FactorielS,
Param. Sortie. Appel de la PS.
Create Proc FactorielS @n int,
Declare @fact int
@f int OUTPUT
as Set @fact=0
Begin Exec FactorielS 8, @fact OUTPUT
declare @i int
Select @fact as "Factoriel de 8"
select @f=1, @i=1
while (@i<=@n)
Go
Begin
set @f=@f*@i
set @i=@i+1
end
End
Go
3
2/8/2014
Procédures Stockées
Exemple
Sur la base auditeur en ajoute une colonne moyenne, on crée une procédure stocké pour le résultat de la
moyenne des examens que l’auditeur a passé.
---- Ajout de la colonne moyenneAjout de la colonne moyenne
alter table auditeur
add moyenne real constraint ct_my check (moyenne between 0 and 20)
Procédures Stockées
Exemple avec parameter
procédure qui fait le même calcule, mais pour un seul auditeur, son numéro est passé
en parameter
Create PROC CalcMyP @Aud int= null
as
Begin
if @Aud is null
update auditeur set moyenne=(select avg(note) from Passe_Ex Where
passe_ex.nuAud=auditeur.NuAud);
else
update auditeur set moyenne=(select avg(note) from Passe_Ex Where
passe_ex.nuAud=auditeur.NuAud) And auditeur.NuAud=@Aud;
End
Go
Exec CalcMyP 2
Exec CalcMyP @Aud=2
Exec CalcMyP
4
2/8/2014
Procédures Stockées
Exemple avec valeur de retour d’état
Create Proc Factoriel @n int, @fact int output as
Begin
declare @f int, @i int
select @f=1, @i=1
if @n<0
return -1
else
begin
while (@i<=@n)
begin
select @f=@f*@i, @i=@i+1
end
set @fact=@f
return 0
end
end
Go
Declare @resultat int, @etat int
Exec @etat=Factoriel -2,@resultat output
Select @etat as "Etat", @resultat as "Resultat"
Fonctions
CREATE FUNCTION [ schema_name. ] function_name (
[ { @parameter_name [ AS ][ type_schema_name. ] parameter_data_type [=default]} [ ,...n ] ] )
Scalar Functions (retourne une valeur)
RETURNS return_data_type [ WITH <function_option> [ ,...n ] ] [ AS ]
BEGIN
function_body
RETURN scalar_expression
END [ ; ]
Inline Table-valued Functions (retourne une table online)
RETURNS TABLE [ WITH <function_option> [ ,...n ] ] [ AS ]
RETURN [ ( ] select_stmt [ ) ] [ ; ]
Multistatement Table-valued Functions (retourne une table on multi- instruction)
RETURNS @return_variable TABLE < table_type_definition > [ WITH <function_option> [ ,...n ] ]
[ AS ] BEGIN
function_body
RETURN END [ ; ]
NB : Les fonctions ne permette pas les instruction qui produisent un effet secondaire, tel que la modification d'une table (update)
Pour la Supression et la Modification : Drop Function F, Alter Function F
5
2/8/2014
Fonctions
Exemple (Une Fonction Scalaire):
CREATE FUNCTION Factoriel (@n int) RETURNS bigint
AS BEGIN
declare @f bigint, @i int select @f=1, @i=1
while (@i<=@n)
begin
select @f=@f*@i, @i=@i+1
end
RETURN @f
END
Go
Select dbo.Factoriel(6) as Factoriel;
ou
Declare @r bigint
Set @r=dbo.Factoriel(15)
Print cast(@r as varchar)
Fonctions
Exemple : une fonction table online
USE GestStg
--Drop Function NoteStg
CREATE FUNCTION NoteStg (@idstg int) RETURNS Table
AS
RETURN (Select libelle, avg(note) as NoteM from Matiere inner join note on
Matiere.idmat=note.idmat where idstg=@idstg group by libelle);
Go
6
2/8/2014
Fonctions
Exemple : une fonction table online
Create FUNCTION NoteStg2 (@idstg int)
RETURNS @Resultat Table (Matiere varchar(50), Note decimal(4,2)) AS
begin
insert into @Resultat Select 'Nom : ' + nom,Null from stagiaire where idstg=@idstg
insert into @Resultat Select libelle, avg(note)
From Matiere inner join note on Matiere.idmat=note.idmat
Where idstg=@idstg Group by Matiere.idmat, libelle
insert into @Resultat select 'Moyenne :', Moyenne from stagiaire where idstg=@idstg
RETURN
end
Go
Select * from dbo.NoteStg2(1); Go
Fonctions
Exercices