Académique Documents
Professionnel Documents
Culture Documents
" " # $
% " " %
" # & ' ( "
& % & % )
* +,, ! ) -, , .( ( ,/)0, ,
1 2 31 2 4 * - # )
# " ! 5 ! % -
&& % && % ' ! 6 "
1 & ! - 7)
2 /088
La programmation SQL
1. Introduction
9 ! : % ;
% #. 6 ) -
9 " < % : % - & = , 9 "
9 ! % - & > ( 9 3>( 9 4)
: - - ; * )
; 3 4 * ' )
# $ !
< ) % " '6 ! $ && %
! & ; " !
- 7 - - - " )
* 3 -- 4 " *
" " # ! ! % # #
- ) * * '
' ! )
2. La base de données
LignesCommande
Client
NumCommande Commande
Produit NumClient
NumProduit NumCommande
NumProduit NumClient Nom
Qte
Libelle DateCommande Adresse
Prix id: NumProduit Localite
NumCommande id: NumCommande
QteStock Categorie
acc acc
id: NumProduit Compte
ref: NumProduit ref: NumClient
acc id: NumClient
ref: NumCommande acc
acc
acc
; "
)? & ; # " $ )
; & " )
/
3.1 Procédure stockée en SQL Serveur
A +
CREATE PROCEDURE nom_procedure
[@arg1 type [OUTPUT], …, @argn type [OUTPUT] ]
AS
DECLARE @Var1 type
.
DECLARE @Varn type
.
.
.
: ! - ! ) = * " - % &
% # # - # 3 OUTPUT4
3OUTPUT B 4) = & %
# ) > ( 9 % . # - $
) % & 7 - C 1 3@04)
= + ! &
%' & . % . DE# ! & )
7 +
CREATE PROCEDURE sp_inc_stock (
@num_produit CHAR(5),
@qte_act INTEGER OUTPUT)
AS
DECLARE @Qte INTEGER
UPDATE Produit
SET QteStock = @Qte
WHERE NumProduit = num_produit
SELECT @qte_act = @Qte
-- exécution :
DECLARE @RESULT DECIMAL(2,1)
EXEC SP_INC_STOCK ’P001’, @RESULT OUTPUT
GO
7 % sp_inc_stock # ;
num_produit # )
@
4. Programmation SQL
! < % & - 9
* % # && )
• +
IF condition
BEGIN
.
END
ELSE
BEGIN
.
END
• +
WHILE condition
BEGIN
.
END
• && * - ' # +
PRINT ’information’
5. Les curseurs
- 9 3 * ; 4%
" # " $ - % * " -
. # )
# - # " ! * " -
&& )
# & < . )
: 9 ! )
F
! ! DECLARE) .
! CURSOR % ! " $ ) " $
" ! 6' ! )
? & % # ): - ! +
8) : ! . 9 := +
OPEN nom_curseur
/) # & * % 8 +
FETCH nom_curseur INTO @Var1, …, @Varn
@) %
' # )
WHILE @@fetch_status = 0
BEGIN
>
G) ? & % &
CLOSE nom_curseur
) # % ! +
DEALLOCATE nom_curseur
7 +? 7 * )
6. Les déclencheurs
= - 7 ! < % !
7 * 3 -- 4) ? * -
! < " # 7 " # ! ! )
9 ! % -- A: )
G
! A: ! ! &
!
# )
* - !
I J * ) % ! 3) )
# &
# 7 4 ! % " & % $
* < ) & # * & $ K
" ! 6 ' 6 % * !
)
A % * ' # 6 %
& % # )
: ! ! * ( $ )
'()(* !+
9 ! ! +
• FOR FOR AFTER AFTER + * # 7 " #
9 7 ) * 7 "
# 9 # ) %
- 3 # - % & % 1 N4
! & ) FOR% FOR AFTER AFTER . . )
• INSTEAD OF + # - # . * )
,- .. ..
)
! * # % '6 )
'()() -
9 ! & " * ) % * #
7 " # & $ " $ 9 " ! " 7
- )
'()(/ - + +
9 ! # ! % # 7 * % 7
! ! ) & % ! # ! * %
- & 7 ( )
>
?= >
>
'()(0 &
: L@M + I ROLLBACK TRANSACTION * ! && P * . P*
--
* P* P * -- ) 3H4 * P * -- % . * !
* - BEGIN TRANSACTION * 9 * P *
7 && ! . ( ) * - * 9 *
- Q Q * ( R* P ! % * > (
9 P * -- && ! . Q Q * ( %
* & ; P ; * - - & * (
) J)
: $ # 7 * + +
,- .. # ROLLBACK
TRANSACTION) ! & " * AFTER%
ROLLBACK " I & J & && )
% I J * . BEFORE)
'()(1 - ,- +
& - ) && % ! %
% - % . # ) = & % &
# > ( 9 : & ! +
RAISERROR( message, severité, etat)
message * S . # " ! )
sévérité 0 8T " - ! # )
O
#état % 8 8/O% " $ # U
# # )= 7 % $ ! '
* % # - # : " 7 )
'()(' % ,- +
8) # & * A> ! )
* > :A " # >1 1 N :=> :
# ! )
/) & )
@) # > V% > V% :=
V% := > > > * )
)
'()(2 !
CREATE TRIGGER maj_autom_cat_inf_client ON CLIENT
AFTER UPDATE
AS
IF NOT UPDATE(Compte)
RETURN
UPDATE Client
SET Cat=’B1’
WHERE Compte <-10000
AND Cat=’B2’
UPDATE Client
SET Cat=’C1’
WHERE Compte <-10000
AND Cat=’C2’
OPEN curseur
FETCH curseur INTO @NumClient, @Cat, @Cpt
T
WHILE @@fetch_status = 0
BEGIN
SELECT @OldCPT = Compte
FROM deleted
WHERE NumClient = @NumClient
IF @Cat = 'B1'
BEGIN
IF @OldCPT > 0 AND @Cpt < 0
BEGIN
RAISERROR('Un client B1 ne peut passer en negatif', 7, 1)
ROLLBACK TRAN
END
END
FETCH curseur INTO @NumClient, @Cat, @Cpt
END
CLOSE curseur
DEALLOCATE curseur
-- * + # #
# % # "
& % # # - # #
-X 7 : : N> )
7. Les transactions
? 6 )?
9 " ! 3 ( (( 4+
• & B 9 & 7
• 3 B # * ! # 7
% - )
• B ! # 7 ) <
- " # 7 # && # 7
• B * - &&
)
W
- - & #
" )= 7 + ! # - # !
+
• # * - # "
$ R
• # * - # % )
" # &
& ) ! " # " $ #
$)
& 8 ? #$ 6 $
" ) && % & - % < "
! ) - % & < !
- ) # " 3) ) & %
# 7 4% # 7 $
- & & < )
& 3 7 Y ! %
* # 4 * ' 6 )
& " Y )
80
8. Exercices
7 Z ! & * ,- + +
Bibliographie
L8M ) 2 <) >% 9 (/ + % = - % / %
% 8WWF% =
L/M =) 2 % 9 / B 9 @+ ' : % @ % ; ? ! %
/008% 7
L@M 2 &% 2 2 & ! P ;% * +,, ) &) %
6 ! /00W% 2 & )
LFM Z% )% : 9 & % 80- / 380)/4% *
.: ! * +,,PPP) ) , , 80/,* - % /00G
LGM A % = - > 9 %
* +,, " ) ! Z) , , " ! , "% ! Z) %
/00F
L M Y ) 1 ?>% + % ! % %
/00W% = )
Remerciements
? ' - C = C 2 >
! # )
88
Livre
Auteur Redaction Location
NumLivre
NumAuteur NumAuteur Titre NumEmprunteur
Nom NumLivre Exemplaire NumLivre
ISBN
DateNaissance[0-1] id: NumAuteur NbPages NumLivre NumExemplaire
id: NumAuteur NumLivre DatePublication NumExemplaire DateLocation
acc acc Cote Etat DateRetourPrevu
equ: NumLivre Langue DateAchat DateRetour[0-1]
acc NumType NumEtagere id: NumEmprunteur
ref: NumAuteur NumCategorie id: NumLivre NumLivre
NumEditeur NumExemplaire NumExemplaire
Langue acc DateLocation
id: NumLivre
CodeIso acc ref: NumEtagere acc
NomLangue ref: NumLivre ref: NumLivre Emprunteur
Type id': ISBN
id: CodeIso NumExemplaire NumEmprunteur
NumType acc
acc acc Nom
Description ref: Langue
ref: NumEmprunteur Prenom
acc
id: NumType Adresse
ref: NumType
acc Localite
acc
Emplacement Cotisation
ref: NumCategorie Critique
NumEtagere RegNat
acc NumEmprunteur
Allee DatePaiementCotisation
Categorie ref: NumEditeur NumLivre
Etage CatEmprunteur
NumCategorie acc Cote
id: NumEtagere id: NumEmprunteur
Nom Commentaire
acc
CategorieParent[0-1] id: NumEmprunteur id': RegNat
id: NumCategorie Editeur NumLivre acc
acc NumEditeur acc ref: CatEmprunteur
ref: CategorieParent Nom ref: NumLivre acc
acc Adresse acc CatEmprunteur
Localite ref: NumEmprunteur NumCategorie
id: NumEditeur Designation
acc Cotisation
id: NumCategorie
acc
8/
Annexe A : Programmation SQL sous Oracle
A.1 Procédure stockée en PL/SQL (Oracle)
A +
CREATE [OR REPLACE] PROCEDURE nom [(arg1 [IN|OUT|IN OUT] type, …,
argn [IN|OUT|IN OUT])]
AS
[Var1 type
.
Varn type ]
BEGIN
.
.
.
END ;
: ! - ! ) = * " - % &
% # # - # 3IN B ] # 4% 3OUT B
4 3IN OUT B ' 6 4
)= & % #
IN) " . % # - . " : )
% . C 1 )
= + ! &
A ? > ! & '
& . )
7 +
UPDATE Produit
SET QteStock = Qte
WHERE NumProduit = num_produit ;
qte_act := Qte ;
END ;
7 % sp_inc_stock # ;
num_produit # )
8@
A.2 Instructions PL/SQL (Oracle)
• && +
Var := expression ;
• +
IF (condition) THEN
.
ELSE
.
END IF;
• +
LOOP
.
EXIT;
END LOOP ;
• && * - ' # +
DBMS_OUTPUT.PUT (’ma variable = ’ || var) ;
DECLARE ! ! ) " $
9 " ! 6' ! )
? & % # ): - ! +
8) : ! . 9 := +
OPEN nom_curseur ;
/) +
LOOP
FETCH nom_curseur INTO var1, …, varn ;
EXIT WHEN nom_curseur%NOTFOUND ;
>
END LOOP ;
# A > 1 #
" $ ! >:)
@) A +
8F
CLOSE nom_curseur ;
& * $ & ) %
CREATE OR REPLACE TRIGGER ! * 3# REPLACE
& * 7 4) $ " )
# ! * " " )
. * 3 - 4 A: 1 :
3 -- - 4) # % # - # -- ) & %
1 * ' * )
* & / + 8
# ) / !
! < 9 * ) !
& * )
&(0(* -
7 deux . * && + 3 > > 2 >4
. 3 : 4) 9 && ^
• déclencheurs de table 7 une seule fois " &
! 3 $ & -
4) opérations de groupe doivent être réalisées 3
# . % # % # % H4) =
& % & # . -- [ " -- - )
&(0() - + +
: & / # 7 * )
7 # ! 7 , 7 ! ! )3
. )
8G
7 ( # &&
! & " # 6 ! & ' 6
)= 7 % '6 # - '6
)
% : - + + P) ! # ! * %
+
> : # 7
?= > :
> # 7
&(0(/ &
% 7 " # # ! & %
# $ & )= & % +
" " # $ & ' #
)
- 4
= # * % LFM + I P
* . & -- ) % P -- )
ROLLBACK% COMMIT SAVEPOINT ) 3H4 J
# & ROLLBACK
# 7 % # . ! $ 5 ! )
LFM + I : P ( & = , 9
* * ( & - *
) & ! % * * * * (
& - : )
? ( & - - * _ == >: _ :
) 3H4 >* 7 % ; . && & *
% ( & - 3 *
. 7 * 4) >* * - & (/0000
(/0WWW)
= , 9 - % * (
* . 7 * * ;
& * - )J
. 7 ' " # # 7 +
DECLARE
mon_exception EXCEPTION;
.
BEGIN
.
RAISE mon_exception;
8
.
EXCEPTION
WHEN mon_exception THEN
RAISE_APPLICATION_ERROR(-20005, ’Exception’);
END;
&(0(0 % 4
8) ? * - ' ) LFM%
+ I - * - & . UPDATE% DELETE
INSERT % * -* . * && & DELETE
CASCADE ) 3H4 >* * * -- -
" . &. - ) >* ! -- & -
- & ) 3H4 J
/) * - % & ) %
LFM " + I : ! P ! * BEFORE
AFTER P -- ) P ! - BEFORE P -- %
AFTER P -- 3 * -- - ; &&
& AFTER P -- & 4) & BEFORE P -- * - * ! &
new.column% * AFTER P -- & . * *
* - - . * BEFORE P -- ) J
" & ! !
3 = , 9 :new.val :=2 7 4% "
* - A: )
@) ! & Z * - " * #
3! 1 4% -" " #
: ) = " # "
! ! * % - # :
$ < )
&(0(1 !
CREATE OR REPLACE TRIGGER upd_qt_produit
AFTER UPDATE OF QSTOCK ON produit
FOR EACH ROW
DECLARE
quantite_insuffisante exception;
quantite_com number;
quantite_stock number;
BEGIN
SELECT MAX(qcom) INTO quantite_com
FROM lignecom
WHERE npro = :new.npro;
quantite_stock := :new.qstock;
8O
IF quantite_stock < quantite_com THEN
RAISE quantite_insuffisante;
END IF;
EXCEPTION
WHEN quantite_insuffisante THEN
raise_application_error (-20001, ‘Quantite de stock
insuffisante’);
END;
# & P % 9 # 7 ( - &
" # :22 > " && * "
9 & )
8) 3 : " 4 # - 3) ) .
( - 4 ) # - & S
* - - ! ! - )
7 3` T4 : )
8T