Vous êtes sur la page 1sur 18

!

" " # $
% " " %
" # & ' ( "
& % & % )

* +,, ! ) -, , .( ( ,/)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. Les procédures stockées


? ; # 7 " " # ) #
% & < . )
- % ; )
9 - < ) %
; > ( 9 3 9 ! 4 % 7 % = , 9 3
: 4)

; "
)? & ; # " $ )

; & " )

/
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
.
.
.

& % " " nom_procedure


. # CREATE PROCEDURE) # ;
7 & . DROP PROCEDURE)

: ! - ! ) = * " - % &
% # # - # 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

SELECT @Qte = QteStock


FROM Produit
WHERE NumProduit = @num_produit
SELECT @Qte = @Qte + 1

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
* % # && )

4.1 En SQL Server


• && +
SELECT @Var = expression

• +
IF condition
BEGIN
.
END
ELSE
BEGIN
.
END

• +
WHILE condition
BEGIN
.
END

• && * - ' # +
PRINT ’information’

5. Les curseurs
- 9 3 * ; 4%
" # " $ - % * " -
. # )

# - # " ! * " -
&& )

# & < . )
: 9 ! )

5.1 Les curseurs sous SQL Server


A +
DECLARE nom_curseur CURSOR
FOR
SELECT attr1, …, attrn
FROM table
[JOIN …]
[WHERE condition]
[GROUP BY …]
[HAVING …]
[ORDER BY …]

F
! ! DECLARE) .
! CURSOR % ! " $ ) " $
" ! 6' ! )

? & % # ): - ! +
8) : ! . 9 := +
OPEN nom_curseur

/) # & * % 8 +
FETCH nom_curseur INTO @Var1, …, @Varn

& " " " $ && '


! ! >:)

@) %
' # )
WHILE @@fetch_status = 0
BEGIN
>

F) ! & % & ' ! +


FETCH nom_curseur INTO @Var1, …, @Varn
END

G) ? & % &
CLOSE nom_curseur

) # % ! +
DEALLOCATE nom_curseur

7 +? 7 * )

6. Les déclencheurs
= - 7 ! < % !
7 * 3 -- 4) ? * -
! < " # 7 " # ! ! )

6.1 Les événements


! * # 6 % ' 6 #
- $ # ) *
9 (/% ! &
< 3= , 9 : > ( 9 9 ! 4) ! *
- +
• BEFORE INSERT + 7 !
• BEFORE UPDATE + 7 ! &
• BEFORE DELETE + 7 !
• AFTER INSERT + 7
• AFTER UPDATE + 7 '6
• AFTER DELETE + 7

9 ! % -- A: )

G
! A: ! ! &
!
# )

! A> ! '6 &


+ ' 6 % ;% H ' # 6 % &
# - % 7 )

* - !
I J * ) % ! 3) )
# &
# 7 4 ! % " & % $
* < ) & # * & $ K
" ! 6 ' 6 % * !
)

A % * ' # 6 %
& % # )

6.2 Les déclencheurs sous SQL Server


A +
CREATE TRIGGER nom_trigger ON nom_table
(FOR|AFTER|INSTEAD OF) (INSERT [,] | UPDATE [,] | DELETE [,])+
AS
[IF [NOT] UPDATE (attrx)
BEGIN
END]
[DECLARE @Var1 type, …, @Varn type]
.
.
.

# * > > << ) &


& * 3nom_trigger4 "
3nom_table4) & # ! * ) & %
* ) * * ' * %
& # A L :>M ?= > # )
!"# $% &#!) 7 . 7 +
IF NOT UPDATE (attr)
RETURN

: ! ! * ( $ )

'()(* !+
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 % &


( )

'()(/ - + +
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’

2 ' 6 " # (80000


* - - ) - /% - 8 " #
- /% - 8)

CREATE TRIGGER maj_cat_client ON CLIENT


AFTER UPDATE
AS
IF NOT UPDATE(Compte)
RETURN

DECLARE @NumClient INTEGER


DECLARE @Cat CHAR(2)
DECLARE @Cpt NUMERIC(9,2)
DECLARE @OldCPT NUMERIC(9,2)

DECLARE curseur CURSOR


FOR
SELECT NumClient, Categorie, Compte
FROM inserted

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> )

-- % # '6 %" & 3) )


" ! 4 - 8 . &%
! - &)

7. Les transactions
? 6 )?
9 " ! 3 ( (( 4+
• & B 9 & 7

• 3 B # * ! # 7
% - )
• B ! # 7 ) <
- " # 7 # && # 7

• B * - &&
)

<X ' % ! " "


&& ( ) = & % < !
7 9 I J6 " #' " #
3455 # "4--6&37 )

3455 # & < " # ! - & &&


) &
)

"4--6&37 & < " # !


,- +
)

W
- - & #
" )= 7 + ! # - # !
+
• # * - # "
$ R
• # * - # % )

" # &
& ) ! " # " $ #
$)

& 8 ? #$ 6 $
" ) && % & - % < "
! ) - % & < !
- ) # " 3) ) & %
# 7 4% # 7 $
- & & < )

& 3 7 Y ! %
* # 4 * ' 6 )
& " Y )

7.1 Transactions sous SQL Server


9 ! % * " 9 - ) #
* & % * ! +
BEGIN TRANSACTION nom ;
Instructions de la transaction
(COMMIT|ROLLBACK) TRANSACTION nom ;

& ! & & ' " ) >


& -
* " * )

80
8. Exercices
7 Z ! & * ,- + +

8) # % '6 # " ! " '6


. - ! )
/) $ # 7 # ! " # '
! )
@) # ! $ '
* )
F) C & Z " # # " # &
3) ) [ @G0 4)
G) - $ " - )
) # 6 $ & F0\
' -

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 ;

& % " " nom . #


CREATE PROCEDURE) % 6 #
& CREATE OR REPLACE PROCEDURE & '6 7 )

: ! - ! ) = * " - % &
% # # - # 3IN B ] # 4% 3OUT B
4 3IN OUT B ' 6 4
)= & % #
IN) " . % # - . " : )
% . C 1 )

= + ! &
A ? > ! & '
& . )

7 +

CREATE OR REPLACE PROCEDURE sp_inc_stock (num_produit IN CHAR,


qte_act OUT INTEGER)
AS
Qte INTEGER ;
BEGIN
SELECT QteStock INTO Qte
FROM Produit
WHERE NumProduit = num_produit ;
Qte := Qte + 1 ;

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) ;

A.3 Les curseurs en PL/SQL (Oracle)


A +
DECLARE
CURSOR nom_curseur IS
SELECT attr1, …, attrn
FROM table
[JOIN …]
[ WHERE condition]
[GROUP BY …]
[HAVING …]
[ORDER BY …] ;

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 ;

A.4 Déclencheurs en PL/SQL (Oracle)


A +
CREATE [OR REPLACE] TRIGGER nom_trigger
(BEFORE|AFTER) (INSERT|UPDATE|DELETE) ON nom_table
[FOR EACH ROW]
[WHEN condition]
[DECLARE
Var1 type ;
.
Varn type ; ]
BEGIN
.
.
.
END ;

& * $ & ) %
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) =
& % & # . -- [ " -- - )

• Les déclencheurs de lignes 7 « séparément » pour chaque ligne


modifiée ) # & évolution pour
certaines valeurs, effectuer des opérations pour chaque ligne en question)

&(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

= " % * BEFORE% ! ! Z $ * &


3INSERT% UPDATE% DELETE4 ] !
RAISE_APPLICATION_ERROR)

. 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

& " # &


) ! * -
) ! -- - ! 6 '
" " : )

/) * - % & ) %
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;

A.5 Transactions en PL/SQL (Oracle)


: - ) %
3 >% ?= > > 4 )
" " +
• :22 > : N
• " # 3 - - &
> % :=% > 4 3 - - [ - #
< >% C:N % H4 7 3 :22 >4
• . 3 : N4

# & P % 9 # 7 ( - &
" # :22 > " && * "
9 & )

& % # C " & ) # "


# 6 # 7 :22 >)

A.6 Exercice en PL/SQL (Oracle)

8) 3 : " 4 # - 3) ) .
( - 4 ) # - & S
* - - ! ! - )

7 3` T4 : )

8T

Vous aimerez peut-être aussi