Académique Documents
Professionnel Documents
Culture Documents
Leçon D'SQL Gratiute
Leçon D'SQL Gratiute
Langage SQL
version 5.7 du polycopi
Richard Grin
4 janvier 2008
Introduction
1.1
Prsentation de SQL
. . . . . . . . . . . . . . . . . . . . . . .
1.2
Normes SQL . . . . . . . . . . . . . . . . . . . . . . . . . . . .
1.3
Utilitaires associs
1.4
Connexion et dconnexion
. . . . . . . . . . . . . . . . . . . .
1.5
1.5.1
Identicateurs . . . . . . . . . . . . . . . . . . . . . . .
1.5.2
Tables
. . . . . . . . . . . . . . . . . . . . . . . . . . .
1.5.3
Colonnes . . . . . . . . . . . . . . . . . . . . . . . . . .
Types de donnes . . . . . . . . . . . . . . . . . . . . . . . . .
1.6.1
Types numriques . . . . . . . . . . . . . . . . . . . . .
1.6.2
1.6.3
Types temporels
. . . . . . . . . . . . . . . . . . . . .
1.6.4
Types binaires . . . . . . . . . . . . . . . . . . . . . . .
1.6.5
Valeur NULL
. . . . . . . . . . . . . . . . . . . . . . .
1.7
Slections simples . . . . . . . . . . . . . . . . . . . . . . . . .
1.8
Expressions
. . . . . . . . . . . . . . . . . . . . . . . . . . . .
1.8.1
1.8.2
Expressions NULL
1.6
vi
. . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . .
11
2.1
. . . . . . . . . . . . . . . . . . . . . . .
11
2.2
Contrainte d'intgrit . . . . . . . . . . . . . . . . . . . . . . .
12
2.2.1
Types de contraintes
. . . . . . . . . . . . . . . . . . .
12
2.2.2
15
2.2.3
15
ii
. . . . . . . . . . . . .
iii
Insertion . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
19
3.2
Modication . . . . . . . . . . . . . . . . . . . . . . . . . . . .
20
3.3
Suppression
21
3.4
19
. . . . . . . . . . . . . . . . . . . . . . . . . . . .
Transactions . . . . . . . . . . . . . . . . . . . . . . . . . . . .
22
3.4.1
. . . . . . . . . . . . .
22
3.4.2
23
3.4.3
24
. . . . . . . . . . . . .
Interrogations
26
4.1
Syntaxe gnrale
. . . . . . . . . . . . . . . . . . . . . . . . .
26
4.2
Clause SELECT . . . . . . . . . . . . . . . . . . . . . . . . . .
26
4.2.1
. . . . . . . . . . . . . . . . .
27
4.2.2
Pseudo-colonnes . . . . . . . . . . . . . . . . . . . . . .
28
4.3
Clause FROM . . . . . . . . . . . . . . . . . . . . . . . . . . .
29
4.4
Clause WHERE . . . . . . . . . . . . . . . . . . . . . . . . . .
31
4.5
4.6
4.4.1
31
4.4.2
Oprateurs logiques . . . . . . . . . . . . . . . . . . . .
33
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
33
4.5.1
Jointure
Jointure naturelle . . . . . . . . . . . . . . . . . . . . .
35
4.5.2
35
4.5.3
Jointure externe . . . . . . . . . . . . . . . . . . . . . .
36
4.5.4
. . . . . . . . . . . . . . . . . . . .
37
Sous-interrogation . . . . . . . . . . . . . . . . . . . . . . . . .
38
4.6.1
38
4.6.2
39
4.6.3
Sous-interrogation synchronise
40
4.6.4
. . . .
41
4.6.5
Clause EXISTS . . . . . . . . . . . . . . . . . . . . . .
41
. . . . . . . . . . . . .
4.7
Fonctions de groupes . . . . . . . . . . . . . . . . . . . . . . .
45
4.8
Clause GROUP BY . . . . . . . . . . . . . . . . . . . . . . . .
45
4.9
Clause HAVING
. . . . . . . . . . . . . . . . . . . . . . . . .
47
. . . . . . . . . . . . . . . . . . . . . . . . . . . . .
47
4.10 Fonctions
. . . . . . . . . . . . . . . . .
48
. . . . . . . . . . . . .
48
51
51
53
53
. . . . . . . . . . . . . . . . . . . . .
54
. . . . . . . . . . . . . . . . . . . .
55
iv
55
. . . . . . . . . . . . . . . . . . .
55
55
56
56
. . . . . . . . . . . . . . . . . . . . . .
59
5.1
Schma
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
59
5.2
Tables
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
59
5.3
5.4
5.5
5.6
5.7
5.2.1
CREATE TABLE AS
5.2.2
ALTER TABLE . . . . . . . . . . . . . . . . . . . . . .
60
5.2.3
62
5.2.4
62
Vues
. . . . . . . . . . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
59
62
5.3.1
CREATE VIEW
. . . . . . . . . . . . . . . . . . . . .
63
5.3.2
DROP VIEW . . . . . . . . . . . . . . . . . . . . . . .
64
5.3.3
64
5.3.4
65
Index . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
66
5.4.1
CREATE INDEX . . . . . . . . . . . . . . . . . . . . .
66
5.4.2
67
5.4.3
DROP INDEX
. . . . . . . . . . . . . . . . . . . . . .
68
5.4.4
Types d'index . . . . . . . . . . . . . . . . . . . . . . .
68
5.4.5
69
. . . . . . . . . . . . . . . . . . . . .
70
5.5.1
70
5.5.2
Autres solutions . . . . . . . . . . . . . . . . . . . . . .
71
5.5.3
Squences
71
. . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . .
73
5.6.1
Procdure stocke . . . . . . . . . . . . . . . . . . . . .
73
5.6.2
Fonction stocke
74
5.6.3
Tables du dictionnaire
Triggers
. . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . .
75
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
75
5.7.1
Types de triggers . . . . . . . . . . . . . . . . . . . . .
77
5.7.2
Exemple . . . . . . . . . . . . . . . . . . . . . . . . . .
77
5.7.3
. . . . . . . . . . .
78
5.7.4
Clause WHEN
. . . . . . . . . . . . . . . . . . . . . .
78
5.7.5
Triggers INSTEAD OF . . . . . . . . . . . . . . . . . .
79
5.7.6
Dictionnaire de donnes
. . . . . . . . . . . . . . . . .
80
5.8
Dictionnaire de donnes
. . . . . . . . . . . . . . . . . . . . .
81
5.9
82
5.9.1
GRANT . . . . . . . . . . . . . . . . . . . . . . . . . .
5.9.2
REVOKE
5.9.3
. . . . . . . . . . . . . .
83
5.9.4
Synonyme . . . . . . . . . . . . . . . . . . . . . . . . .
84
5.9.5
84
. . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . .
6.3
6.4
6.5
83
86
. . . . . . . . . . . . . .
86
6.1.1
. . . . . . . . . . . . . . . . . . .
86
6.1.2
87
6.1.3
6.1.4
6.2
82
hrente . . . . . . . . . . . . . . . . . . . . . . . . . . .
87
Lignes fantmes . . . . . . . . . . . . . . . . . . . . . .
88
88
6.2.1
88
6.2.2
Niveaux d'isolation . . . . . . . . . . . . . . . . . . . .
89
90
6.3.1
Traitement pessimiste
. . . . . . . . . . . . . . . . . .
90
6.3.2
Traitement optimiste . . . . . . . . . . . . . . . . . . .
91
. . . . . . . . . .
92
. . . . . . . . . . . . . . . . . . . . . . . .
94
. . . . . . . . . . . . . . .
95
Prsentation du polycopi
Ce polycopi prsente le langage SQL. Il ne suppose que quelques connaissances de base exposes dans le polycopi d'introduction aux bases de donnes.
Les exemples ont t tests avec le SGBD Oracle, version 10g mais n'utilisent qu'exceptionnellement les particularits de ce SGBD par rapport aux
normes SQL.
Ce cours concerne la norme SQL2. SQL3, le relationnel-objet et l'interface
avec le langage Java sont tudis dans un autre cours.
Les remarques et les corrections d'erreurs peuvent tre envoyes par courrier lectronique l'adresse grin@unice.fr, en prcisant le sujet Poly
SQL et la version du document.
vi
Chapitre 1
Introduction
1.1 Prsentation de SQL
SQL signie Structured Query Language c'est--dire Langage d'interrogation structur.
En fait SQL est un langage complet de gestion de bases de donnes relationnelles. Il a t conu par IBM dans les annes 70. Il est devenu le langage
standard des systmes de gestion de bases de donnes (SGBD) relationnelles
(SGBDR).
C'est la fois :
un langage d'interrogation de la base (ordre SELECT)
un langage de manipulation des donnes (LMD ; ordres UPDATE, INSERT, DELETE)
un langage de dnition des donnes (LDD ; ordres CREATE, ALTER,
DROP),
un langage de contrle de l'accs aux donnes (LCD ; ordres GRANT,
REVOKE).
Le langage SQL est utilis par les principaux SGBDR : DB2, Oracle,
Informix, Ingres, RDB,... Chacun de ces SGBDR a cependant sa propre variante du langage. Ce support de cours prsente un noyau de commandes
disponibles sur l'ensemble de ces SGBDR, et leur implantation dans Oracle
Version 7.
CHAPITRE 1.
INTRODUCTION
1.5.
ORACLE_SID
donne le nom de la
EXIT (ou
Identicateurs
SQL utilise des identicateurs pour dsigner les objets qu'il manipule :
utilisateurs, tables, colonnes, index, fonctions, etc.
Un identicateur est un mot form d'au plus 30 caractres, commenant
obligatoirement par une lettre de l'alphabet. Les caractres suivants peuvent
tre une lettre, un chire, ou l'un des symboles
# $
et
_.
1.5.2
Tables
Remarques 1.1
(a) Selon la norme SQL-2, le nom d'une table devrait tre prcd d'un
nom de schma (voir 5.1).
CHAPITRE 1.
INTRODUCTION
(b) Il est d'usage (mais non obligatoire videmment) de mettre les noms
de table au singulier : plutt EMPLOYE que EMPLOYES pour une
table d'employs.
Exemple 1.1
Table DEPT des dpartements :
DEPT
NOMD
LIEU
10
FINANCES
PARIS
20
RECHERCHE
GRENOBLE
30
VENTE
LYON
40
FABRICATION
ROUEN
Table DUAL
C'est une particularit d'Oracle. Cette pseudo-table ne contient qu'une
seule ligne et une seule colonne et ne peut tre utilise qu'avec une requte
select.
Elle permet de faire acher une expression dont la valeur ne dpend
d'aucune table en particulier.
Exemple 1.2
Acher la date d'aujourd'hui, le nom de l'utilisateur et le rsultat d'un
calcul :
Colonnes
Les donnes contenues dans une colonne doivent tre toutes d'un mme
type de donnes. Ce type est indiqu au moment de la cration de la table
qui contient la colonne (voir 2.1).
Chaque colonne est repre par un identicateur unique l'intrieur de
chaque table. Deux colonnes de deux tables direntes peuvent porter le
mme nom. Il est ainsi frquent de donner le mme nom deux colonnes
de deux tables direntes lorsqu'elles correspondent une cl trangre la
cl primaire rfrence. Par exemple, la colonne Dept des tables DEPT et
EMP.
Une colonne peut porter le mme nom que sa table.
Le nom complet d'une colonne est en fait celui de sa table, suivi d'un
point et du nom de la colonne. Par exemple, la colonne DEPT.LIEU
Le nom de la table peut tre omis quand il n'y a pas d'ambigut sur la
table laquelle elle appartient, ce qui est gnralement le cas.
1.6.
TYPES DE DONNES
Types numriques
SMALLINT
DECIMAL(p, d )
correspond
Exemple 1.3
SALAIRE DECIMAL(8,2)
dnit une colonne numrique SALAIRE. Les valeurs auront au maximum 2 dcimales et 8 chires au plus au total (donc 6 chires avant le
point dcimal).
Les constantes numriques ont le format habituel : -10, 2.5, 1.2E-8 (ce
8
dernier reprsentant 1.2 x 10 ).
CHAPITRE 1.
INTRODUCTION
Si le paramtre dcimales n'est pas spci, 0 est pris par dfaut. La valeur
128
absolue du nombre doit tre infrieure 10
. NUMBER est un nombre
virgule ottante (on ne prcise pas le nombre de chires aprs la virgule) qui
peut avoir jusqu' 38 chires signicatifs.
L'insertion d'un nombre avec plus de chires que taille_maxi sera refuse
(taille_maxi ne prend en compte ni le signe ni le point dcimal). Les dcimales seront ventuellement arrondies en fonction des valeurs donnes pour
taille_maxi et dcimales.
1.6.2
'aujourd''hui'.
Il existe deux types pour les colonnes qui contiennent des chanes de
caractres :
le type
constante.
La dclaration de type chane de caractres de longueur constante a le
format suivant :
CHAR(longueur )
VARCHAR
gueurs variables.
On dclare ces colonnes par :
VARCHAR(longueur )
VARCHAR2
VARCHAR
s'appelle
1.6.
TYPES DE DONNES
1.6.3
Types temporels
Remarque 1.2
Ne pas oublier de donner 4 chires pour l'anne, sinon la date risque
d'tre mal interprte par Oracle (voir remarque 4.12 page 51).
1.6.4
Types binaires
Ce type permet d'enregistrer des donnes telles que les images et les sons,
de trs grande taille et avec divers formats.
SQL-2 fournit les types BIT et BIT VARYING (longueur constante ou
non).
Les dirents SGBD fournissent un type pour ces donnes mais les noms
varient :
LONG RAW pour Oracle, mais IMAGE pour Sybase, BYTE pour Informix,
etc.
Nous n'utiliserons pas ce type de donnes dans ce cours.
CHAPITRE 1.
1.6.5
INTRODUCTION
Valeur NULL
Une colonne qui n'est pas renseigne, et donc vide, est dite contenir la
valeur NULL. Cette valeur n'est pas zro, c'est une absence de valeur. Voir
aussi 1.8.2.
Exemples 1.4
(a)
(b)
(c)
Exemple 1.5
=, !=
(dirent),
1.8.
EXPRESSIONS
1.8 Expressions
1.8.1
Les expressions acceptes par SQL portent sur des colonnes, des constantes,
des fonctions.
Ces trois types d'lments peuvent tre relis par des oprateurs arithmtiques (+
- * /),
des chanes), des dates (- donne le nombre de jours entre deux dates).
/,
puis
et
-).
ARITHMETIQUES
DE CHAINES
DE DATES
SUM
NVL
NVL
NVL
COUNT
TO_CHAR
SUBSTR
TO_CHAR
VARIANCE
SQRT
LENGTH
ADD_MONTHS
MAX
ABS
INSTR
MONTHS_BETWEEN
MIN
POWER
TO_NUMBER
NEXT_DAY
1.8.2
Expressions NULL
expr1, expr2,....
Elle permet de remplacer la valeur
Exemple 1.6
null
10
CHAPITRE 1.
COALESCE
INTRODUCTION
Lue ) fournie par Oracle (COALESCE est disponible avec Oracle 10g mais pas
avec Oracle 9i) qui permet de remplacer une valeur NULL par une valeur par
COALESCE
NVL (expr1, expr2 )
prend la valeur expr1, sauf si expr1 a la valeur NULL, auquel cas NVL prend
la valeur expr2.
Exemple 1.7
NVL(COMM, 0)
null
si une
expression est gale une certaine valeur. Elle peut tre utile lorsque des
donnes sont reprises d'un ancien SGBD non relationnel qui ne supportait
pas la valeur null.
Exemple 1.8
Chapitre 2
Cration d'une table et
contraintes d'intgrit
2.1 Cration d'une table
L'ordre CREATE TABLE permet de crer une table en dnissant le nom
et le type (voir 1.6) de chacune des colonnes de la table. Nous ne verrons ici
que trois des types de donnes utiliss dans SQL : numrique, chane de
caractres et date. Nous nous limiterons dans cette section une syntaxe
simplie de cet ordre (voir 2.2 et 5.2.1 pour des complments) :
NULL.
Exemple 2.1
12
CHAPITRE 2.
On peut donner une valeur par dfaut pour une colonne si la colonne n'est
pas renseigne.
Exemple 2.2
Le nom d'une contrainte doit tre unique parmi toutes les contraintes de
toutes les tables de la base de donnes.
Il existe des contraintes :
sur une colonne : la contrainte porte sur une seule colonne. Elle suit la
dnition de la colonne dans un ordre CREATE TABLE (pas possible
dans un ordre ALTER TABLE).
sur une table : la contrainte porte sur une ou plusieurs colonnes. Elles se
place au mme niveau que les dnition des colonnes dans un ordre
CREATE TABLE ou ALTER TABLE.
2.2.1
Types de contraintes
Contrainte de cl primaire
(pour une contrainte sur une table :)
PRIMARY KEY
dnit la cl primaire de la table. Aucune des colonnes qui forment cette cl
ne doit avoir une valeur NULL.
2.2.
CONTRAINTE D'INTGRIT
13
Contrainte d'unicit
(pour une contrainte sur une table :)
UNIQUE
interdit qu'une colonne (ou la concatnation de plusieurs colonnes) contienne
deux valeurs identiques.
Remarque 2.1
Cette contrainte UNIQUE convient des cls candidates. Cependant
une colonne UNIQUE peut avoir des valeurs NULL et une contrainte
UNIQUE ne correspond donc pas toujours un identicateur.
Contrainte de cl trangre
(pour une contrainte sur une table :)
14
CHAPITRE 2.
La norme SQL2 ore 4 autres options qui ne sont pas implmente dans
Oracle :
Contrainte CHECK
CHECK(condition )
donne une condition que les colonnes de chaque ligne devront vrier (exemples
dans la section suivante). On peut ainsi indiquer des contraintes d'intgrit de
domaines. Cette contrainte peut tre une contrainte de colonne ou de table.
Si c'est une contrainte de colonne, elle ne doit porter que sur la colonne en
question.
Exemples de contraintes
Exemples 2.3
(a) Quelques contraintes sur des colonnes :
2.2.
CONTRAINTE D'INTGRIT
15
Exemple 2.4
2.2.3
Exemple 2.5
La clause ENABLE a une option qui permet de conserver dans une table
les lignes qui ne respectent pas la contrainte ractive.
16
CHAPITRE 2.
INITIALLY DEFERRED
On peut modier l'tat d'une contrainte dirable par la commande ALTER TABLE ; par exemple :
2.2.
17
CONTRAINTE D'INTGRIT
Exemple 2.6
USER_CONSTRAINTS.
TABLE FORMAT A9
COLONNE FORMAT A9
CONTRAINTE FORMAT A12
"TABLE REF" FORMAT A9
"COL REF" FORMAT A9
"TEXTE CONTRAINTE" FORMAT A20
DEFERRABLE
de la vue
COLUMN
COLUMN
COLUMN
COLUMN
COLUMN
COLUMN
18
CHAPITRE 2.
Chapitre 3
Langage de manipulation des
donnes
Le langage de manipulation de donnes (LMD) est le langage permettant
de modier les informations contenues dans la base.
Il existe trois commandes SQL permettant d'eectuer les trois types de
modication des donnes :
INSERT
ajout de lignes
UPDATE
DELETE
suppression de lignes
Ces trois commandes travaillent sur la base telle qu'elle tait au dbut
de l'excution de la commande. Les modications eectues par les autres
utilisateurs entre le dbut et la n de l'excution ne sont pas prises en compte
(mme pour les transactions valides).
3.1 Insertion
INSERT INTO table (col1,..., coln )
VALUES (val1,...,valn )
ou
19
20
CHAPITRE 3.
Exemples 3.1
(a)
(b)
La deuxime forme avec la clause SELECT permet d'insrer dans une table
des lignes provenant d'une table de la base. Le SELECT a la mme syntaxe
qu'un SELECT normal.
Exemple 3.2
Enregistrer la participation de MARTIN au groupe de projet numro
10 :
3.2 Modication
La commande UPDATE permet de modier les valeurs d'un ou plusieurs
champs, dans une ou plusieurs lignes existantes d'une table.
UPDATE table
SET col1 = exp1, col2 = exp2, ...
WHERE prdicat
ou
UPDATE table
SET (col1, col2,...) = (SELECT ...)
WHERE prdicat
3.3.
SUPPRESSION
21
table est le nom de la table mise jour ; col1, col2, ... sont les noms des colonnes qui seront modies ; exp1, exp2,... sont des expressions. Elles peuvent
aussi tre un ordre SELECT renvoyant les valeurs attribues aux colonnes
(deuxime variante de la syntaxe).
Les valeurs de col1, col2... sont mises jour dans toutes les lignes satisfaisant le prdicat. La clause WHERE est facultative. Si elle est absente, toutes
les lignes sont mises jour.
Le prdicat peut contenir des sous-interrogations (voir 4.6).
Exemples 3.3
(a) Faire passer MARTIN dans le dpartement 10 :
UPDATE EMP
SET DEPT = 10
WHERE NOME = 'MARTIN'
(b) Augmenter de 10 % les commerciaux :
UPDATE EMP
SET SAL = SAL * 1.1
WHERE POSTE = 'COMMERCIAL'
(c) Donner CLEMENT un salaire 10 % au dessus de la moyenne des
salaires des secrtaires :
UPDATE EMP
SET SAL = (SELECT AVG(SAL) * 1.10
FROM EMP
WHERE POSTE = 'SECRETAIRE')
WHERE NOME = 'CLEMENT'
On remarquera que la moyenne des salaires sera calcule pour les valeurs qu'avaient les salaires au dbut de l'excution de la commande
UPDATE et que les modications eectues sur la base pendant l'excution de cette commande ne seront pas prises en compte.
(d) Enlever (plus exactement, mettre la valeur NULL) la commission
de MARTIN :
UPDATE EMP
SET COMM = NULL
WHERE NOME = 'MARTIN'
3.3 Suppression
L'ordre DELETE permet de supprimer des lignes d'une table.
22
CHAPITRE 3.
3.4 Transactions
3.4.1
Dnitions
Une transaction est un ensemble de modications de la base qui forment
un tout indivisible : il faut eectuer ces modications entirement ou pas du
tout, sous peine de laisser la base dans un tat incohrent.
Exemple 3.5
Une transaction peut transfrer une somme d'argent entre deux comptes
d'un client d'une banque. Elle comporte deux ordres : un dbit sur un
compte et un crdit sur un autre compte. Si un problme empche le
crdit, le dbit doit tre annul.
Une transaction est termine :
soit par une validation qui entrine les modications,
soit par une annulation qui remet la base dans son tat initial.
Dans le modle plat des transactions (celui utilis par SQL), deux transactions ne peuvent se chevaucher ni tre embotes l'une dans l'autre : dans
une session de travail, la transaction en cours doit se terminer avant qu'une
nouvelle transaction ne puisse dmarrer.
Ce mcanisme est aussi utilis pour assurer l'intgrit de la base en cas
de n anormale d'une tche utilisateur : il y a automatiquement annulation
des transactions non termines.
3.4.
23
TRANSACTIONS
3.4.2
COMMITED
les insertions,
24
CHAPITRE 3.
Remarque 3.2
Certains ordres SQL, notamment ceux de dnitions de donnes (create
table...), provoquent une validation automatique de la transaction en
cours.
3.4.3
Dans la norme SQL, la structure des transactions est plate et les transactions sont chanes :
2 transactions ne peuvent se chevaucher ;
une transaction commence ds que la prcdente se termine.
Ce modle n'est pas toujours adapt aux situations concrtes, surtout
pour les transactions longues et multi-sites :
elles peuvent tre une source de frustration pour l'utilisateur si tout le
travail eectu depuis le dbut de la transaction est annule ;
le fait que les transactions gardent jusqu' leur n les verrous qu'elles
ont poss nuit la concurrence.
D'autres modles ont t proposs pour assouplir ce modle.
Transactions embotes
Le modle des transactions embotes permet une transaction d'avoir
des sous-transactions lles, qui elles-mmes peuvent avoir des lles.
L'annulation d'une transaction parente annule toutes les transactions
lles mais l'annulation d'une transaction lle n'annule pas ncessairement
la transaction mre. Si la transaction mre n'est pas annule, les autres transactions lles ne sont pas annules.
l'annulation d'une transaction lle, la transaction mre peut
dcider d'un traitement substitutif ;
reprendre la transaction annule ;
s'annuler (si elle ne peut pas se passer de la transaction annule) ;
ou mme ignorer l'annulation (si le traitement que devait eectuer la
transaction annule n'est pas indispensable).
Ainsi, un traitement eectu dans une transaction lle peut tre repris ou
tre remplac par un traitement alternatif pour arriver au bout du traitement
complet. Ce modle est bien adapt aux transactions longues et multi-sites
(une transaction lle par site sur le rseau) qui doivent faire face des problmes de rupture de rseau.
3.4.
TRANSACTIONS
25
Points de reprise
Sans passer au modle des transactions embotes, les dernires versions
des principaux SGBD (et la norme SQL3) ont assoupli le modle des transactions plates avec les points de reprise (appels aussi points de sauvegarde ;
savepoint en anglais).
On peut dsigner des points de reprise dans une transaction :
savepoint nomPoint
rollback to nomPoint
Chapitre 4
Interrogations
4.1 Syntaxe gnrale
L'ordre SELECT possde six clauses direntes, dont seules les deux premires sont obligatoires. Elles sont donnes ci-dessous, dans l'ordre dans lequel elles doivent apparatre, quand elles sont utilises :
SELECT ...
FROM ...
WHERE ...
GROUP BY ...
HAVING ...
ORDER BY ...
SELECT [DISTINCT] *
ou
26
4.2.
27
CLAUSE SELECT
d'liminer les duplications : si, dans le rsultat, plusieurs lignes sont identiques, une seule sera conserve.
Exemples 4.1
(a)
(b)
(c)
(d) La requte suivante va provoquer une erreur car on utilise le nom Salaire
dans la clause where :
Exemple 4.2
Le nom complet d'une colonne d'une table est le nom de la table suivi d'un
point et du nom de la colonne. Par exemple : EMP.MATR, EMP.DEPT,
DEPT.DEPT
Le nom de la table peut tre omis quand il n'y a pas d'ambigut. Il
doit tre prcis s'il y a une ambigut, ce qui peut arriver quand on fait une
slection sur plusieurs tables la fois et que celles-ci contiennent des colonnes
qui ont le mme nom (voir en particulier 4.5).
4.2.1
La norme SQL-2, mais pas tous les SGBD, permet d'avoir des select embots parmi les expressions. Il faut viter cette facilit dans les programmes
si on veut qu'ils soient portables. Rien n'empche de l'utiliser en interactif si
elle existe.
C'est possible avec Oracle :
null.
Si cette possibilit existe, le select embot peut mme alors tre synchronis avec le select principal (le vrier sur le SGBD que vous utilisez). La
requte suivante ache les noms des employs avec le nombre d'employs qui
gagnent plus :
28
CHAPITRE 4.
INTERROGATIONS
select nomE,
(select count(*) from emp where sal > e1.sal) as rang
from emp e1
Attention, avec Oracle on ne peut utiliser rang dans la clause where (
vrier sur votre SGBD). Par exemple, la requte suivante renverra une erreur :
select nomE,
(select count(*) from emp where sal > e1.sal) as rang
from emp e1
where rang < 8
Si on veut contourner cette erreur, on peut le faire ainsi (mais il y a un
moyen plus simple pour obtenir les 8 plus gros salaires) :
Pseudo-colonnes
rownum est le numro des lignes slectionnes par une clause where : le
rownum de la premire ligne a la valeur 1, celui de la deuxime la
valeur 2, etc.
rownum permet de numroter les lignes :
4.3.
29
CLAUSE FROM
> 5
select nome
from (select rownum RANG, nome from emp where sal > 2000)
where RANG > 5
On peut ainsi rcuprer les lignes numrotes entre deux nombres :
order by ;
la
30
CHAPITRE 4.
INTERROGATIONS
certaines ambiguts, quand la mme table est utilise de plusieurs faons diffrentes dans une mme interrogation (voir 4.5.2 ou 4.6.3 pour des exemples
caractristiques). Quand on a donn un synonyme une table dans une requte, elle n'est plus reconnue sous son nom d'origine dans cette requte.
Le nom complet d'une table est celui de son crateur (celui du nom du
schma selon la norme SQL-2 : voir 5.1), suivi d'un point et du nom de la
table. Par dfaut, le nom du crateur est celui de l'utilisateur en cours. Ainsi,
on peut se dispenser de prciser ce nom quand on travaille sur ses propres
tables. Mais il faut le prciser ds que l'on se sert de la table d'un autre
utilisateur.
Quand on prcise plusieurs tables dans la clause FROM, on obtient le
produit cartsien des tables. On verra plus loin (remarque 4.5 page 34) une
syntaxe spciale pour les produits cartsiens.
Exemple 4.3
Produit cartsien des noms des dpartements par les numros des dpartements :
NOMD
-----------------FINANCES
FINANCES
FINANCES
RECHERCHE
RECHERCHE
RECHERCHE
VENTES
VENTES
VENTES
Exemples 4.4
(a) Pour obtenir la liste des employs avec le pourcentage de leur salaire
par rapport au total des salaires, il fallait auparavant utiliser une vue
(voir 5.3). Il est maintenant possible d'avoir cette liste avec une seule
instruction SELECT :
4.4.
CLAUSE WHERE
31
Remarque 4.1
Ce select n'est pas une sous-interrogation ; on ne peut synchroniser le
select avec les autres tables du from (voir 4.6.3).
4.4.1
WHERE prdicat
Un prdicat simple est la comparaison de deux expressions ou plus au
moyen d'un oprateur logique :
32
CHAPITRE 4.
WHERE
WHERE
WHERE
WHERE
WHERE
WHERE
WHERE
WHERE
WHERE
WHERE
WHERE
WHERE
WHERE
INTERROGATIONS
exp1 = exp2
exp1 != exp2
exp1 < exp2
exp1 > exp2
exp1 <= exp2
exp1 >= exp2
exp1 BETWEEN exp2 AND exp3
exp1 LIKE exp2
exp1 NOT LIKE exp2
exp1 IN (exp2, exp3,...)
exp1 NOT IN (exp2, exp3,...)
exp IS NULL
exp IS NOT NULL
>=)
: pour les types date, la relation d'ordre est l'ordre chronologique ; pour
est vrai si exp1 est gale l'une des expressions de la liste entre parenthses.
teste l'galit de deux chanes en tenant compte des caractres jokers dans
la 2me chane :
_ remplace 1 caractre exactement
LIKE '_AR%'
et
pour le
sera vraie.
Remarques 4.2
(a) L'utilisation des jokers ne fonctionne qu'avec LIKE ; elle ne fonctionne
pas avec =.
(b) Si on veut faire considrer _ ou % comme des caractres normaux,
il faut les faire prcder d'un caractre d'chappement que l'on indique
par la clause
4.5.
33
JOINTURE
Remarque 4.3
Le prdicat expr
= NULL
NOT).
4.4.2
Oprateurs logiques
Exemples 4.5
(a) Slectionner les employs du dpartement 30 ayant un salaire suprieur
1500 frs.
La clause WHERE peut aussi tre utilise pour faire des jointures (vues
dans le cours sur le modle relationnel) et des sous-interrogations (une des
valeurs utilises dans un WHERE provient d'une requte SELECT embote)
comme nous allons le voir dans les sections suivantes.
4.5 Jointure
Quand on prcise plusieurs tables dans la clause FROM, on obtient le produit cartsien des tables. Ce produit cartsien ore en gnral peu d'intrt.
34
CHAPITRE 4.
INTERROGATIONS
Exemple 4.6
Liste des employs avec le nom du dpartement o ils travaillent :
Remarque 4.5
La norme SQL2 a aussi une syntaxe spciale pour le produit cartsien
de deux tables :
4.5.
35
JOINTURE
4.5.1
Jointure naturelle
Lorsque l'on a une qui-jointure (c'est--dire quand la condition de jointure est une galit de valeurs entre une colonne de la premire table et une
colonne de la deuxime), il est le plus souvent inutile d'avoir les deux colonnes
de jointure dans le rsultat, puisque les valeurs sont gales. On peut prfrer
la jointure naturelle qui ne garde dans la jointure qu'une colonne pour les
deux colonnes qui ont servi la jointure. videmment, moins d'utiliser
* dans la clause du select, on ne voit pas la dirence l'achage. Voici
l'exemple prcdent avec une jointure naturelle :
join
toutes les colonnes qui ont le mme nom dans les deux tables.
Remarque 4.6
Si on utilise une jointure naturelle, il est interdit de prxer une colonne utilise pour la jointure par un nom de table. La requte suivante
provoque une erreur :
using
(s'il y a plusieurs
Il peut tre utile de rassembler des informations venant d'une ligne d'une
table avec des informations venant d'une autre ligne de la mme table.
Dans ce cas il faut renommer au moins l'une des deux tables en lui donnant un synonyme (voir 4.3), an de pouvoir prxer sans ambigut chaque
nom de colonne.
36
CHAPITRE 4.
INTERROGATIONS
Exemple 4.7
Lister les employs qui ont un suprieur, en indiquant pour chacun le
nom de son suprieur :
Jointure externe
null,
RIGHT indique que la table dans laquelle on veut acher toutes les lignes
dept) est droite de RIGHT OUTER JOIN. C'est dans l'autre table
(la table
LEFT OUTER JOIN qui est utilis si on veut acher toutes les lignes de
OUTER JOIN) et FULL OUTER JOIN si on
Remarque 4.7
Oracle n'accepte cette syntaxe que depuis la version 9. Pour les versions
plus anciennes, la requte doit s'crire :
4.5.
37
JOINTURE
EMP.DEPT
pro-
4.5.4
ou encore
between
et
in.
Exemples 4.8
(a) Liste des employs, avec tous les employs qui gagnent plus :
38
CHAPITRE 4.
INTERROGATIONS
4.6 Sous-interrogation
Une caractristique puissante de SQL est la possibilit qu'un prdicat
employ dans une clause WHERE (expression droite d'un oprateur de
comparaison) comporte un SELECT embot.
Par exemple, la slection des employs ayant mme poste que MARTIN
peut s'crire en joignant la table EMP avec elle-mme :
SELECT EMP.NOME
FROM EMP JOIN EMP MARTIN ON EMP.POSTE = MARTIN.POSTE
WHERE MARTIN.NOME = 'MARTIN'
mais on peut aussi la formuler au moyen d'une sous-interrogation :
4.6.1
Exemple 4.9
Liste des employs travaillant dans le mme dpartement que MERCIER :
Exemples 4.10
(a) Liste des employs du dpartement 10 ayant mme poste que quelqu'un
du dpartement VENTES :
4.6.
SOUS-INTERROGATION
39
FROM EMP
WHERE DEPT = (SELECT DEPT
FROM DEPT
WHERE NOMD = 'VENTES'))
(b) Liste des employs ayant mme poste que MERCIER ou un salaire
suprieur CHATEL :
Exemple 4.11
Liste des employs travaillant LYON et ayant mme poste que FREMONT.
4.6.2
40
CHAPITRE 4.
INTERROGATIONS
les oprateurs obtenus en ajoutant ANY ou ALL la suite des oprateurs de comparaison classique
WHERE
WHERE
WHERE
WHERE
exp
exp
exp
exp
o op est un
Exemple 4.12
Liste des employs gagnant plus que tous les employs du dpartement 30 :
IN est
!= ALL.
L'oprateur
valent
4.6.3
quivalent
= ANY,
et l'oprateur
NOT IN
est qui-
Sous-interrogation synchronise
Exemple 4.13
Liste des employs ne travaillant pas dans le mme dpartement que
leur suprieur.
4.6.
SOUS-INTERROGATION
4.6.4
41
WHERE
WHERE
WHERE
WHERE
WHERE
(exp,
(exp,
(exp,
(exp,
(exp,
exp,...)
exp,...)
exp,...)
exp,...)
exp,...)
Exemple 4.14
Employs ayant mme poste et mme salaire que MERCIER :
4.6.5
Clause EXISTS
La clause
et prend la valeur vrai s'il existe au moins une ligne satisfaisant les conditions
de la sous-interrogation.
Exemple 4.15
42
CHAPITRE 4.
INTERROGATIONS
une ligne est trouve dans la table EMP, EXISTS prend la valeur vrai
et la ligne de DEPT satisfait les critres de l'interrogation.
Souvent on peut utiliser IN la place de la clause EXISTS. Essayez sur
l'exemple prcdent.
Remarque 4.9
Il faut se mer lorsque l'on utilise EXISTS en prsence de valeurs
NULL. Si on veut par exemple les employs qui ont la plus grande
commission par la requte suivante,
S,
par :
D = {a
select A from R R1
where not exists
(select C from S
where not exists
(select A, B from R
where A = R1.A and B = S.C))
En fait, on peut remplacer les colonnes des select placs derrire des not
exists par ce que l'on veut, puisque seule l'existence ou non d'une ligne
compte. On peut crire par exemple :
select A from R R1
where not exists
(select null from S
where not exists
4.6.
43
SOUS-INTERROGATION
Exemple 4.16
La rponse la question Quels sont les dpartements qui participent
Dept S o R = (PARTICIPATION
( JN {Matr} indique une jointure na-
JN {Matr}
SELECT DEPT
FROM PARTICIPATION NATURAL JOIN EMP E1
WHERE NOT EXISTS
(SELECT CODEP FROM PROJET
WHERE NOT EXISTS
(SELECT DEPT, CODEP
FROM PARTICIPATION NATURAL JOIN EMP
WHERE DEPT = E1.DEPT
AND CODEP = PROJET.CODEP))
Remarque 4.10
Il faudrait ajouter DISTINCT dans le premier select pour viter
les doublons.
Sur ce cas particulier on voit qu'il est inutile de travailler sur la jointure de PARTICIPATION et de EMP pour le SELECT externe. On
peut travailler sur la table DEPT. Il en est de mme sur tous les cas
o la table R est une jointure. D'aprs cette remarque, le SELECT
prcdent devient :
44
CHAPITRE 4.
INTERROGATIONS
ne contient dans la colonne qui sert pour la division que des valeurs qui
existent dans la table diviseur, on peut exprimer la division en utilisant
les regroupements (tudis dans la prochaine section) et en comptant
les lignes regroupes. Pour l'exemple des dpartements qui participent
tous les projets, on obtient :
select dept
from emp natural join participation
group by dept
having count(distinct codeP) =
(select count(distinct codeP) from projet)
Traduction : si le nombre des
codeP
PROJET).
PARTICIPATION
codeP
de la
qui rfrence la cl
codeP
codeP doit
select dept
from emp natural join participation
where codeP in
(select codeP from projet)
group by dept
having count(distinct codeP) =
(select count(distinct codeP) from projet)
4.7.
45
FONCTIONS DE GROUPES
AVG
moyenne
SUM
somme
MIN
MAX
VARIANCE
variance
STDDEV
COUNT(*)
nombre de lignes
COUNT(col )
COUNT(DISTINCT col )
Exemples 4.17
(a)
(b)
Les valeurs NULL sont ignores par les fonctions de groupe. Ainsi, SUM(col)
est la somme des valeurs qui ne sont pas gales NULL de la colonne 'col'.
De mme, AVG est la somme des valeurs non NULL divise par le nombre
de valeurs non NULL.
Il faut remarquer qu' un niveau de profondeur (relativement aux sousinterrogations), d'un SELECT, les fonctions de groupe et les colonnes doivent
tre toutes du mme niveau de regroupement. Par exemple, si on veut le nom
et le salaire des employs qui gagnent le plus dans l'entreprise, la requte
suivante provoquera une erreur :
groupe en une seule ligne toutes les lignes pour lesquelles exp1, exp2,... ont la
46
CHAPITRE 4.
INTERROGATIONS
mme valeur. Cette clause se place juste aprs la clause WHERE, ou aprs
la clause FROM si la clause WHERE n'existe pas.
Des lignes peuvent tre limines avant que le groupe ne soit form grce
la clause WHERE.
Exemples 4.18
(a)
(b)
(c)
(d)
RESTRICTION :
Une expression d'un SELECT avec clause GROUP BY ne peut videmment que correspondre une caractristique de groupe. SQL n'est pas trs
intelligent pour comprendre ce qu'est une caractristique de groupe ; une
expression du SELECT ne peut tre que :
soit une fonction de groupe,
soit une expression gurant dans le GROUP BY.
L'ordre suivant est invalide car NOMD n'est pas une expression du GROUP
BY :
4.9.
CLAUSE HAVING
47
Exemple 4.19
4.10 Fonctions
Nous allons dcrire ci-dessous les principales fonctions disponibles dans
Oracle. Il faut remarquer que ces fonctions ne sont pas standardises et ne
sont pas toutes disponibles dans les autres SGBD ; elles peuvent aussi avoir
une syntaxe dirente,ou mme un autre nom.
48
CHAPITRE 4.
4.10.1
INTERROGATIONS
Fonctions arithmtiques
ABS(n )
valeur absolue de n
MOD(n1, n2 )
n1 modulo n2
POWER(n, e )
n la puissance e
ROUND(n [, p ])
SIGN(n )
SQRT(n )
racine carre de n
TRUNC(n [, p ])
GREATEST(n1, n2,...)
LEAST(n1, n2,...)
TO_CHAR(n, format )
TO_NUMBER(chane )
Exemple 4.20
Calcul du salaire journalier :
LENGTH(chane )
prend comme valeur la longueur de la chane.
Exemple 4.21
Position du deuxime 'A' dans les postes :
4.10.
FONCTIONS
49
RPAD(chane, long [,car ]) a une fonction analogue, chane tant complte droite.
Exemple :
LTRIM(chane, car )
supprime les caractres l'extrmit gauche de la chane chane tant qu'ils
appartiennent l'ensemble de caractres car. Si l'ensemble des caractres
n'est pas donn, ce sont les espaces qui sont enlevs.
RTRIM(chane, car )
a une fonction analogue, les caractres tant supprims l'extrmit droite
de la chane. Si l'ensemble des caractres n'est pas donn, ce sont les espaces
qui sont enlevs.
Exemple : supprimer les A et les M en tte des noms :
50
CHAPITRE 4.
INTERROGATIONS
MI
PR
< >
Exemple 4.22
Achage des salaires avec au moins trois chires (dont deux dcimales) :
anne
YY
WW
MM
numro du mois
DDD
DD
HH ou HH12
HH24
MI
minutes
Tout caractre spcial insr dans le format sera reproduit dans la chane
de caractre rsultat. On peut galement insrer dans le format une chane
de caractres quelconque, condition de la placer entre guillemets.
Exemple 4.23
TO_NUMBER (chane )
convertit une chane de caractres en nombre (quand la chane de caractres
est compose de caractres numriques.
ASCII(chane )
donne le code ASCII du premier caractre de chane.
4.10.
51
FONCTIONS
TO_DATE(chane, format )
permet de convertir une chane de caractres en donne de type date. Le
Remarque 4.12
Attention l'interprtation par Oracle des dates ne contenant que 2
chires pour l'anne. Toute anne infrieure 50 est considre comme
une anne du 21me sicle ; les autres annes sont considres comme
tant des annes du 20me sicle. Par exemple, 38 correspond 2038
et 50 correspond 1950.
Par dfaut Oracle ache les annes avec 2 chires. Pour savoir coup
TO_CHAR :
select to_char(date_naissance, 'DD/MM/YYYY') from personne
sr de quelle anne il s'agit, il faut utiliser la fonction
4.10.3
ROUND(date, prcision )
arrondit la date la prcision spcie. La prcision est indique en utilisant
un des masques de mise en forme de la date.
Exemple : premier jour de l'anne o les employs ont t embauchs :
SYSDATE ou CURRENT_DATE
a pour valeur la date et l'heure courante du systme d'exploitation hte.
Exemple : nombre de jour depuis l'embauche :
Une fonction de choix existe dans la norme SQL2 (et dans Oracle depuis
la version 9i). Elle correspond la structure
switch
du langage C (ou
case
de Pascal ou Ada).
Elle remplace avantageusement la fonction
CASE
conditions quelconques et une qui donne une valeur suivant la valeur d'une
expression.
52
CHAPITRE 4.
INTERROGATIONS
CASE
WHEN condition1 THEN expression1
[WHEN condition2 THEN expression2 ]
. . .
[ELSE expression_dfaut ]
END
Remarques 4.13
(a) La condition qui suit un
WHEN
boolenne.
(b) Si aucune condition n'est remplie et s'il n'y a pas de ELSE,
null
est
retourn.
(c) Les direntes expressions renvoyes doivent tre de mme type.
CASE expression
WHEN valeur1 THEN expression1
[WHEN valeur2 THEN expression2 ]
. . .
[ELSE expression_dfaut]
END
Remarques 4.14
(a) Attention, ne fonctionne pas pour le cas o une des valeurs n'est pas
renseigne (when
taxe de
(b) Si l'expression n'est gale aucune valeur et s'il n'y a pas de ELSE,
null
est retourn.
Exemple 4.24
Liste des employs avec leur catgorie (prsident = 1, directeur = 2,
autre = 3), en appelant la colonne Niveau :
SELECT nome,
CASE
WHEN (poste = 'Prsident') THEN 1
WHEN (poste = 'Directeur') THEN 2
ELSE 3
END Niveau
FROM emp;
pourrait aussi s'crire plus simplement
4.11.
CLAUSE ORDER BY
53
SELECT nome,
CASE poste
WHEN 'Prsident' THEN 1
WHEN 'Directeur' THEN 2
ELSE 3
END Niveau
FROM emp;
Pour les versions d'Oracle antrieures la version 9i, il est possible d'utiliser la fonction
decode.
Exemple 4.25
Liste des employs avec leur catgorie (prsident = 1, directeur = 2,
autre = 3) :
Nom de l'utilisateur
USER
a pour valeur le nom sous lequel l'utilisateur est entr dans Oracle.
54
CHAPITRE 4.
L'option facultative
INTERROGATIONS
Exemple 4.26
la place de :
on peut taper
Cette nouvelle syntaxe doit tre utilise pour les interrogations exprimes
l'aide d'un oprateur boolen UNION, INTERSECT ou MINUS.
Elle permet aussi de simplier l'criture d'un tri sur une colonne qui
contient une expression complexe.
Exemples 4.27
(a) Liste des employs et de leur poste, trie par dpartement et dans
chaque dpartement par ordre de salaire dcroissant :
(c)
(d)
4.12.
55
OPRATEURS ENSEMBLISTES
4.12.1
Oprateur UNION
UNION ALL.
Exemple 4.28
Liste des ingnieurs des deux liales :
Oprateur INTERSECT
L'oprateur INTERSECT permet d'obtenir l'ensemble des lignes communes deux interrogations.
Exemple 4.29
Liste des dpartements qui ont des employs dans les deux liales :
Oprateur EXCEPT
Exemple 4.30
Liste des dpartements qui ont des employs dans la premire liale
mais pas dans la deuxime.
Clause ORDER BY
ORDER BY
56
CHAPITRE 4.
INTERROGATIONS
rownum
numrote
avant un ventuel tri (ce qui n'est pas le cas avec limit ou top) comme on l'a
vu en 4.2.2.
Si un select comporte une clause order by il faut donc ruser avec Oracle
en utilisant une sous-requte qui trie, alors que la requte principale limite
le nombre de lignes :
select * from
(select nomE, sal
from emp
order by sal)
where rownum <= 10
Exemple 4.31
Un programme demande son nom et son mot de passe un utilisateur,
et les range dans 2 variables
nom
et
mdp.
4.14.
57
--
--
et le
select aurait t
PreparedStatement
Statement
et de
58
CHAPITRE 4.
INTERROGATIONS
Chapitre 5
Langage de dnition des donnes
Le langage de dnition des donnes (LDD est la partie de SQL qui
permet de dcrire les tables et autres objets manipuls par le SGBD.
5.1 Schma
Un schma est un ensemble d'objets (tables, vues, index, autorisations,
etc...) grs ensemble. On pourra ainsi avoir un schma li la gestion du
personnel et un autre li la gestion des clients. Un schma est cr par la
commande
Cette notion introduite par la norme SQL2 n'est pas vraiment prise en
compte par Oracle qui identie pour le moment un nom de schma avec un
nom d'utilisateur.
Autre notion de SQL2, le catalogue, est un ensemble de schmas. Un catalogue doit ncessairement comprendre un schma particulier qui correspond
au dictionnaire des donnes (voir 5.8).
5.2 Tables
5.2.1
CREATE TABLE AS
59
60
CHAPITRE 5.
Exemple 5.1
ALTER TABLE
Les sections 2.2.2 et 2.2.3 montrent comment grer les contraintes d'intgrit avec la commande ALTER TABLE. Cette commande permet aussi de
grer les colonnes d'une table : ajout d'une colonne (aprs toutes les autres
colonnes), suppression et modication d'une colonne existante.
Exemple 5.2
5.2.
TABLES
61
bien sr dj exister dans la table. type1, type2,... sont les nouveaux types
que l'on dsire attribuer aux colonnes.
Il est possible de modier la dnition d'une colonne, condition que la
colonne ne contienne que des valeurs NULL ou que la nouvelle dnition soit
compatible avec le contenu de la colonne :
on ne peut pas diminuer la taille maximale d'une colonne.
on ne peut spcier 'NOT NULL' que si la colonne ne contient pas de
valeur nulle.
Il est toujours possible d'augmenter la taille maximale d'une colonne, tant
qu'on ne dpasse pas les limites propres SQL, et on peut dans tous les cas
spcier 'NULL' pour autoriser les valeurs nulles.
Exemple 5.3
Exemple 5.4
62
CHAPITRE 5.
5.2.4
Si une table ou une vue (tudi en 5.3) doit tre utilise par plusieurs utilisateurs, il peut tre intressant de lui donner un synonyme public pour que les
utilisateurs ne soient pas obligs de prxer le nom de la table ou de la vue par
le nom de son crateur. Oracle ore la commande
pour cela.
Exemple 5.5
5.3 Vues
Une vue est une vision partielle ou particulire des donnes d'une ou
plusieurs tables de la base.
La dnition d'une vue est donne par un SELECT qui indique les donnes de la base qui seront vues.
5.3.
VUES
63
Les utilisateurs pourront consulter la base, ou modier la base (avec certaines restrictions) travers la vue, c'est--dire manipuler les donnes renvoyes par la vue comme si c'tait des donnes d'une table relle.
Seule la dnition de la vue est enregistre dans la base, et pas les donnes
de la vue. On peut parler de table virtuelle.
5.3.1
CREATE VIEW
Exemples 5.6
(a) Vue ne comportant que le matricule, le nom et le dpartement des
employs :
Exemple 5.7
Vue constituant une restriction de la table EMP aux employs du dpartement 10 :
64
CHAPITRE 5.
5.3.2
DROP VIEW
5.3.3
Une vue peut tre rfrence dans un SELECT de la mme faon qu'une
table. Ainsi, il est possible de consulter la vue EMP10. Tout se passe comme
s'il existait une table EMP10 des employs du dpartement 10 :
CHECK OPTION
Exemple 5.8
Remarque 5.2
Les restrictions donnes ci-dessus sont les restrictions de la norme
SQL2. Elles sont parfois trop strictes et les SGBD peuvent assouplir ces
5.3.
VUES
65
UPDATE EMP
SET nomE = 'Dupont'
where nomE = 'Dupond'
5.3.4
De faon gnrale, les vues permettent de dissocier la faon dont les utilisateurs voient les donnes, du dcoupage en tables. On spare l'aspect externe
(ce que voit un utilisateur particulier de la base) de l'aspect conceptuel (comment a t conu l'ensemble de la base). Ceci favorise l'indpendance entre
les programmes et les donnes. Si la structure des donnes est modie, les
programmes ne seront pas modier si l'on a pris la prcaution d'utiliser
des vues (ou si on peut se ramener travailler sur des vues). Par exemple, si
une table est dcoupe en plusieurs tables aprs l'introduction de nouvelles
donnes, on peut introduire une vue, jointure des nouvelles tables, et la nommer du nom de l'ancienne table pour viter de rcrire les programmes qui
utilisaient l'ancienne table. En fait, si les donnes ne sont pas modiables
travers la vue (voir 5.3.3, il faudra utiliser des trigger instead of (voir
??)
pour utiliser pleinement la vue comme une table ; sinon la vue ne pourra tre
utilise que pour rcuprer des donnes mais pas pour les modier.
Une vue peut aussi tre utilise pour restreindre les droits d'accs certaines colonnes et certaines lignes d'une table : un utilisateur peut ne pas
avoir accs une table mais avoir les autorisations pour utiliser une vue qui
ne contient que certaines colonnes de la table ; on peut de plus ajouter des
restrictions d'utilisation sur cette vue comme on le verra en 5.9.1.
Dans le mme ordre d'ides, une vue peut tre utilise pour implanter
une contrainte d'intgrit grce l'option WITH CHECK OPTION.
Une vue peut galement simplier la consultation de la base en enregistrant des SELECT complexes.
Exemple 5.9
En crant la vue
66
CHAPITRE 5.
5.4 Index
Considrons le SELECT suivant :
= 'MARTIN'
5.4.1
CREATE INDEX
Remarque 5.3
Deux index construits sur des tables d'un mme utilisateur ne peuvent
avoir le mme nom (mme s'ils sont lis deux tables direntes).
Un index peut tre cr juste aprs la cration d'une table ou sur une
table contenant dj des lignes. Il sera ensuite tenu jour automatiquement
lors des modications de la table.
Un index peut porter sur plusieurs colonnes : la cl d'accs sera la concatnation des direntes colonnes.
On peut crer plusieurs index indpendants sur une mme table.
5.4.
INDEX
5.4.2
67
Les requtes SQL sont transparentes au fait qu'il existe un index ou non.
C'est l'optimiseur de requtes du SGBD qui, au moment de l'excution de
chaque requte, recherche s'il peut s'aider d'un index.
La principale utilit des index est d'acclrer les recherches d'informations
dans la base. Une ligne est retrouve instantanment si la recherche peut
utiliser un index. Sinon, une recherche squentielle sur toutes les lignes de la
table doit tre eectue. Il faut cependant noter que les donnes retrouver
doivent correspondre environ moins de 20 % de toutes les lignes sinon une
recherche squentielle est prfrable.
Les index concatns (avec plusieurs colonnes) permettent mme dans
certains cas de rcuprer toutes les donnes cherches sans accder la table.
Une jointure s'eectuera souvent plus rapidement si une des colonnes de
jointure est indexe (s'il n'y a pas trop de valeurs gales dans les colonnes
indexes).
Les index acclrent le tri des donnes si le dbut de la cl de tri correspond un index.
Une autre utilit des index est d'assurer l'unicit d'une cl en utilisant
l'option UNIQUE. Ainsi la cration de l'index suivant empchera l'insertion
dans la table EMP d'un nom d'employ existant :
68
CHAPITRE 5.
situations particulires. Il faut aussi consulter les notes de version des SGBD
qui donnent d'autres rgles qui dpendent des versions des optimiseurs de
requtes. Il peut aussi se poser le choix du type d'index (voir 5.4.4).
5.4.3
DROP INDEX
Remarque 5.4
Un index est automatiquement supprim ds qu'on supprime la table
laquelle il appartient.
5.4.4
Types d'index
5.4.
69
INDEX
l'on cherche. On rappelle que les accs disques sont environ un million de fois
plus lents que les accs en mmoire centrale.
Un autre avantage est que l'on peut trs facilement lire les cls dans
l'ordre. L'application d'une clause order by peut ainsi bncier de ces
index.
Il existe aussi d'autres types d'index qui peuvent tre utiliss dans des
circonstances particulires ; les plus courants sont les suivants :
Index bitmap : ils ne sont utiles que lorsque les donnes de la table ne
sont presque jamais modies. Ils sont le plus souvent utiliss dans les
applications dcisionnelles OLAP (On Line Analytical Processing) qui
facilitent les prises de dcisions lies l'analyse des donnes conserves par une entreprise. L'implmentation est trs dirente de celle
des B-arbres. Pour chaque valeur distincte de la colonne indexe l'index contient un tableau de bits (autant de bits que de lignes dans la
table) indiquant si chaque ligne de la table a cette valeur. Il est facile
de combiner dirents tableaux de bits pour rpondre aux slections
de type col1=valeur1
and col2=valeur2
col1
et
col2
sont in-
dexes par un index bitmap. Lorsque les index bitmap sont utiliss par
l'optimiseur ils peuvent fournir de trs bonnes performances. Oracle
a aussi introduit un nouveau type d'index bitmap pour acclrer les
jointures.
Index de type table de hachage : ils ne sont plus vraiment utiliss car ils
n'orent pas d'avantages consquents par rapport aux B-arbres. Ils
orent un accs quasi instantan une ligne dont on donne la cl
mais ils ne permettent pas le parcours dans l'ordre des cls et ne sont
donc d'aucune utilit pour les slections du type col1
> valeur1.
> fonction(...).
des valeurs d'une fonction sur toutes les lignes de la table qui sont
indexs.
5.4.5
L'utilisateur peut avoir des informations sur les index qu'il a crs en
consultant la table
lui donne les index qu'il peut utiliser (mme s'il ne les a pas cres).
70
CHAPITRE 5.
5.5.1
Dans les premiers temps des SGBD, les dveloppeurs utilisaient des valeurs enregistres dans des tables de la base pour crer les identicateurs
dont ils avaient besoin. L'ide est de crer une suite de nombres entiers de
telle sorte que jamais le mme nombre n'est utilis deux fois, mme si deux
transactions distinctes ont besoin d'un identicateur en mme temps. Voici
les procds les plus courants :
Le premier identicateur des lignes d'une table est gal 1. Pour trouver les identicateurs suivants il sut d'ajouter 1 la plus grande valeur
de la table ; par exemple,
5.5.
71
5.5.2
Autres solutions
Tous les SGBD orent dsormais une facilit pour obtenir des identicateurs sans avoir accder une table. Cette facilit permet d'obtenir des
valeurs qui sont gnres automatiquement par le SGBD. Cette facilit n'est
malheureusement pas standardise ; par exemple,
MySQL permet d'ajouter la clause
DB2 et SQL Server ont une clause
est un identiant ;
Oracle, DB2 et PostgreSQL utilisent des squences.
La section suivante prsente les squences.
5.5.3
Squences
Exemple 5.10
Remarque 5.5
Utiliser un incrment suprieur 1 permet de disposer de plusieurs
identicateurs en un seul appel, pour amliorer les performances.
72
CHAPITRE 5.
table
dual
Remarques 5.6
(a)
currval
nextval
n'est pas dni tant qu'on n'a pas appel au moins une fois
dans la session de travail.
(b) La valeur de
transaction.
(c)
nextval
nextval
non valide.
ALL_SEQUENCES lui donne les squences qu'il peut utiliser (mme s'il ne les a
pas cres).
5.6.
73
Procdure stocke
Exemple 5.13
Voici une procdure stocke Oracle qui prend en paramtre un numro de dpartement et un pourcentage, augmente tous les salaires
74
CHAPITRE 5.
errors.
On peut
aussi voir ces erreurs en utilisant le dictionnaire des donnes (voir 5.6.3).
5.6.2
Fonction stocke
IN
sont accepts.
Exemple 5.14
Le code suivant cre une fonction qui permet le calcul en franc d'un
montant en euros :
5.7.
75
TRIGGERS
Ces fonctions peuvent alors tre utilises comme les fonctions prdnies dans les requtes SQL.
On peut ensuite utiliser la fonction :
Tables du dictionnaire
Pour avoir les noms des procdures on peut utiliser les vues
ou
ALL_OBJECTS.
La vue
USER_SOURCE
USER_PROCEDURES
Exemples 5.15
(a) Voici un ordre SQL pour avoir, sous Oracle, les noms des procdures
stockes et le nom de leur propritaire :
augmentation
euro_to_fr
5.7 Triggers
Les triggers (dclencheurs en franais) ressemblent aux procdures stockes car ils sont eux aussi compils et enregistrs dans le dictionnaire des
donnes de la base et ils sont le plus souvent crits dans le mme langage.
La dirence est que leur excution est dclenche automatiquement par
des vnements lis des actions sur la base. Les vnements dclencheurs
peuvent tre les commandes LMD insert, update, delete ou les commandes
LDD create, alter, drop.
76
CHAPITRE 5.
dont des
errors.
Remarque 5.8
Toutes les possibilits oertes par les triggers ne sont pas dcrites ici
et chaque SGBD peut ajouter des fonctionnalits. Pour plus d'informations consultez la documentation de votre SGBD.
Remarque 5.9
L'outil SQL*FORMS d'Oracle (construction et utilisation d'crans de
saisie) utilise aussi le terme de trigger mais pour des programmes dont
l'excution est dclenche par des actions de l'utilisateur, qui ne sont
pas toujours lies aux donnes enregistres dans la base (par exemple,
sortie d'une zone de saisie ou entre dans un bloc logique de l'cran de
saisie).
5.7.
TRIGGERS
5.7.1
77
Types de triggers
5.7.2
Exemple
Une table cumul sert enregistrer le cumul des augmentations dont ont
bnci les employs d'une entreprise.
Exemple 5.16
Le trigger suivant met jour automatiquement une table cumul qui
totalise les augmentations de salaire de chaque employ.
78
CHAPITRE 5.
Les pseudo-variables
et nouvelles valeurs
:OLD
delete et
a la
:NEW et :OLD :
CREATE OR REPLACE TRIGGER totalAugmentation
AFTER UPDATE OF sal ON emp
REFERENCING old as ancien, new as nouveau
FOR EACH ROW
update cumul
set augmentation = augmentation + nouveau.sal - ancien.sal
where matricule = ancien.matr
xes par
5.7.3
commit ou de rollback.
Un trigger ne peut modier par une commande update, insert ou delete
Le code d'un trigger ne peut contenir de
Exemple 5.17
5.7.4
Clause WHEN
WHEN
trigger.
Cette condition peut rfrencer la nouvelle et l'ancienne valeur d'une
colonne de la table (new et
old
5.7.
TRIGGERS
79
Exemple 5.18
5.7.5
Triggers INSTEAD OF
Ces triggers servent utiliser les vues non modiables pleinement comme
des tables.
Ils existent dans la plupart des SGBD (Oracle, DB2, SQL Server par
exemple), mais pas dans tous (pas dans MySQL en particulier).
Dans Oracle, un tel trigger ne peut porter que sur une vue (pas sur une
table).
Syntaxe :
80
CHAPITRE 5.
values(:new.dept, :new.nom_dept);
insert into emp(matr, nome, dept)
values(:new.matr, :new.nom_emp, :new.dept);
end;
Il est alors possible d'insrer un nouvel employ et un nouveau dpartement avec la commande
5.7.6
Dictionnaire de donnes
La vue
USER_TRIGGERS
informations sur les triggers. Par exemple le trigger creetotal de l'exemple 5.16
de la page 77 sera dcrit ainsi par les divers colonnes :
TRIGGER_NAME TRIGGER_TYPE
----------- -------------CREETOTAL
AFTER EACH ROW
TRIGGERING_EVENT
---------------INSERT
BASE_OBJECT_TYPE TABLE_NAME
---------------- ---------TABLE
EMP
COLUMN_NAME
-----------
REFERENCING_NAMES
-------------------------------REFERENCING NEW AS NEW OLD AS OLD
WHEN_CLAUSE
-----------
STATUS
-------ENABLED
DESCRIPTION
----------creetotal AFTER INSERT ON emp
for each row
ACTION_TYPE TRIGGER_BODY
----------- ---------------------------------------------PL/SQL
BEGIN insert into cumul (matricule, augmentation)
values (:NEW.matr, 0); END;
5.8.
81
DICTIONNAIRE DE DONNES
La vue
USER_TRIGGER_COLS
USER_TABLES
USER_CATALOG (CAT)
tables et vues sur lesquelles l'utilisateur courant a des droits, l'exclusion des tables et vues du dictionnaire de donnes
USER_TAB_COLUMNS (COLS)
colonnes
de
chaque
table
ou
vue
USER_VIEWS
USER_TAB_PRIVS
donneur
ou
receveur
d'autorisation
USER_CONSTRAINTS
USER_CONS_COLUMNS
Exemples 5.20
(a) Colonnes de la table EMP :
82
CHAPITRE 5.
5.9.1
GRANT
5.9.
83
SELECT
droit de lecture
INSERT
UPDATE
DELETE
ALTER
INDEX
ALL
REVOKE
Remarque 5.10
Si on enlve un privilge un utilisateur, ce privilge est automatiquement retir tout autre utilisateur qui il aurait accord ce privilge.
5.9.3
Tout utilisateur peut modier son mot de passe par l'ordre GRANT
CONNECT :
84
CHAPITRE 5.
5.9.4
Synonyme
Oracle (et d'autres SGBD comme SQL Server) permet de donner des
synonymes pour les tables et vues.
Les synonymes permettent le plus souvent des noms simplis. Les synonymes peuvent tre publics s'ils sont connus de tous les utilisateurs de la
base, ou privs s'ils ne sont connus que de celui qui a cr le synonyme.
Exemple 5.22
nymes.
La commande suivante permet de rechercher dans le dictionnaire des donnes les synonymes, la table ou vue renomme, et le propritaire des synonymes pour les tables ou vues possdes par l'utilisateur toto :
donner par GRANT. L'administrateur peut crer plusieurs rles correspondants dirents types standard d'utilisateurs pour les aecter aux utilisateurs qu'il cre.
5.9.
85
Chapitre 6
Gestion des accs concurrents
Les problmes lis aux accs concurrents aux donnes sont prsents dans
leur gnralit. Les solutions apportes par les dirents SGBDs, et plus
particulirement Oracle, sont ensuite tudies.
6.1.1
Transaction T1
t1
Lire S
t2
t3
Lire S
S = S + 1000
t4
t5
Transaction T2
S = S + 2000
Enregistrer S
t6
Enregistrer S
86
6.1.
87
Pour viter ce genre de situation, les SGBD bloquent l'accs aux tables
(ou parties de tables : blocs mmoire ou lignes par exemple) lorsque de nouveaux accs pourraient occasionner des problmes. Les processus qui veulent
accder aux tables bloques sont mis en attente jusqu' ce que les tables
soient dbloques.
Cependant ceci peut aussi amener l'interblocage de processus (deadlock
en anglais) comme dans l'exemple suivant :
Temps
Transaction T1
Transaction T2
t1
Verrouiller la table A
t2
Verrouiller la table B
t3
Verrouiller la table B
t4
Attente
Verrouiller la table A
Attente
t5
6.1.2
Une transaction T2 lit une valeur V donne par une autre transaction T1.
Ensuite la transaction T1 annule son aectation de V et la valeur lue par T2
est donc fausse.
Temps
Transaction T1
t1
V = 100
t2
t3
Transaction T2
Lire V
ROLLBACK
6.1.3
Une transaction lit deux fois une mme valeur et ne trouve pas la mme
valeur les deux fois.
88
CHAPITRE 6.
Temps
Transaction T1
t1
Lire V
t2
Transaction T2
V = V + 100
t3
COMMIT
t4
Lire V
Pour viter ceci, T1 devra bloquer les donnes qu'elle veut modier entre
les temps t1 et t3, pour empcher les autres transactions de les modier (voir,
par exemple, les blocages explicites d'Oracle en 6.5).
6.1.4
Lignes fantmes
Transaction T1
t1
t2
Transaction T2
Crer des lignes avec V = 10
t3
Une variante que l'on peut rencontrer si on veut accder aux donnes
depuis un langage de programmation tel que Java : on commence par lire le
nombre de lignes qui vrient un critre pour dimensionner un tableau Java
qui les contiendra ; on relance ensuite la mme slection pour ranger les lignes
dans le tableau ; si entre temps un autre utilisateur a rajout des lignes qui
vrient ce critre, on provoque une erreur (le tableau n'est plus assez grand
pour contenir toutes les lignes).
Un blocage de ligne n'est plus la solution ici car ces lignes n'existent pas
la premire lecture. On sera souvent amen eectuer un blocage explicite
de table, ou choisir le degr d'isolation serializable (dcrit dans la section
suivante).
Pour viter tous les problmes dcrits dans la section prcdente, la gestion des transactions doit, si possible, rendre les transactions srialisable :
6.2.
89
6.2.2
Niveaux d'isolation
90
CHAPITRE 6.
6.3.1
Traitement pessimiste
Si l'on est pessimiste, on pense qu'il y aura forcment des problmes d'accs concurrent. Pour pouvoir faire tranquillement son travail, on (les transactions qu'on lance) bloque donc les donnes sur lesquelles on veut travailler.
Un tel blocage durera le temps de la transaction en cours.
6.3.
91
6.3.2
Traitement optimiste
Si l'on est optimiste, on pense que tout va bien se passer et que les autres
transactions ne vont pas modier les donnes sur lesquelles on va travailler.
On n'eectue donc aucun blocage.
Pour ne pas tre d'un optimisme bat, au moment o on veut valider le
traitement eectu (et seulement ce moment), on contrle si on a eu raison
d'tre optimiste. Pour cela on dmarre une transaction courte qui bloque les
donnes et vrie que les donnes que l'on a utilises n'ont pas t modies
par une autre transaction.
Si elles n'ont pas t modies, on valide la transaction.
Si malheureusement les donnes ont t modies c'est que l'optimisme
n'tait pas justi. On agit en consquence pour viter les problmes des
accs concurrents dcrits prcdemment : soit on invalide tout le travail effectu dans la transaction, soit on fait un travail correcteur ou alternatif. Par
exemple, si le traitement comporte une interaction avec l'utilisateur, on peut
lui proposer plusieurs choix pour terminer au mieux la transaction.
Il y a plusieurs faons de reprer qu'une autre transaction a modi les
valeurs. La faon la plus simple est de comparer tout simplement les valeurs
lues au moment o on en a eu besoin et au moment o on va valider la
transaction. Mais a ne convient pas aux donnes de grandes tailles. On peut
aussi ajouter chaque ligne des tables une information lie la dernire
modication de la ligne. Par exemple on peut ajouter un numro de version
incrment chaque modication de la ligne ; on peut utiliser pour cela une
squence ; voir 5.5.3, ou un timestamp qui indique le moment exact de la
dernire modication ( la microseconde prs par exemple).
92
CHAPITRE 6.
Remarque 6.1
Le traitement optimiste permet une granularit trs ne (au niveau des
attributs et pas des lignes) dans le cas o la validation de la transaction
utilise la comparaison des valeurs des donnes utilises. En eet, rien
n'empche une autre transaction de modier des donnes des lignes que
l'on utilise partir du moment o elle ne modie pas les attributs qui
sont intervenus dans le traitement.
Le choix entre un traitement pessimiste ou optimiste dpend du contexte
et il n'est pas toujours vident. Comme il a t dit, si le traitement comporte une intervention de l'utilisateur place entre la lecture des donnes
et l'criture des nouvelles donnes, le traitement optimiste est sans doute le
meilleur. En revanche, si le risque de problmes de concurrence est trop grand
(s'il y a peu de chance que l'optimisme soit justi), le choix pessimiste est
sans doute le meilleur pour viter trop de calculs inutiles et d'invalidation au
dernier moment de la procdure.
6.4 Traitement par dfaut des accs concurrents par les SGBDs
Pour mettre en uvre le type de traitement des accs concurrents qu'ils
ont choisis, les dveloppeurs peuvent s'appuyer sur les possibilits oertes
par les SGBDs.
Les SGBDs grent automatiquement les accs concurrents mais permettent
de choisir d'autres modes de fonctionnement en posant des verrous explicites.
Nous allons dcrire le comportement d'Oracle.
Le mode de fonctionnement par dfaut de la plupart des SGBDs est le
mode read committed : les modications eectues par une transaction ne
sont connues des autres transactions que lorsque la transaction a t conrme (ordre COMMIT).
Une opration eectue par un SGBD doit s'eorcer d'eectuer une lecture consistante des donnes qu'elle manipule : toutes ces donnes doivent
avoir les valeurs qu'elles avaient un mme moment prcis. La lecture de
tous les salaires des employs d'une entreprise par une requte SQL peut
prendre un certain temps. Cependant si le premier salaire est lu au moment
t1, en tenant compte des modications eectues par toutes les transactions
valides ce moment, il faut que les valeurs lues pour tous les autres salaires soient celles qu'ils avaient au mme moment t1, mme si une autre
transaction valide les a modis depuis le moment t1.
Certains SGBDs, Oracle en particulier, assurent une lecture consistante
6.4.
93
des donnes pendant l'excution d'un seul ordre SQL ; par exemple, un ordre
SELECT ou UPDATE va travailler sur les lignes telles qu'elles taient au
moment du dbut de l'excution de la commande, mme si entre-temps une
autre transaction valide par un COMMIT a modi certaines de ces lignes.
De mme, si une commande UPDATE comporte un SELECT embot, les
modications de la commande UPDATE ne sont pas prises en compte par
le SELECT embot. Les SGBDs comme DB2 qui ne conservent pas plusieurs versions des donnes rcemment modies n'orent pas cette lecture
consistante.
Aucun SGBD n'assure automatiquement une lecture consistante pendant
toute une transaction. Si une transaction est valide, toutes les autres transactions voient ensuite les modications qu'elle a eectue. Ce comportement
n'est pas souhait pour des traitements, tels que les bilans, qui souhaitent
voir toutes les donnes comme elles taient au moment du dbut de la transaction. Il est cependant possible d'obtenir une lecture consistante pendant
toute une transaction. On peut
soit indiquer que la transaction est en lecture seule par
set
94
CHAPITRE 6.
transaction.
Ces comportements sont mis en uvre par les SGBDs en provoquant implicitement des blocages sur les lignes ou les tables impliques lors de certains
traitements : DELETE, UPDATE, INSERT, SELECT FOR UPDATE et les
ordres de dnitions et de contrle des donnes : LDD (Langage de Dnition
des Donnes) et LCD (Langage de Contrle des Donnes) : ALTER TABLE,
GRANT, etc. Certains SGBDs (mais pas Oracle) posent aussi un verrou avec
la commande SELECT.
Voici les blocages eectus implicitement par Oracle :
Ordre SQL
DELETE, UPDATE
Exclusif
Row Exclusive
INSERT
SELECT FOR UPDATE
Row Exclusive
Exclusif
LDD/LCD
Row Share
Exclusif
6.5.
95
BLOCAGES EXPLICITES
6.5.1
Les commandes qui provoquent des blocages explicites sont lock table
et select for update.
Voici les cinq variantes de la commande
96
CHAPITRE 6.
Ce mode tant trs contraignant pour les autres utilisateurs (ils sont mis
en attente et ne reprennent la main qu'au dblocage de la table), le blocage
doit tre le plus court possible. Un blocage en mode exclusif doit tre suivi
rapidement d'un COMMIT ou d'un ROLLBACK.
Remarque 6.2
Pour les 5 modes de blocage, l'option NOWAIT (ajoute la n de
la commande LOCK) permet de reprendre immdiatement la main au
cas o la table que l'on veut bloquer serait dj bloque. Par exemple :
6.5.
BLOCAGES EXPLICITES
97
98
CHAPITRE 6.
Remarque 6.3
Si on n'eectue pas ce type de blocage sur les donnes que l'on veut
modier, on risque d'avoir un problme de mise jour perdue : les
donnes que l'on a lues par un SELECT pour les modier ont t modies par une autre transaction avant qu'on ait le temps d'enregistrer
leur nouvelle valeur. On peut choisir de ne pas eectuer ce blocage et
faire un traitement optimiste (on espre qu'aucune transaction n'a
travaill sur les mmes donnes) et des vrications au moment du
COMMIT pour voir si on avait eectivement raison d'tre optimiste
(voir 6.3.2 page 91).
Tableau rcapitulatif
Ce tableau indique les commandes qui sont autorises dans chacun des
modes de blocage.
6.5.
99
BLOCAGES EXPLICITES
Modes
SRX
RX
RS
non
non
non
non
non
non
non
non
non
OUI
non
non
OUI
non
OUI
non
non
non
OUI
OUI
non
OUI
OUI
OUI
OUI
INSERT
non
non
non
OUI *
OUI *
non
OUI *
OUI *
OUI *
OUI *
Commandes
CLUSIVE (SRX)
(RX)
DELETE
UP-
DATE
SELECT FOR UPDATE
* condition que l'on ne travaille pas sur des lignes dj bloques par
une autre transaction.
Index
ABS, 48
DATE, 7
accs concurrents, 86
date du jour, 29
ACID, 22
DECODE, 53
DEFAULT, 12
ALTER TABLE, 60
DELETE, 22
AND, 33
DESC, 54
dictionnaire de donnes, 81
ASCII, 50
AVG, 45
DISTINCT, 45
BETWEEN, 32
bloquer des donnes, 98
case, 51
catalogue, 59
changer son mot de passe, 83
CHAR, 6
CHR, 50
COALESCE, 9
colonne, 4
COMMIT, 23, 95
division, 42
donner des droits d'accs, 82
DROP INDEX, 68
DROP VIEW, 64
DUAL, 4
enlever des droits d'accs, 83
EXCEPT, 55
except, 55
EXISTS, 41
EXIT, 3
fonction de choix, 51
CONSTRAINT, 12
fonction stocke, 73
fonction utilisateur, 74
COUNT, 45
fonctions arithmtiques, 48
crer un index, 66
fonctions de groupes, 45
FOREIGN KEY, 13
FROM, 29
CREATE INDEX, 66
CREATE TABLE, 11
GRANT, 82
CREATE VIEW, 63
GREATEST, 48
CURRENT_DATE, 51
GROUP BY, 45
100
101
INDEX
HAVING, 47
identicateur, 3
IN, 32
nom de l'utilisateur, 29
index, 66
norme SQL, 1
NOT, 33
NULL, 8
INSERT, 19
NULLIF, 10
INSTEAD OF, 79
NUMBER, 5
INSTR, 48
NVL, 10
interblocage, 87, 95
interroger la base, 26
INTERSECT, 55
intersect, 55
OLAP, 69
ON DELETE CASCADE, 13
ON DELETE SET NULL, 13
IS NULL, 33
jointure, 33
oprateur ensembliste, 54
jointure externe, 36
oprateur logique, 33
jointure naturelle, 35
oprateurs, 9
oprateurs arithmtiques, 9
LCD, 1, 94
LDD, 1, 59, 94
LEAST, 48
OR, 33
ORDER BY, 53
pessimiste, 90
LENGTH, 48
point de reprise, 25
POWER, 48
56
PRIMARY KEY, 12
LMD, 1, 19
privilges d'accs, 82
LOCK TABLE, 95
procdure stocke, 73
LOWER, 49
pseudo-colonne, 28
LPAD, 49
pseudo-table, 4
LTRIM, 49
PUBLIC, 83
MAX, 45
rle, 84
MIN, 45
REFERENCES, 13
MINUS, 55
minus, 55
REPLACE, 49
MOD, 48
REVOKE, 83
ROLLBACK, 23, 95
102
INDEX
ROUND, 48, 51
trigger, 75
rowid, 29
rownum, 28
TRUNC, 48, 51
RPAD, 49
type chane, 6
RTRIM, 49
type numrique, 5, 7
type numrique d'Oracle, 5
savepoint, 25
schma, 59
type temporels, 7
types d'index, 68
squence, 71
types de contraintes, 12
srialisable, 88
srialisation, 88
SIGN, 48
sous-interrogation, 38
SQLFORMS, 2
SQRT, 48
STDDEV, 45
SUBSTR, 48
SUM, 45
supprimer des lignes, 21
supprimer un index, 68
supprimer une colonne, 61
supprimer une table, 62
supprimer une vue, 64
synonyme, 84
union, 55
UNIQUE, 13
UPDATE, 20
UPPER, 49
USER, 53
user, 29
utilisation d'une vue, 64
utilit des vues, 65
valider une transaction, 23
VARCHAR, 6
VARCHAR2, 6
VARIANCE, 45
vue, 62
synonyme public, 62
WHERE, 31
SYSDATE, 51
sysdate, 29
table, 3
table DUAL, 4
TO_CHAR, 48, 49
TO_DATE, 51
TO_NUMBER, 48, 50
traitement optimiste, 91
traitement pessimiste, 90
transaction, 22
TRANSLATE, 49