Vous êtes sur la page 1sur 22

Plan

Le langage de contrle de donnes (LCD)

SGBD

Vues et Squences
Le langage PLSQL
PL SQL

P ti 2
Partie2
FacultdesSciencesdeMonastir
LFI2

LCD:Dfinition(1)
Dfinition :

Lelangagedecontrlede
Le
langage de contrle de
donnes (LCD)
donnes(LCD)

Les instructions de contrle des donnes donnent


l'administrateur de base de donnes le pouvoir de
contrler la scurit de la base. Le LCD est compos de 4
commandes SQL :
GRANT
GRANT
REVOKE
COMMIT
ROLLBACK
4

LCD:Dfinition(2)

LCD:GRANT(1)

GRANT et REVOKE sont utilises pour exercer un contrle


sur l'accs des donnes. COMMIT et ROLLBACK sont
utilises pour prserver l'intgrit des donnes. Pour
utiliser une base de donnes, l'utilisateur doit passer par
une procdure de connexion. Lors de cette procdure, il
doit saisir un login et un mot de passe. Ce login permet
d'identifier chaque utilisateur et sert de repre pour lui
accorder (ou lui enlever) des droits de manipulation de la
base.

La commande GRANT permet d'autoriser un accs aux


donnes de la base soit total,
total soit des degrs limits.
limits
Ainsi, il est possible, par exemple, d'autoriser la
consultation de certaines tables sans possibilit de les
modifier.
Syntaxe:
GRANT ALL PRIVILEGES | accs_spcifique
_p
q
ON nom_table | nom_vue
TO PUBLIC
nom_autoris | [WITH GRANT OPTION];

LCD:GRANT(2)

LCD:GRANT(3)

Avec la convention suivante :


Ilestpossiblededonnertouslestypesdedroits
Il est possible de donner tous les types de droits
d'accs(consultation,modification,suppression,)
avec ALL PRIVILEGES ou d'accorder
avecALLPRIVILEGESoud
accorderdesprivilges
des privilges
spcifiques(accs_spcifique).
nom_autoris
nom autoris (oulogin):nomdonnparl
(ou login) : nom donn par l'utilisateur
utilisateur
lorsdesaconnexionlabasededonnes(crpar
l'administrateur)
)
PUBLIC :toutlemondereoitleprivilgeaccord
(
(accs_spcifique)outouslesprivilges(ALL
_ p fq )
p
g (
PRIVILEGES).
WITHGRANTOPTION:celuiquireoitleprivilge
q

p
g
peutluimmel'accorderunautre.

Exemple:
GRANT ALL PRIVILEGES
ON VOITURE
TO Martin
M ti
WITH GRANT OPTION;

Cette instruction SQL permet ll'administrateur


administrateur de la base
de donner Martin tous les droits sur la table VOITURE, il
lui accorde galement ll'autorisation
autorisation de transfrer ces
privilges.
7

LCD:GRANT(3)

LCD:GRANT(4)

Les droits d'accs:


LLa gestion
i des
d droits
d i d'accs
d' aux tables
bl est dcentralise
d
li : il
n'existe pas d'administrateur global attribuant des droits.
Seul le propritaire (crateur) d
d'une
une table peut attribuer
des droits sur celleci. Les principaux droits d'accs
spcifiques sont :
slection(SELECT)
insertion(INSERT)
insertion (INSERT)
suppression(DELETE)
misejour(UPDATE)
i j
(UPDATE)
indexation(INDEX)
rfrencerlatabledansunecontrainte(REFERENCES)

Il peut ensuite passer ses droits slectivement d'autres


utilisateurs ou tout le monde (PUBLIC).
(PUBLIC) Un droit peut
tre pass avec le droit de le transmettre (WITH GRANT
OPTION)) ou non. L'ensemble des droits d'accs ((ALL
PRIVILEGES) inclut les droits d'administration
(changement de schma et destruction de la relation).
GRANT SELECT, UPDATE
ON VOITUR
VOITURE,, ACHAT
TO Smith;

Cette commande permet de passer des droits de


consultation et de mise jour de la table VOITURE et de
la table ACHAT ll'utilisateur
utilisateur Smith.
Smith

10

LCD:GRANT(5)

LCD:REVOKE(1)

GRANT ALL PRIVILEGES (Immatriculation, Prix)


ON VOITURE
TO Smith, Vandenbrouck, Dubois;

La commande REVOKE permet de retirer l'accs, c'est la


commande inverse de GRANT.
GRANT

Cette commande permet de passer ll'ensemble


ensemble des droits
d'accs aux utilisateurs Smith, Vandenbrouck et Dubois
uniquement sur les colonnes Immatriculation et Prix de la
table
bl VOITURE.
VOITURE

Syntaxe:
REVOKE ALL PRIVILEGES | accs_spcifique
accs spcifique
ON nom_table | nom_vue

GRANT INSERT
ON PERSONNE
TO PUBLIC;

FROM nom_utilisateur | PUBLIC;

Cette commande attribue le droit d'insrer de nouveaux


enregistrements dans la table PERSONNE tous ceux qui,
dans la socit,
socit disposent d
d'une
une identification pour se
connecter sur la BD.
11

12

LCD:REVOKE(2)

LCD:Lecontrledintgrit

Exemples :

Les commandes COMMIT et ROLLBACK constituent des


contrles ncessaires la prservation de ll'intgrit
intgrit de la
base.

REVOKE SELECT,
SELECT UPDATE
ON VOITURE, ACHAT
FROM Smith;

Cette commande supprime les droits de consultation et de


mise jour de la table VOITURE et de la table ACHAT qui avait
t accords l'utilisateur Smith.
REVOKE ALL PRIVILEGES

Des systmes multiutilisateurs existants emploient des


contrles supplmentaires comme par exemple la
commande LOCK pour empcher les valeurs de changer
pendant qu'un utilisateur examine ou travaille sur ces
valeurs.

ON VOITURE
FROM Martin;

Cette commande retire tous les p


privilges
g accords sur la
table VOITURE Martin.
13

14

LCD:COMMIT(1)

LCD:COMMIT(2)

La commande COMMIT permet l'utilisateur de fixer le


moment o les modifications en cours affecteront la
base de donnes. Dans ce cadre, on utilise le concept de
transaction.
transaction

Une transaction (ou une partie de transaction) qui n'a


pas encore t enregistre dfinitivement n
n'est
est visible
que pour l'utilisateur qui l'introduit. Elle n'affecte pas la
base tant q
que l'instruction n'est p
pas excute.

La transaction est une suite d'oprations telle que


chaque opration de cette suite est ncessaire pour
atteindre un rsultat unitaire.
C'est la raison pour laquelle SQL propose l'utilisateur
de n
nenregistrer
enregistrer les modifications dans la base qu
qu'au
au
moment o la transaction est acheve grce la
commande COMMIT.
15

Avant l'excution de l'instruction COMMIT, il est possible


de restaurer la base par ROLLBACK, cc'estdire
est dire
d'liminer
les
modifications
rcentes.
Aprs
l'enregistrement
g
dfinitif d'une transaction p
par COMMIT,
il n'est plus possible de restaurer l'tat antrieur par
ROLLBACK. S'il apparat aprs coup qu'une transaction
d
doive
modifie
tre
d f ou corrige,
on ne pourra effecteur
ff
cette modification qu'au moyen d'une autre instruction
SQL comme UPDATE ou DELETE.
DELETE
16

LCD:ROLLBACK

LCD:SAVEPOINT

La commande ROLLBACK permet l'utilisateur de ne pas


valider les dernires modifications en cours dans la base de
donnes.

Une transaction tant une squence de squence de


commandes SQL considre comme unitaire,
unitaire indivisible,
indivisible
il peut tre ncessaire de pouvoir revenir en arrire,
nimporte
n
importe quel endroit dans la transaction courante.
courante

Par exemple, si au cours du droulement d


d'une
une transaction,
l'utilisateur fait une erreur ou si, pour une certaine raison,
une transaction ne peut pas tre acheve, l'utilisateur peut
supprimer les modifications afin d'viter des incohrences
dans la base grce la commande ROLLBACK. Cette
commande limine tous les changements depuis la dernire
validation.
Dans le cas d
d'une
une dfaillance du systme,
systme ll'intgrit
intgrit de la
base peut tre prserve par une option ROLLBACK
automatique
q
qui limine les transactions inacheves et
q
empche donc qu'elles soient introduites dans la base.

Pour cela, il suffit de raliser des points de sauvegarde


grce la commande SAVEPOINT <nom> lintrieur
dune transaction pour situer un point ventuel de retour
vers ltat de la base de donnes. Le retour en arrire
seffectue grce la commande ROLLBACK WORK TO
SAVEPOINT <nom>.

17

18

LCD:Terminaisond'unetransaction

Vuesetsquences

19

Vues:Dfinition(1)

Vues:Exemples(1)

Dfinition :

Exemples :

Une vue est une relation virtuelle au sens o ses


instances n'existent pas physiquement mais sont
calcules chaque invocation de la vue. Une vue est
dfinie par une requte qui utilise des relations ou des
vues existantes.

CREATE VIEW VOITURES_CHERES


VOITURES CHERES

Syntaxe :
CREATE VIEW nom_de_la_vue

AS SELECT *
FROM VOITURE
WHERE Prix > 15 000;

La vue VOITURES_CHERES a le mme schma que la relation


VOITURE.
SELECT *

AS <clause
l
SELECT>;

FROM VOITURES_CHERES;

On peut accder grce cette vue toutes les voitures dont le


Prix est suprieur 15 000.
21

Vues:Exemples(2)
CREATE
VIEW
marquee voiture) AS
marquee_voiture)

VOITURES_PUISSANTES

22

Vues:Exemples(3)
(immat_voiture,

SELECT Immatriulation, Marque


FROM VOITURE
WHERE Puissance > 6;
La vue Voiturespuissantes comporte les attributs Immatriculation et
Marque renomms en immat_voiture et marque_voiture. Elle
permet d'accder toutes les voitures dont la puissance est
suprieure 6 chevaux.
En interrogation, une vue est utilise comme toute autre relation. La
seule diffrence rside dans le fait que ses tuples ne sont pas stocks
mais
i ils
il sontt le
l rsultat
lt t de
d l'valuation
l' l ti de
d la
l requte
t de
d dfinition
dfi iti
23

En mise jour, toute modification des relations ayant servi la


dfinition de la vue est rpercute sur la vue (lors d
d'une
une nouvelle
valuation de la requte de dfinition de la vue). Par contre, la
mise jour d'une base de donnes " travers" une vue n'a pas
trouv de solution gnrale : le problme vient du fait qu'il est
parfois impossible de rpercuter la mise jour de la vue sur les
relations
l ti
sur lesquelles
l
ll elle
ll estt dfinie.
dfi i Cependant,
C
d t quand
d des
d
contraintes logiques ne viennent pas l'empcher la mise jour au
travers des vues est possible.
A titre d'exemple, si une vue comporte une colonne obtenue par
une fonction d
d'agrgation
agrgation, la mise jour de cette colonne
supposerait que l'on soit capable de mettre jour les tuples
concerns par la fonction d'agrgation, tant donne la valeur
introduite, ce qui est logiquement impossible.
24

Vues:Supression

Squences:Dfinition

Enfin la suppression d'une vue est faite explicitement par DROP


VIEW.

Dfinir une squence quivaut dfinir une suite de nombres


entiers LL'volution
entiers.
volution de cette suite est rgie par un certain nombre
de paramtres. L'utilisation d'une squence permet donc d'avoir
disposition une suite de valeurs. Ceci peut permettre de :
gnrerdesclsuniquesdansdestables
avoiruncompteurtitreinformatif,quel'onincrmentequand
onveut
etc...

25

26

Squences:Cration(1)

Squences:Cration(2)

Syntaxe:
CREATE SEQUENCE nom_de_la_sequence
nom de la sequence
[START WITH valeur_initiale]
[INCREMENT BY ] incrment
[NOMAXVALUE NOMINVALUE | MAXVALUE maximum | MINVALUE
minimum]
i i
]
[NOCYCLE | CYCLE]
[CACHE nombre_de_valeurs];
STARTWITHpermetdefixerlavaleurinitialedelasquence.
INCREMENTBYpermetdefixerlepasdincrmentation.Si
celuiciestpositif,lasquenceestcroissante,sinonelledcrot.
l i i
i if l
i
i
ll d
27

NOMAXVALUEetNOMMINVALUEpermetdenepasfixerde
limite dans la squence Si lon
limitedanslasquence.Sil
ondsirefixerunplafondnepas
dsire fixer un plafond ne pas
dpasser(pourunesquenceascendante),onutilise
MAXVALUE.Silondsirefixerunplancher(pourunesquence
descendante),onutiliseMINVALUE.
LoptionCYCLEpermetunefoislalimiteducompteuratteint,
dereprendrelecomptagelavaleurMINVALUE(pourune
squenceascendante)ouMAXVALUE(pourunesuite
descendante) Si lon
descendante).Sil
ondsirearrterlasquenceunefoisla
dsire arrter la squence une fois la
limiteducompteuratteint,ilsuffitdutiliserloptionNOCYCLE.
LLoption
optionCACHEpermetdemettrenombre_de_valeurs
CACHE permet de mettre nombre de valeurs valeurs
valeurs
danslammoirecacheafindoptimiserlutilisationdes
squencesetavoiruneffetsignificatifsurlesperformances,
surtoutlorsquenombre_de_valeurs estlev.
28

Squences:Exemples(1)

Squences:Exemples(2)

CREATE SEQUENCE SEQUENCE_VOITURE


SEQUENCE VOITURE START WITH 5

CREATE SEQUENCE SEQUENCE_VOITURE


SEQUENCE VOITURE

INCREMENT BY 3;

START WITH 5
INCREMENT BY 3

Cette commande SQL permet de crer une squence


SEQUENCE_VOITURE commenant la valeur 5 avec un pas
dincrmentation de 3. La squence obtenue est alors : 5, 8, 11, 14,
17, 20,

MAXVALUE 30;
Cette commande
d
SQL permet de
d
crer

une squence

SEQUENCE_VOITURE commenant la valeur 5 avec un pas


dincrmentation
d
incrmentation de 3,
3 avec pour valeur maximale 30.
30 La squence
obtenue est alors : 5, 8, 11, 14, 17, 20, 23, 26, 29.

29

Squences:Exemples(3)

30

Squences:Interrogation
L'interrogation d'une squence se fait par l'utilisation des "pseudo
colonnes" CURRVAL et NEXTVAL.
colonnes
NEXTVAL On parle de pseudo
pseudocolonne
colonne car
cela se manipule un peu comme une colonne de table, mais ce
n'est pas une colonne de table.
LapseudocolonneCURRVALretournelavaleurcourantedela
squence.
LapseudocolonneNEXTVALincrmentelasquenceet
retournelanouvellevaleur.

CREATE SEQUENCE SEQUENCE_VOITURE


SEQUENCE VOITURE
START WITH 1
MAXVALUE 10
MINVALUE 10
10
CYCLE;

SELECT SEQUENCE_VOITURE.NEXTVAL FROM DUAL;


Cette commande SQL permet de crer une squence
SEQUENCE_VOITURE commenant la valeur 1 avec un pas
dincrmentation de 1, avec pour valeur maximale 10 et pour valeur
minimale 10.
10 La squence est cyclique,
cyclique si bien que llon
on a la squence
: 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 10, 9, 8, 7, 6,
31

SELECT SEQUENCE
Q
_VOITURE.CURRVAL FROM DUAL;;
Lors de la premire utilisation dun squence, il faut utiliser
NEXTVAL pour llinitialiser.
initialiser. Ensuite, CURRVAL permet d
dobtenir
obtenir la
valeur courante de la squence.
32

Squences:Modification

Squences:Colonneautoincrmente

Syntaxe:
ALTER SEQUENCE nom_de_la_sequence
nom de la sequence
[INCREMENT BY incrment]
[NOMAXVALUE NOMINVALUE | MAXVALUE maximum | MINVALUE
minimum]
[NOCYCLE | CYCLE]

Le principe est le suivant :


crerunesquencequipermettradegnrerdesvaleursentires
uniques
crerunTRIGGERquisedclencherachaqueINSERT,pour
alimenterlechampvouluavecunevaleurunique.
CREATE TRIGGER PK_VOITURE
BEFORE INSERT ON VOITURE FOR EACH ROW
BEGIN

[CACHE nombre_de_valeurs];

SELECT SEQUENCE_VOITURE.NEXTVAL INTO :VOITURE.cle_primaire FROM


DUAL;
DUAL

Exemple :

END;

ALTER SEQUENCE SEQUENCE_VOITURE


Cette commande SQL permet de modifier le pas d
dincrmentation
incrmentation
(valeur : 3) de la squence SEQUENCE_VOITURE.

C
Cett exemple
l ne gre
pas le
l contrle
t l d'unicit
d' i it de
d la
l valeur
l
que l'on
l' va
insrer, mais si le champ n'est aliment QUE par l'utilisation de la
squence qui lui est ddie, et si cette squence n'est pas paramtre
pour reboucler,
reboucler il n
n'yy a pas de raison qu
qu'une
une erreur de cl en double
surgisse...

33

34

INCREMENT BY 3;

PL/SQL:Introduction(1)

PL/SQL:Introduction(2)

PL/SQL est un langage qui intgre SQL et permet de


programmer de manire procdurale.
procdurale Globalement,
Globalement avec
PL/SQL on aura notre disposition un vrai langage de
programmation moins intuitif mais aussi plus puissant
que le SQL. Les 2 langages sont minemment
complmentaires.
complmentaires

Les principaux avantages / inconvnients sont les


suivants :
nedispensepasdeconnatreleSQL;
permetletraitementparblocdeSQLetdoncoptimise
permet le traitement par bloc de SQL et donc optimise
letraficrseau;
ll'utilisation
utilisationdevariabledestockageetdetypesimple
de variable de stockage et de type simple
etstructurdynamique(%TYPE,%ROWTYPE,);
destraitementspluscomplexes,notammentpourla
des traitements plus complexes notamment pour la
gestiondescasparticuliersetdeserreurs(traitement
des exceptions) ;
desexceptions);
unparamtrageetlacrationd'ordresSQL
dynamiques.
dynamiques

35

36

PL/SQL:Introduction(3)

PL/SQL:OrdresSQLsupports

Le PL/SQL peut tre utilis sous 3 formes :


unblocdecode,excutcommeunecommandeSQL,
bl d
d

d
viauninterprteurstandard
unfichierdecommandePL/SQL
unprogrammestock(procdure,fonction,package
p g
(p
,
,p
g
outrigger)

Les instructions du langage de manipulation de donnes


(LMD) et certaines instructions de gestion de
transaction, savoir :
INSERT,UPDATE,DELETE,SELECT;
I S
U A
L
S L C
COMMIT,ROLLBACK,SAVEPOINT.

37

38

PL/SQL:Blocsetsections(1)

PL/SQL:Blocsetsections(2)

Les blocs de code s'appellent galement des blocs


anonymes Ils commenceront simplement par un 'BEGIN'
anonymes.
BEGIN
ou un 'DECLARE'. Ils sont composs de 1 3 sections :

Le bloc prcdent est le plus petit bloc PL/SQL au


monde Le bloc ne peut pas tre vide et doit contenir au
monde.
moins une instruction
Syntaxe de bloc en PL/SQL (avec des exceptions)
DECLARE mes dclarations de variables
BEGIN dbut de la section excutable

La section 'EXCEPTION',
EXCEPTION , quand elle est prsente, est
incluse dans la section et NON PAS la suite de celle ci.
BEGIN

mes ordres
d SQL ett PL/SQL
EXCEPTION
mon traitement des exceptions

NULL;

END;; la ffin du bloc excutable

END;
END
39

40

PL/SQL:Blocsetsections(3)

PL/SQL:Blocsetsections(4)

Afin de pouvoir utiliser une exception, il faut tout dabord dclarer une
variable dexception dans la partie DECLARE (ex : DECLARE erreur
EXCEPTION;).
Ensuite, dans la partie entre le BEGIN et le END, pour appeler une
exception et stopper le bloc PL/SQL,
PL/SQL on utilise la commande RAISE
nom_exception (ex : RAISE erreur;). Cette commande stoppe le bloc
PL/SQL et va dans la partie EXCEPTION.
Dans cette partie, pour afficher un message derreur, on utilise la
commande suivante :
WHEN nom_exception THEN

Les exceptions prdfinies sont :


NO_DATA_FOUND:casol
NO DATA FOUND : cas o lon
onn
naaaucunedonnelasortie
aucune donne la sortie
dunSELECT.
TO_MANY_ROWS:casol
TO MANY ROWS : cas o lon
onatropdedonneslasortie
a trop de donnes la sortie
dunSELECT.
VALUE_ERROR:casol
VALUE ERROR : cas o lon
onauneerreurdevaleur.
a une erreur de valeur.
ZERO_DIVIDE:casdunedivisionparzro.
INVALIDE_NUMBER:casd
INVALIDE NUMBER : cas dun
unnombreinvalide.
nombre invalide.

RAISE_APPLICATION_ERROR ( numero_erreur , message );


numero_erreur :reprsentelenumrodelerreurutilisateur.Ce

l
d l
ili
numrodoittrecomprisentre20000et20999.
message:chanedecaractresdunelongueurmaximalede2048
g
g
octetsquicontientlemessageassocilerreur.
41

42

PL/SQL:Procduresstockes(1)

PL/SQL:Procduresstockes(2)

Une procdure est simplement un programme PL/SQL nomm,


compil et stock dans la base.
base

Ce code est une commande SQL, qui cre la procdure PL/SQL, et donc
compile et stocke dans la base le bloc PL/SQL compris entre le BEGIN et
le END,
END en le rfrenant par nom_de_procdure.
nom de procdure Et pour excuter cette
procdure de manire autonome, on utilise la commande : EXECUTE
nom_de_procdure. Les paramtres dentre doivent tre dclars (nom
et type).
type)

Syntaxe de procdure en PL/SQL (avec des exceptions)


CREATE [OR REPLACE] PROCEDURE nom_de_procdure ( par1 type1,
par2 type2, )

CREATE OR REPLACE PROCEDURE Client (nom VARCHAR2,


VARCHAR2 ville
VARCHAR2)
IS
BEGIN
(
,
,
)
INSERT INTO CLIENTS (numclient,nomclient,villeclient)
VALUES (SEQUENCE_NUM_CLIENT.NEXTVAL, nom, ville);
COMMIT;
END;

IS
BEGIN
mes ordres SQL et PL/SQL
EXCEPTION
mon traitement des exceptions
END;
43

44

PL/SQL:Fonctionsstockes(1)

PL/SQL:Fonctionsstockes(2)

Une fonction est une procdure retournant une valeur.


CREATE [OR REPLACE] FUNCTION nom_de_fonction
d f
i
( par1
1 type1,
1
par2 type2, )

Ce code est une commande SQL, qui cre la fonction PL/SQL, et donc
compile et stocke dans la base le bloc PL/SQL compris entre le BEGIN et
le END,
END en le rfrenant par nom_de_fonction.
nom de fonction La valeur retourne en
sortie correspond la variable_de_sortie dont le type est type_de_sortie.
Les paramtres dentre doivent tre dclars (nom et type).

RETURN type_de_sortie IS variable_de_sortie type_de_sortie


CREATE OR REPLACE FUNCTION solde (numero NUMBER)

IS

RETURN REAL IS le_solde REAL

BEGIN

BEGIN

mes ordres SQL et PL/SQL

SELECT solde
l INTO le_solde
l
l

EXCEPTION

FROM clients

mon traitement des exceptions

WHERE numclient
li
= numero;

END;

RETURN le_solde;
END;
END
45

46

PL/SQL:Fonctionsstockes(3)

PL/SQL:Triggers(1)

C
Cette commande
d permet de
d crer
une fonction
f
i nomme
solde,
ld
dont le paramtre dentre est le numro de client. La fonction
permet de retourner en sortie,
sortie dans la variable relle le_solde,
le solde le
solde du compte du client identifi par numero. Pour appeler cette
fonction et utiliser son rsultat au sein dun ordre SQL, il suffit
dexcuter la commande suivante : SELECT solde(1000) FROM
DUAL.

Les dclencheurs (Triggers) sont des procdures stockes


appartenant une table prcise et ss'excutant
excutant
lorsqu'une action spcifique se produit sur la table
concerne Le dclenchement d
concerne.
d'une
une telle procdure
s'effectue subsquemment une instruction de
manipulation de donnes (DML) comme INSERT,
INSERT DELETE
ou UPDATE. Il existe donc trois types de dclencheurs :
sur insertion,
insertion sur mise jour et sur suppression.
suppression

47

48

PL/SQL:Triggers(2)

PL/SQL:Triggers(3)

Une table peut comporter plusieurs dclencheurs d'un


type donn,
donn condition que chacun possde un nom
diffrent. Cependant, un dclencheur donn ne peut
tre assign qu
qu' une seule et unique table tout en
s'appliquant la fois, l'insertion, la mise jour et la
suppression d
d'enregistrements
enregistrements sur la table en question.
question
Une table ne peut possder qu'un seul dclencheur
INSTEAD OF d
d'un
un type donn.
donn

Les dclencheurs se produisent soit aprs (AFTER), soit avant (BEFORE)


une instruction DML:

49

50

PL/SQL:Triggers(4)

Un dclencheur sur INSERT s'excute chaque opration d'insertion


lance par ll'utilisateur
utilisateur ou par un programme. Lors d
d'une
une insertion,
l'enregistrement est insr la fois dans la table cible est dans une
table temporaire dnomme inserted. Une telle table peut
permettre de vrifier la cohrence des enregistrements.
p
g
Un dclencheur sur DELETE s'excute chaque opration de
suppression lance par l'utilisateur ou un programme. Lors d'une
suppression,
pp
, l'enregistrement
g
est supprim
pp
physiquement
p
y q
de la table
cible et l'insre dans une table temporaire dnomme deleted. Cela
peut permettre de rcuprer l'enregistrement supprim.
Un dclencheur sur U
UPDATE s'excute chaque
q opration
p
de mise
jour lance par l'utilisateur ou par un programme. Lors d'une mise
jour, l'ancien enregistrement est supprim et insr dans la table
temporaire deleted, tandis que le nouveau est insr la fois dans la
table cible et dans la table inserted.

PL/SQL:Triggers(5)

La suppression des dclencheurs s'effectue par l'intermdiaire de l'instruction


DROP.

DROP TRIGGER nom_trigger1 [,, nom_triggerN ];

La modification des dclencheurs s'effectue par l'intermdiaire de l'instruction


y
complte
p
de la commande ALTER TRIGGER est en fait
ALTER. La syntaxe
identique celle de CREATE TRIGGER.

ALTER TRIGGER nom_trigger


ON nom_table
bl
FOR INSERT | UPDATE | DELETE
AS instruction_SQL;
instruction SQL ;

Tous les dclencheurs (ALL) ou certains peuvent tre activs (ENABLE) ou


dsactivs (DISABLE) au moyen de l'instruction ALTER TABLE.

ALTER TABLE
nom_table { ENABLE | DISABLE } TRIGGER
{ ALL | nom_trigger1 [,,nom_triggerN]};
51

52

PL/SQL:Triggers(6)

PL/SQL:Triggers(7)

Notation (les lments entre [ ] sont optionnels) :


LacommandeORREPLACErecreledclencheurs'ilexistedj.
La commande OR REPLACE recre le dclencheur s'il existe dj
LaclauseBEFOREindiquequeledclencheurdoittrelancavant
l'excutiondel'vnement.
LaclauseAFTERindiquequeledclencheurdoittrelancaprs
La clause AFTER indique que le dclencheur doit tre lanc aprs
l'excutiondel'vnement.
LesinstructionsINSERTetDELETEindiquentaudclencheurdes'excuter
lors respectivement d'une
lorsrespectivementd
uneinsertionoud
insertion ou d'une
unesuppressiondanslatable.
suppression dans la table
LaclauseUPDATEOFindiquequeledclencheurdoittrelanclorsde
chaquemisejourd'unedescolonnesspcifies.Sielleestomise,
p
q
p
q
n'importequellecolonnedelatablemodifieprovoqueledclenchement
duTrigger.
LaclauseONdsignelenomdelatableassocisonschmapourlequelle
dclencheuratspcifiquementcr.
LaclauseFOREACHROWPrcisesilaprocduredudclencheurdoittre
lancepourchaqueligneaffecteparl'vnementousimplementpour
chaqueinstructionSQL. FOREACHSTATEMENT estlavaleurpardfaut..

Cette commande SQL permet de crer deux tables puis cre un


dclencheur qui insre un champ Log lintrieur de DELETE_LOG,
puis
i chaque
h
li
ligne
supprime
i dans
d
l table
la
t bl TABLE_1.
TABLE 1

53

PL/SQL:Triggers(8)

54

PL/SQL:Triggers(9)

Cette commande SQL permet de crer deux tables TABLE_1 et TABLE_2 puis
cre un dclencheur qui insre un enregistrement llintrieur
intrieur de la Table_2
Table 2
lorsquune opration dinsertion sest accomplie dans Table_2. Le
dclencheur vrifie si le nouvel enregistrement possde un premier
composant
p
infrieur ou gal
g 10 et si c'est le cas,, inverse les
enregistrements l'intrieur de TABLE_2. Les variables spciales NEW et
OLD sont disponibles pour se rfrer respectivement des nouveaux ou
d'anciens enregistrements. Les deux points (:) prcdent NEW et OLD dans
VALUES sont dans ce cas obligatoires, par contre dans la clause
conditionnelle WHERE , ils doivent tre omis
55

56

PL/SQL:Curseurs(1)

PL/SQL:Curseurs(2)

Les curseurs sont des pointeurs sur une zone mmoire


pour les donnes extraites de la base.
base Il existe des
curseurs implicites et explicites. Oracle ouvre toujours un
curseur implicite
p
pour traiter une instruction SQL,
p
Q , celuici
ne se rapporte qu la dernire instruction SQL excute
et il se nomme SQL . Le curseur contient des attributs
(%NOTFOUND, %FOUND, %ROWCOUNT) qui fournissent
des informations sur lexcution des instructions INSERT,
UPDATE DELETE,
UPDATE,
DELETE SELECT INTO.
INTO Un
U curseur implicite
i li it pour
une instruction SELECT INTO ne peut grer quune seule
ligne Le curseur explicite quant lui place le rsultat
ligne.
dune requte multilignes dans un tampon mmoire et
libre
b e les
es lignes
g es les
es u
unes
es ap
aprs
s les
es au
autres
es lors
o s du
traitement.

Le curseur se dfinit dans la partie dclarative du bloc PL/SQL (la


requte nest pas excute ce momentl). Dans cette
d l
dclaration,
i
il est possible
ibl de
d donner
d
une clause
l
FOR UPDATE OF
nom_colonne(s) qui permet de verrouiller les lignes slectionnes
(aucun autre utilisateur ne peut mettre jour tant que le verrou
nest pas retir).
) La commande OPEN nom_curseur excute la
requte et place le curseur en mmoire, elle ne retourne aucun
rsultat. Linstruction FETCH nom_curseur INTO variable extrait la
ligne courante du curseur, la place dans une variable et fait
avancer le curseur la ligne suivante. Pour parcourir toutes les
lignes
g
du curseur,, il faut utiliser une boucle LOOP. La clause
CURRENT OF nom_curseur est utilise dans le WHERE dune
commande UPDATE pour modifier la ligne courante (si un FOR
UPDATE a t utilis p
pralablement).
) Larrt de la boucle est
obtenu grce nom_curseur%NOTFOUND qui retourne false sil
ne reste plus de lignes. Pour librer lespace mmoire, il faut
fermer explicitement le curseur en utilisant C
CLOSE
OS nom_curseur.
nom curseur.

57

58

PL/SQL:Curseurs(3)

PL/SQL:Curseurs(4)

Un curseur peut accepter des paramtres en entre, ils servent


passer des informations au curseur et sont gnralement utiliss
dans un WHERE pour limiter la requte. Les paramtres ont un
type associ qui ne peut pas avoir dindication de longueur. Ils sont
passs lors de la commande OPEN.

Syntaxe de la commande DECLARE CURSOR en SQL

Il est galement possible de passer des paramtres un curseur.


Suite au DECLARE,
DECLARE on trouve la dclaration des variables utiles au
curseur en les dfinissant par nom table.attribut%TYPE.

59

60

PL/SQL:Curseurs(5)

PL/SQL:Langage(1)
Dclaration, initialisation des variables

La commande SQL cre un curseur dont les paramtres d


dentre
entre sont le nom et le
salaire dun employ. La structure de slection permet de rcuprer la liste des
employs (numro, nom, mtier) et de leur salaire. Dans la structure BEGINEND,
on retrouve lopration douverture du curseur suivi de la commande FETCHINTO
quii permett dextraire
d t i les
l diffrentes
diff t lignes
li
d tuples
des
t l renvoy par la
l structure
t t
d
de
slection afin de les sauvegarder dans les variables employe et salaire dfinies dans
la dclaration du curseur. L'attribut Oracle %NOTFOUND retourne FALSE si la
g
ou TRUE en cas d'chec. Suite
dernire instruction FETCH renvoie un enregistrement
la fin de son utilisation, le curseur peut tre ferm afin de ne plus consommer de
ressources .

Identificateurs Oracle :
30caractresauplus
p
commenceparunelettre
peutcontenirlettres,chiffres,_,$et#
peut contenir lettres chiffres $ et #
passensiblelacasse
Portehabituelledeslangagesblocs
Doiventtredclaresavantdtreutilises

61

PL/SQL:Langage(2)

62

PL/SQL:Langage(3)

Dclaration, initialisation des variables

Initialisation de variables

Dclaration
D l ti ett initialisation
i iti li ti

Plusieurs faons de donner une valeur une variable


Oprateurdaffectation
p

Nom_variable type_variable := valeur;


Initialisation

n :=
DirectiveINTOdelarequteSELECT
Di ti INTO d l
t SELECT

Nom_variable := valeur;;
Dclaration multiple interdite

Exemples :
dateNaissance :=
to_date(10/10/2004,DD/MM/YYYY);
( / /
, /
/
);
SELECTnomINTOv_nom FROMemp WHEREmatr =
509;
509;

Exemples :
age integer;
nomvarchar(30);
nom varchar(30)
dateNaissance date;
okboolean
kb l
:=true;
t
63

64

PL/SQL:Langage(4)

PL/SQL:Langage(5)

SELECT INTO

Le type de variables

SELECT expr1,expr2, INTO var1, var2,

VARCHAR2
Longueurmaximale:32767octets
g
Syntaxe:Nom_variable VARCHAR2(30);
Exemple:nameVARCHAR2(30);nameVARCHAR2(30)
Exemple: name VARCHAR2(30); name VARCHAR2(30)
:=toto;

Met des valeurs de la BD dans une ou plusieurs variables


var1, var2,
Le select ne doit retourner
reto rner quune seule ligne
Avec Oracle il nest pas possible dinclure un select sans
into dans une procdure
Pour retourner plusieurs lignes, voir la suite du cours sur
les curseurs.

NUMBER(long,dec)
Long:longueurmaximale
Dec :longueurdelapartiedcimale
Exemple:num_tel
Exemple: num tel number(10);toto
number(10); toto
number(5,2)=142.12;

65

66

PL/SQL:Langage(6)

PL/SQL:Langage(7)

Le type de variables

Le type de variables

VARCHAR2
Longueurmaximale:32767octets
g
Syntaxe:Nom_variable VARCHAR2(30);
Exemple:nameVARCHAR2(30);nameVARCHAR2(30)
Exemple: name VARCHAR2(30); name VARCHAR2(30)
:=toto;

DATE
PardfautDDMONYY(18DEC02)
(
)
FonctionTO_DATE
Exemple:start_date
Exemple: start date :=to_date(
:= to date(29
29SEP2003
SEP 2003DD
, DD
MONYYYY);start_date :=to_date(29SEP
2003:13:01DD
2003:13:01
, DDMONYYYY:HH24:MI
MON YYYY:HH24:MI);
);

NUMBER(long,dec)
Long:longueurmaximale
Dec :longueurdelapartiedcimale
Exemple:num_tel
Exemple: num tel number(10);toto
number(10); toto
number(5,2)=142.12;

BOOLEAN
TRUE
FALSE
FALSE
NULL
67

68

PL/SQL:Langage(8)

PL/SQL:Langage(9)

Dclaration %TYPE et %ROWTYPE

Exemple dutilisation

On peut dclarer quune variable est du mme type


quune colonne dune table ou (ou quune autre variable)
Exemple:v_nom emp.nom.%TYPE;

DECLARE

Une variable peut contenir toutes les colonnes d


dune
une
ligne dune table
Exemple:v_employe
E
l
l
emp%ROWTYPE;
%ROWTYPE
dclarequelavariablev_employe contiendraune
lignedelatableemp

BEGIN

v_employe emp%ROWTYPE;
v_nom emp.nom%TYPE;
SELECT * INTO v_employe FROM emp WHERE matr = 900;
v nom := v_employe.nom;
v_nom
v employe nom;
v_employe.dept := 20;

INSERT into emp VALUES v_employe;


END;

69

70

PL/SQL:Langage(10)

PL/SQL:Langage(11)

Test conditionnel

Test conditionnel

IFTHEN
IF THEN

IFTHENELSIF

IF v_date > 11-APR-03 THEN

IF v_nom
_
= PAKER THEN

v_salaire := v_salaire * 1.15;

v_salaire := v_salaire * 1.15;

END IF;

ELSIF v_nom
v nom = ASTROFF
ASTROFF THEN

IFTHENELSE

v_salaire := v_salaire * 1.05;

IF v_date
v date > 11
11-APR-03
APR 03 THEN

END IF;

v_salaire := v_salaire * 1.15;


ELSE
v_salaire := v_salaire * 1.05;
END IF;
71

72

PL/SQL:Langage(12)

PL/SQL:Langage(13)

Test conditionnel

Les boucles

CASE

LOOP

CASE
WHEN
WHEN
ELSE
END;

instructions excutables;

slecteur
expression1 THEN rsultat1
expression2 THEN rsultat2
rsultat3
s ltat3

EXIT [WHEN condition];


instructions excutables;
END LOOP;

Obligation dutiliser la commande EXIT pour viter une


quand une condition est
boucle infinie,, facultativement q
vraie.

Exemple
E
l
val := CASE city
WHEN TORONTO THEN RAPTORS

WHILE condition LOOP

WHEN LOS ANGELES THEN LAKERS

instructions excutables;

ELSE NO TEAM

END LOOP;

END;
73

74

PL/SQL:Langage(14)

PL/SQL:Langage(15)

Les boucles

Affichage

FOR variable IN debut..fin

Activer le retour cran sous sqlplus


setserveroutput
set serveroutput onsize10000
on size 10000

LOOP
instructions;
END LOOP;

La variable de boucle prend successivement les valeurs de


dbut, debut+1, debut+2, , jusqu la valeur fin.

Affichage
dbms_output.put_line(chane);
Utiliser||pourfaireuneconcatnation
Utili ||
f i
t ti

On
O pourra galement
l
t utiliser
tili un curseur dans
d
l clause
la
l
IN
IN.

75

76

PL/SQL:Langage(16)

PL/SQL:Langage(17)

Exemple

Exemple
DECLARE

DECLARE

nb integer;

i number(2);

BEGIN

BEGIN

delete from emp where matr in (600, 610);

FOR i IN 1..5 LOOP

nb
b := sql%rowcount;
l%
t

dbms_output.put_line(Nombre : || i );

dbms_output.put_line('nb = ' || nb);

END LOOP;

END;

END;

77

78

PL/SQL:Langage(18)

PL/SQL:Langage(19)

Exemple

Exemple

DECLARE

DECLARE

compteur number(3);

compteur number(3);

i number(3);

i number(3);

BEGIN

BEGIN

select
l
count(*)
(*) into
i
compteur from
f
clients;
li

select
l
count(*)
(*) into
i
compteur from
f
clients;
li

FOR i IN 1..compteur LOOP

FOR i IN 1..compteur LOOP

dbms_output.put_line('Nombre : ' || i );

dbms_output.put_line('Nombre : ' || i );

END LOOP;

END LOOP;

END;

END;
79

80

PL/SQL:Applications(1)

PL/SQL:Applications(2)

Soit le schma suivant:

Exercice 1:

VOL (VolNum, #PlNum, #AvNum, VilleDep, VilleArr,


H
HeureDep,
D
H
HeureArr)
A )

Dans un bloc PL/SQL anonyme, dclarer un curseur


permettant de lire les donnes suivantes: numro
de vol, numro davion, heure de dpart et heure
darrive
d
arrive des vols pour lesquels llavion
avion utilis est le
n 1,2,4 ou 8. Pour chaque vol lu par le curseur,
calculer
l l le
l temps de
d vol.l

81

82

AVION (AvNum,
(AvNum AvNom,Capacite,
AvNom Capacite Localisation)
PILOTE ((PlNum,, PlNom,, PlPrenom,, Ville,, Salaire))

PL/SQL:Applications(3)

PL/SQL:Applications(4)

Solution:

Exercice 2:

DECLARE
C
CURSOR avamodif IS
SELECT VolNum,
V lN
A N
AvNum,
H
HeureDep,
D
H
HeureArr
A
FROM VOL WHERE
AvNum IN (1,2,4,8);
volmod avamodif%ROWTYPE;
Tvol REAL;

Afficher le contenu de la table.


Ajouter un Pilote

BEGIN

Supprimer
S
i
un Pilote
Pil

FOR volmod IN avamodif LOOP


Tvol:= volmod.HeureArr volmod.HeureDep;
DBMS_OUTPUT.put_line (Le vol n || volmod.VolNum
dur || Tvol);

On dsire mettre en place un paquetage logiciel


permettant de grer la table PILOTE.

|| a

Modifier un Pilote
Compter les Pilotes

END LOOP;
END
83

84

PL/SQL:Applications(5)
Solution:
CREATE OR REPLACE PACKAGE Pilotes AS
CURSOR les_pilotes RETURN PilNuplet IS SELECT FROM PILOTE;
PROCEDURE afficher IS
t PilNuplet;
BEGIN
FOR t IN les_p
pilotes LOOP
DBMS_OUTPUT.put_line (t.num || || t.prenom || || t. nom);
END LOOP
END;
Procedure ajouter (num,
(num INTEGER,
INTEGER nom VARCHAR,
VARCHAR prenom VARCHAR) IS
BEGIN
85