Vous êtes sur la page 1sur 51

Data warehouse

Rvision des
bases de
donnes en vue
de
l'implmentation

STPHANE CROZAT

Paternit - Partage des Conditions Initiales l'Identique :


http://creativecommons.org/licenses/by-sa/2.0/fr/

23 septembre 2014

Table des
matires
Introduction

I - Pratique : Mdiathque

A. Cration de la base Oracle..............................................................................7


B. Questions avances en SQL..........................................................................11
C. Vue...........................................................................................................12

II - Application

15

A. Employs Oracle.........................................................................................15
B. Dure de tournage d'un film.........................................................................16
C. Dure de tournage d'un film RO....................................................................17

III - Rappels thoriques

19

A. Prise en main de Oracle SQL Developer..........................................................19


1.
2.
3.
4.
5.
6.

Installation de SQL Developer...........................................................................................19


Connexion avec SQL Developer.........................................................................................20
Naviguer dans le catalogue de SQL Developer.....................................................................20
Excuter des requtes SQL avec SQL Developer..................................................................21
crire du PL/SQL avec SQL Developer................................................................................24
Excution de fichiers SQL.................................................................................................26

B. Rappels SQL...............................................................................................26
1.
2.
3.
4.
5.
6.
7.

Fichier CSV.....................................................................................................................26
Agrgats........................................................................................................................28
Cration de vues.............................................................................................................29
Transactions en SQL........................................................................................................30
Fonctions SQL connatre................................................................................................31
Fonctions de traitement des dates.....................................................................................32
Sous-requtes dans la clause FROM...................................................................................33

C. Rappels Oracle............................................................................................34
1.
2.
3.
4.
5.
6.

Accs inter-schmas........................................................................................................34
Fentrage des donnes....................................................................................................35
Dictionnaire de donnes...................................................................................................36
Excution de fichiers SQL.................................................................................................37
Excuter des requtes SQL avec SQL Developer..................................................................37
SQL*Plus.......................................................................................................................39

D. Rappels Oracle PL/SQL.................................................................................41


1. Structure d'un bloc PL/SQL...............................................................................................41
2. Blocs PL/SQL : Procdure, fonction, bloc anonyme...............................................................41

Stphane Crozat

Pratique : Mdiathque

Pratique : Mdiathque

3. Affichage l'cran...........................................................................................................43
4. crire du PL/SQL avec SQL Developer................................................................................43

E. Rappels Oracle RO.......................................................................................45


1.
2.
3.
4.

Dclaration des types utilisateurs en SQL3 (extension au LDD).............................................45


Dfinition de tables objets (modles et LDD).......................................................................46
Mthodes de table objet...................................................................................................47
Mthodes et SELF............................................................................................................47

Solution des exercices

49

Signification des abrviations

53

Bibliographie

55

Webographie

57

Stphane Crozat

Stphane Crozat

Introduction

Volume de cours : 4h

Stphane Crozat

Pratique :
Mdiathque
I-

Cration de la base Oracle

I
7

Questions avances en SQL

11

Vue

12

A. Cration de la base Oracle


Question
[Solution n1 p 49]
Implmentez la base mediatheque correspondant aux fichiers ci-aprs.

Vous crerez 1 fichier mediatheque.sql qui appellera les 4 fichiers create.sql,


insert1.sql, insert2.sql et insert3.sql.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29

Stphane Crozat

-- CREATE TABLE
create table CLIENT (
num number,
nom varchar(20),
prenom varchar(20),
adresse varchar(128),
date_nais date,
tel varchar(20),
sexe char check (sexe in ('m','f')),
constraint PK_CLIENT primary key (num)
);
create sequence client_seq
INCREMENT BY 1
START WITH 1
NOMAXVALUE
NOCYCLE
CACHE 10;
create table FACTURE (
num number,
date_etabli date,
client number,
constraint PK_FACTURE primary key (num),
constraint FK_FACTURE_CLIENT foreign key (client) references
CLIENT(num)
);
create sequence facture_seq

Pratique : Mdiathque
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32

Stphane Crozat

Pratique : Mdiathque

INCREMENT BY 1
START WITH 1
NOMAXVALUE
NOCYCLE
CACHE 10;
create table PRODUIT (
num number,
designation varchar(128),
prix number,
stock number,
constraint PK_PRODUIT primary key (num)
);
create sequence produit_seq
INCREMENT BY 1
START WITH 1
NOMAXVALUE
NOCYCLE
CACHE 10;
create table LIGNE_FACT (
facture number,
produit number,
qte number,
constraint FK_LIGNE_FACT_FACTURE foreign key (facture) references
FACTURE(num),
constraint FK_LIGNE_FACT_PRODUIT foreign key (produit) references
PRODUIT(num),
constraint PK_LIGNE_FACT primary key (facture, produit)
);
-- INSERT INTO CLIENT
insert into CLIENT(num, nom, prenom, adresse, date_nais, tel, sexe)
values (
client_seq.NEXTVAL,
'coulomb',
'francois',
'4, rue liberte',
to_date('02121980','DDMMYYYY'),
'06456780',
'm'
);
insert into CLIENT(num, nom, prenom, adresse, date_nais, tel, sexe)
values (
client_seq.NEXTVAL,
'bernard',
'dupont',
'120, square zola',
to_date('19081972','DDMMYYYY'),
'01345678',
'm'
);
insert into CLIENT(num, nom, prenom, adresse, date_nais, tel, sexe)
values (
client_seq.NEXTVAL,
'corda',
'nathalie',
'66, bv napoleon III',
to_date('02101977','DDMMYYYY'),
'06455790',
'f'
);

Stphane Crozat

Pratique : Mdiathque
33
34
35
36
37
38
39
40
41
42
43

Stphane Crozat

insert into CLIENT(num, nom, prenom, adresse, date_nais, tel, sexe)


values (
client_seq.NEXTVAL,
'pierre',
'alexandre',
'1, place des martyres',
to_date('19081972','DDMMYYYY'),
'01645870',
'f'
);
commit;

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24

-- INSERT INTO PRODUIT

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28

-- INSERT INTO FACTURE, LIGNE_FACT

insert into PRODUIT(num, designation, prix, stock) values(


produit_seq.NEXTVAL,
'DVD Matrix',
23.5,
100
);
insert into PRODUIT(num, designation, prix, stock) values(
produit_seq.NEXTVAL,
'DVD seigneur des anneaux',
49.30,
100
);
insert into PRODUIT(num, designation, prix, stock) values(
produit_seq.NEXTVAL,
'CD Album Yanni',
25.9,
100
);
commit;

-- Facture 1
insert into FACTURE(num, client, date_etabli) values(
facture_seq.NEXTVAL,
2,
to_date('20122000','DDMMYYYY')
);
insert into LIGNE_FACT(facture, produit, qte) values(
facture_seq.CURRVAL,
1,
1
);
insert into LIGNE_FACT(facture, produit, qte) values(
facture_seq.CURRVAL,
2,
2
);
-- Facture 2
insert into FACTURE(num, client, date_etabli) values(
facture_seq.NEXTVAL,
2,
to_date('01012001','DDMMYYYY')

Pratique : Mdiathque
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96

Stphane Crozat

10

Pratique : Mdiathque

);
insert into LIGNE_FACT(facture, produit, qte) values(
facture_seq.CURRVAL,
1,
2
);
insert into LIGNE_FACT(facture, produit, qte) values(
facture_seq.CURRVAL,
3,
1
);
insert into LIGNE_FACT(facture, produit, qte) values(
facture_seq.CURRVAL,
2,
2
);
-- Facture 3
insert into FACTURE(num, client, date_etabli) values(
facture_seq.NEXTVAL,
2,
to_date('17112004','DDMMYYYY')
);
insert into LIGNE_FACT(facture, produit, qte) values(
facture_seq.CURRVAL,
1,
2
);
insert into LIGNE_FACT(facture, produit, qte) values(
facture_seq.CURRVAL,
2,
4
);
insert into LIGNE_FACT(facture, produit, qte) values(
facture_seq.CURRVAL,
3,
1
);
-- Facture 4
insert into FACTURE(num, client, date_etabli) values(
facture_seq.NEXTVAL,
3,
to_date('14012004','DDMMYYYY')
);
insert into LIGNE_FACT(facture, produit, qte) values(
facture_seq.CURRVAL,
2,
1
);
insert into LIGNE_FACT(facture, produit, qte) values(
facture_seq.CURRVAL,
3,
1
);
-- Facture 5

10

Stphane Crozat

10

Pratique : Mdiathque
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147

insert into FACTURE(num, client, date_etabli) values(


facture_seq.NEXTVAL,
4,
to_date('19022004','DDMMYYYY')
);
insert into LIGNE_FACT(facture, produit, qte) values(
facture_seq.CURRVAL,
1,
2
);
insert into LIGNE_FACT(facture, produit, qte) values(
facture_seq.CURRVAL,
3,
3
);
insert into LIGNE_FACT(facture, produit, qte) values(
facture_seq.CURRVAL,
2,
4
);
-- Facture 6
insert into FACTURE(num, client, date_etabli) values(
facture_seq.NEXTVAL,
4,
to_date('17032004','DDMMYYYY')
);
insert into LIGNE_FACT(facture, produit, qte) values(
facture_seq.CURRVAL,
1,
7
);
insert into LIGNE_FACT(facture, produit, qte) values(
facture_seq.CURRVAL,
2,
3
);
insert into LIGNE_FACT(facture, produit, qte) values(
facture_seq.CURRVAL,
3,
1
);
commit;

Indice :
Excution de fichiers SQL (cf. Excution de fichiers SQL p 26)

B. Questions avances en SQL


A la fin de chaque anne, le service marketing tablit un ensemble d'tats qui
permettent d'analyser le profil de leurs clients (leurs prfrences, leur pouvoir
d'achat, etc.) et d'ajuster l'offre de l'association en consquence.

Stphane Crozat

11

Pratique : Mdiathque

Pratique : Mdiathque

Question 1
[Solution n2 p 49]

crivez une requte SQL LMD pour calculer pour chaque produit, le nombre
d'articles vendus, tri par ordre dcroissant.
Indice :
Utilisez la fonction SUM applique la quantit sum(t.qte), la clause GROUP BY
pour faire les calculs par produit, et la clause ORDER BY pour le tri.
Question 2
[Solution n3 p 49]

Ecrivez une requte SQL LMD pour calculer les chiffres d'affaire par client, tris par
ordre dcroissant.
Indice :
Utilisez la fonction SUM applique au produit du prix et de la quantit
(sum(t1.prix*t2.qte)), la clause GROUP BY pour faire les calculs par client, et
la clause ORDER BY pour le tri.
Question 3
[Solution n4 p 49]

Ecrivez une requte SQL LMD pour calculer le montant moyen des factures pour
chaque client, tri par ordre croissant.
Indice :
Vous pouvez utiliser les sous-requtes dans la clause FROM pour traiter la
question en deux tapes.
Question 4
[Solution n5 p 50]
crivez deux requtes SQL LMD pour obtenir la liste des produits dont le prix est
maximal et dont le prix est minimal.

Indice :
Utilisez une sous-requte d'existence de type IN.

C. Vue
Le service aprs vente est instruit se comporter pragmatiquement vis vis
des clients, selon leur catgorie :

"VIP" si le chiffre d'affaire du client est suprieur 500 euros,

"client ordinaire" si son chiffre d'affaire est compris entre 50 et 500 euros,

et "client potentiel" si son chiffre d'affaire est infrieur 50 euros.

Le mcanisme de vue est frquemment utilis pour cacher la complexit d'un


schma de BD aux yeux d'oprateurs ncessitant un schma simple, ou pour cacher
des informations confidentielles aux oprateurs n'ayant pas le droit d'accder des
informations sensibles dans le schma.
Dans notre cas, les oprateurs du service aprs vente dsirent avoir la catgorie du
client au tlphone avec une instruction trs simple :
select * from Chiffre_Affaire where code_client=# ;

Stphane Crozat

12

12

Stphane Crozat

12

Pratique : Mdiathque

Question 1
[Solution n6 p 50]

crivez la requte SQL LMD qui permet de renvoyer la liste des clients (num, nom
et prnom) avec leur chiffre d'affaire et leur catgorie (VIP, Ordinaire ou Potentiel)
Indice :
Utiliser l'extension SQL CASE WHEN d'Oracle :
SELECT CASE WHEN ... THEN
'X' WHEN ... THEN 'Y' ELSE 'Z' END
FROM ...
Question 2
[Solution n7 p 50]
crivez la requte SQL LDD qui cre la vue "Chiffre_Affaire" permettant de
rpondre au besoin des oprateurs du service aprs vente.

Question 3
[Solution n8 p 50]

crire la requte SQL LMD qui renvoie la catgorie du client 1.


Indice :
Utilisez la vue dans la clause FROM de votre requte.

Stphane Crozat

13

II -

Application

II

Employs Oracle

15

Dure de tournage d'un film

16

Dure de tournage d'un film RO

17

A. Employs Oracle
[30 minutes]
Crez sous Oracle
enregistrements.
1

la table

"emp"

dcrite

ci-dessous et insrez quelques

emp (ename, job, hiredate, sal)

Pour chacune des questions suivantes, crivez le code SQL permettant de rpondre
la question sous Oracle.
Question 1
[Solution n9 p 50]

A partir de la table "emp", afficher le nom des employs ("ename") concatn avec
leur poste ("job") en les sparant par une virgule suivi d'une espace et donner
comme titre la colonne "EMPLOYE ET FONCTION"
Question 2
[Solution n10 p 51]
Afficher le nom et la date d'embauche ("hiredate") des employs embauchs entre
le 20 fvrier 1981, et 1 mai 1981. Classez le rsultat par date d'embauche.

Indice :
Attention l'utilisation du format "YY" qui pose des problme vis vis du
passage l'an 2000, prfrer le format "YYYY".
Question 3
[Solution n11 p 51]

Afficher le nom de tous les employs, dont le nom contient deux fois la lettre "L".
Question 4
[Solution n12 p 51]
Afficher le nom, poste et salaire ("sal') de tous les personnes qui ont comme poste
'Clerk' ou 'Analyst' et dont le salaire est diffrent de $1000, $3000, ou $5000.

Stphane Crozat

15

Application

Application

Question 5
[Solution n13 p 51]
Afficher le nom de chaque employ et calculer le nombre de mois qu'il a travaill
jusqu' ce jour (aprs l'avoir arrondi celui-ci la plus proche valeur entire).
Nommer la colonne MONTHS_WORKED.

Question 6
[Solution n14 p 51]

Ecrivez la requte qui affiche pour chaque employ le rsultat suivant :


"X" gagne "Y" par mois mais il veut "3 fois Y".
Nommer la colonne SALAIRES DE REVES.
Question 7
[Solution n15 p 51]
Afficher le salaire maximum, minimum, la somme des salaires et le salaire moyen
de tous les employs. Nommer les colonnes respectivement Maximum, Minimum,
Sum, and Average. Arrondissez les rsultats zro dcimales.

B. Dure de tournage d'un film


[10 min]
Soit le modle UML de la relation Film ci-aprs.

Film (mthode)
Soit la table
relationnel :
1

Film implmente sous Oracle et correspondant au modle

Film(#isan:char(33),titre:varchar2,debut:date,fin:date)

Question 1
[Solution n16 p 52]

crire une fonction duree permettant de retourner un nombre entier de jours entre
deux dates passes en argument.
Indice :
On pourra utiliser la conversion des dates en Julian day, c'est dire le nombre
de jours depuis le 01/01/-4712.

to_char(d,'j') retourne le Julian day de la date d sous la forme d'une


chane de caractres.
Exemple : to_char( to_date('20000101','YYYYMMDD')) = '2451545'

to_number(to_char(d,'j'),'9999999') retourne le Julian day de la


date d sous la forme d'un entier de 7 chiffres.
Exemple :
to_number(to_char(
= 2451545

Stphane Crozat

16

to_date('20000101','YYYYMMDD'),'99999999')

16

Stphane Crozat

16

Application

Question 2
[Solution n17 p 52]

Crer en SQL une vue vFilm affichant tous les attributs de Film, avec une colonne
supplmentaire affichant la dure.

C. Dure de tournage d'un film RO


[10 min]
Soit le modle UML de la relation Film ci-aprs.

Film (mthode)
Question
Implmentez cette table en relationnel-objet sous Oracle

Stphane Crozat

17

Rappels
thoriques
III -

III

Prise en main de Oracle SQL Developer

19

Rappels SQL

26

Rappels Oracle

35

Rappels Oracle PL/SQL

42

Rappels Oracle RO

46

A. Prise en main de Oracle SQL Developer


1. Installation de SQL Developer
Site Web
http://www.oracle.com/technology/products/database/sql_developer
(Tlchargement pour Windows, Mac et Linux)

Stphane Crozat

19

Rappels thoriques

Rappels thoriques

Complment
Documentation en ligne disponible la mme adresse.

2. Connexion avec SQL Developer


Crer une connexion la base de donnes Oracle de l'UTC
1. Clic droit sur Connexions, puis Nouvelle connexion
2. Entrez vos paramtres :
Nom libre
Username / Password
Hte : sme-oracle.sme.utc
SID : nf26

Image 1 Fentre de connexion SQL Developer

3. Naviguer dans le catalogue de SQL Developer


L'espace de gauche permet de naviguer dans le catalogue de la base de donnes et
donc de visualiser les tables, vues, index, etc.

Stphane Crozat

20

20

Stphane Crozat

20

Rappels thoriques

Image 2 Fentre principale SQL Developer

Attention
Pour rafrachir la vue de gauche (catalogue) aprs une requte LDD, il faut faire un
clic droit sur l'lment du catalogue (par exemple Tables aprs une cration de
table) puis slectionner Rgnrer.

4. Excuter des requtes SQL avec SQL Developer


L'espace de droite permet d'crire des requtes SQL (en haut) et de visualiser le
rsultat de l'excution (en bas). Appuyer sur le bouton Excuter un script
ou
faire F5 pour excuter les requtes saisies.

Stphane Crozat

21

Rappels thoriques

Rappels thoriques

Image 3 SQL (script)

Remarque
Pour effacer les rsultats d'excution prcdents, cliquer sur Effacer

Excuter une seule requte au sein d'un script


Pour n'excuter qu'une seule requte parmi celle saisies dans la zone du haut, la
slectionner, puis cliquer sur Excuter un script ou faire F5.

Stphane Crozat

22

22

Stphane Crozat

22

Rappels thoriques

Image 4 SQL (instruction par instruction)

Excuter une seule requte SELECT


Pour les requtes SELECT, SQL Developer propose un affichage sous forme de
tableau, plus lisible que l'affichage texte. Pour excuter une requte SELECT et
obtenir un tel affichage, cliquer sur Excuter l'instruction
ou faire F9.

Stphane Crozat

23

Rappels thoriques

Rappels thoriques

Image 5 SQL (une seule instruction SELECT)

Attention
Le bouton Excuter l'instruction n'affiche pas les erreurs d'excution ou les
confirmations de cration ou insertion (requtes CREATE, INSERT, UPDATE), il est
donc rserver aux requtes SELECT valides (si le rsultat n'est pas correct,
utiliser Excuter un script).

Conseil
Dans le doute utilisez toujours F5 et jamais F9.

5. crire du PL/SQL avec SQL Developer


Pour crer des blocs PL/SQL, procder comme pour le SQL, avec le bouton
Excuter un script.

Stphane Crozat

24

24

Stphane Crozat

24

Rappels thoriques

Image 6 PL/SQL (Fonction compile avec succs)

Attention : Traiter les erreurs de compilation


Pour voir les erreurs de compilation, il faut faire un clic droit sur le nom de la
fonction ou de la procdure (zone de gauche), puis choisir Compiler pour le
dbogage.
L'instruction show errors ne fonctionne pas.

Stphane Crozat

25

Rappels thoriques

Rappels thoriques

Image 7 PL/SQL (Fonction en erreur)

6. Excution de fichiers SQL


Mthode
Pour enregistrer un script SQL ou PL/SQL crit dans Oracle SQL Developer sous la
forme d'un fichier utiliser la fonction file > save as.

Mthode
Pour excuter un fichier SQL ou PL/SQL utiliser la commande @fichier.sql

Exemple
1
2
3

: script.sql

@file1.sql
@file2.sql
@file3.sql

B. Rappels SQL
1. Fichier CSV
Dfinition : Fichier CSV
CSV est un format informatique permettant de stocker des donnes tabulaires

Stphane Crozat

26

26

Stphane Crozat

26

Rappels thoriques

dans un fichier texte.


Chaque ligne du fichier correspond une ligne du tableau. Les valeurs de chaque
colonne du tableau sont spares par un caractre de sparation, en gnral une
virgule ou un point-virgule. Chaque ligne est termine par un caractre de fin
de ligne (line break).
Toutes les lignes contiennent obligatoirement le mme nombre de valeurs (donc
le mme nombre de caractres de sparation). Les valeurs vides doivent tre
exprimes par deux caractres de sparation contigus.
La taille du tableau est le nombre de lignes multipli par le nombre de valeurs dans
une ligne.
La premire ligne du fichier peut tre utilise pour exprimer le nom des colonnes.

Syntaxe
1
2
3
4

[NomColonne1;NomColonne2;...;NomColonneN]
ValeurColonne1;ValeurColonne2;...;ValeurColonneN
ValeurColonne1;ValeurColonne2;...;ValeurColonneN
...

Exemple
1
2
3
4

Pierre;Dupont;20;UTC;NF17
Pierre;Dupont;20;UTC;NF26
Paul;Durand;21;UTC;NF17
Jacques;Dumoulin;21;UTC;NF29

Exemple
1
2
3
4
5

: Fichier CSV avec entte

Prenom;Nom;Age;Ecole;UV
Pierre;Dupont;20;UTC;NF17
Pierre;Dupont;20;UTC;NF26
Paul;Durand;21;UTC;NF17
Jacques;Dumoulin;21;UTC;NF29

Exemple
1

: Fichier CSV sans entte

: Valeur nulle

Jacques;Dumoulin;;UTC;NF29

L'ge est inconnu (NULL).

Attention : Variations...
La syntaxe des fichiers CSV n'est pas compltement standardise, aussi des
variations peuvent exister :

Les chanes de caractres peuvent tre protges par des guillemets (les
guillemets s'expriment alors avec un double guillemet).

Le caractre de sparation des nombres dcimaux peut tre le point ou la


virgule (si c'est la virgule, le caractre de sparation doit tre diffrent)

...
Un des problme les plus importants reste l'encodage des caractres qui n'est pas
spcifi dans le fichier et peut donc tre source de problmes, lors de changement
d'OS typiquement.

Stphane Crozat

27

Rappels thoriques

Mthode

Rappels thoriques

: Usage en base de donnes

Les fichiers CSV sont trs utiliss en BD pour changer les donnes d'une table
(export/import).
Les SGBD contiennent gnralement des utilitaires permettant d'exporter une
table ou un rsultat de requte sous la forme d'un fichier CSV, en spcifiant un
certain nombre de paramtres (caractre de sparation de valeur, caractre de fin
de ligne, prsence ou non d'une ligne de dfinition des noms des colonnes, etc.).
De mme ils proposent des utilitaires permettant d'importer un fichier CSV dans
une table (en spcifiant les mmes paramtres), voire de crer directement une
table partir du fichier CSV (quand les noms des colonnes sont prsents).

Complment

: Fichiers largeur de colonne fixe

Les fichiers largeur de colonne fixe n'utilisent pas de sparateur de colonne, mais
imposent le mme nombre de caractres pour chaque cellule. L'avantage est de
ne pas avoir spcifier le caractre de sparation, l'inconvnient est la taille de
fichier suprieure si les valeurs ne font pas toutes la mme largeur.

Complment

: XML

Les fichiers XML tendent de plus en plus remplacer les fichiers CSV car ils
permettent d'tre beaucoup plus expressifs sur le schma d'origine. Ils sont
galement plus standards (encodage spcifi, principe de sparation des donnes
par les tags, etc.). Leur seul inconvnient est d'tre plus verbeux et donc plus
volumineux.

Complment

: Tables externes

Certains SGBD, comme Oracle, permettent de crer des tables dites externes, qui
autorisent de crer un schma de table directement sur un fichier CSV,
permettant ainsi un accs SQL standard un fichier CSV, sans ncessit de
l'importer d'abord dans une table.

2. Agrgats
Dfinition : Agrgat
Un agrgat est un partitionnement horizontal d'une table en sous-tables, en
fonction des valeurs d'un ou plusieurs attributs de partitionnement, suivi de
l'application d'une fonction de calcul chaque attribut des sous-tables obtenues.

Syntaxe
1
2
3
4
5

SELECT <liste d'attributs de partionnement projeter et de fonctions


de calcul>
FROM <liste de relations>
WHERE <condition appliquer avant calcul de l'agrgat>
GROUP BY <liste ordonne d'attributs de partitionnement>
HAVING <condition sur les fonctions de calcul>

Exemple
1
2

Stphane Crozat

28

SELECT Societe.Nom, AVG(Personne.Age)


FROM Personne, Societe

28

Stphane Crozat

28

Rappels thoriques
3
4
5

WHERE Personne.NomSoc = Societe.Nom


GROUP BY Societe.Nom
HAVING Count(Personne.NumSS) > 10

Cette requte calcul l'ge moyen du personnel pour chaque socit comportant plus
de 10 salaris.

Remarque : Restriction
Une restriction peut tre applique avant calcul de l'agrgat, au niveau de la clause
WHERE, portant ainsi sur la relation de dpart, mais aussi aprs calcul de l'agrgat
sur les rsultats de ce dernier, au niveau de la clause HAVING.

Attention : Projection
Si dans la clause SELECT, un attribut est projet directement, sans qu'une fonction
lui soit applique, alors il faut imprativement que cet attribut apparaisse dans la
clause GROUP BY (car ce ne peut tre qu'un attribut de partitionnement).

Remarque : Fonctions de calcul sans partitionnement


Si une ou plusieurs fonctions de calcul sont appliques sans partitionnement, le
rsultat de la requte est un tuple unique.

Remarque : Intrt de la clause GROUP BY


Pour que l'utilisation de la clause GROUP BY ait un sens, il faut qu'au moins une
fonction de calcul soit utilise, soit dans la clause SELECT, soit dans la clause
HAVING.

Remarque : Contrle impos par quelques SGBDR


Notons que dans le cas de certains SGBDR (par exemple Oracle), l'ensemble des
attributs de l'agrgation (clause GROUP BY) doivent tre pralablement projets
(donc dclars dans la clause SELECT).

3. Cration de vues
Dfinition : Vue
Une vue est une dfinition logique d'une relation, sans stockage de donnes,
obtenue par interrogation d'une ou plusieurs tables de la BD. Une vue peut donc
tre perue comme une fentre dynamique sur les donnes, ou encore une requte
stocke (mais dont seule la dfinition est stocke, pas le rsultat, qui reste calcul
dynamiquement).
Une vue permet d'implmenter le concept de schma externe d'un modle
conceptuel.
Synonymes : Relation drive, Table virtuelle calcule

Syntaxe
1
2

CREATE VIEW <nom de vue> <nom des colonnes>


AS <spcification de question>

La spcification d'une question se fait en utilisant le LMD.


Le nombre de colonnes nommes doit tre gal au nombre de colonnes renvoyes
par la question spcifie. Le nom des colonnes est optionnel, s'il n'est pas spcifi,
Stphane Crozat

29

Rappels thoriques

Rappels thoriques

c'est le nom des colonnes telle qu'elles sont renvoyes par la question, qui sera
utilis.

Exemple
1
2
3
4

CREATE VIEW Employe (Id, Nom)


AS
SELECT NSS, Nom
FROM Personne

La vue Employe est ici une projection de la relation Personne sur les attributs NSS
et Nom, renomms respectivement Id et Nom.

Remarque : Vue en lecture et vue en criture


Une vue est toujours disponible en lecture, condition que l'utilisateur ait les droits
spcifis grce au LCD. Une vue peut galement tre disponible en criture dans
certains cas, que l'on peut restreindre aux cas o la question ne porte que sur une
seule table (mme si dans certains cas, il est possible de modifier une vue issue de
plusieurs tables).
Dans le cas o une vue est destine tre utilise pour modifier des donnes, il est
possible d'ajouter la clause "WITH CHECK OPTION" aprs la spcification de
question, pour prciser que les donnes modifies ou ajoutes doivent
effectivement appartenir la vue.

Remarque : Vue sur une vue


Une vue peut avoir comme source une autre vue.

Rappel : Vues et hritage


Les vues sont particulirement utiles pour restituer les relations d'hritage perdues
lors de la transformation MCD vers MLD.

4. Transactions en SQL
Introduction
Le langage SQL fournit trois instructions pour grer les transactions.

Syntaxe : Dbut d'une transaction


1

BEGIN TRANSACTION (ou BEGIN) ;

Cette syntaxe est optionnelle (voire inconnue de certains SGBD), une transaction
tant dbute de faon implicite ds qu'instruction est initie sur la BD.

Syntaxe : Fin correcte d'une transaction


1

COMMIT TRANSACTION (ou COMMIT) ;

Cette instruction SQL signale la fin d'une transaction couronne de succs. Elle
indique donc au gestionnaire de transaction que l'unit logique de travail s'est
termine dans un tat cohrent est que les donnes peuvent effectivement tre
modifies de faon durable.

Stphane Crozat

30

30

Stphane Crozat

30

Rappels thoriques

Syntaxe : Fin incorrecte d'une transaction


1

ROLLBACK TRANSACTION (ou ROLLBACK) ;

Cette instruction SQL signale la fin d'une transaction pour laquelle quelque chose
s'est mal pass. Elle indique donc au gestionnaire de transaction que l'unit logique
de travail s'est termine dans un tat potentiellement incohrent et donc que les
donnes ne doivent pas tre modifies en annulant les modifications ralises au
cours de la transaction.

Remarque : Programme
Un programme est gnralement une squence de plusieurs transactions.

5. Fonctions SQL connatre


Rappel
Par opposition aux fonctions de calcul SQL qui s'appliquent sur toute la table pour
raliser des agrgats (en ne renvoyant qu'une seule valeur par regroupement), les
fonctions "mono-ligne" sont des fonctions au sens classique, qui s'appliquent une
ou plusieurs valeurs et renvoient une valeur en retour.
Les fonctions "mono-ligne" :

Manipulent des lments de donnes

Acceptent des arguments en entre et retournent des valeurs en sortie

Agissent sur chaque ligne

Retournent un seul rsultat par ligne

Peuvent modifier les types de donnes

Exemple

Stphane Crozat

Traitement de chane
Concat, substr, length, insrt, lpad, trim
Lower, upper, initcap
Traitement de date
months_between, add_months, next_day, last_day,
SELECT sysdate FROM dual
Oprations mathmatiques sur les dates : SELECT sysdate + 10 FROM
dual
Traitement numrique
Round, Trunc
Floor, Ceil
Mod
Conversion
Conversion implicite
Conversion explicite : TO_DATE, TO_NUMBER, TO_CHAR
Gnrales
NVL (par exemple NVL(X,0) renvoie 0 si X vaut Null)
CASE WHEN condition1 THEN valeur1 WHEN condition2 THEN valeur2
ELSE valeur3 END
Imbrication de fonctions : F3(F2(F1(col,arg1),arg2),arg3)

31

Rappels thoriques

Rappels thoriques

Mthode
Les fonctions mono-ligne sont utilises pour :

Transformer les donnes

Formater des dates et des nombres pour l'affichage

Convertir des types de donnes de colonnes

...

Exemple

: Extraction de chane

La fonction substr(X, A, B) renvoie les B caractres partir du caractre A dans


la chane X.

Complment

Fonctions SQL1

Vous pouvez consulter Oracle : SQL [w_loria.fr/~roegel(1)], page 9 12,


pour avoir une description plus dtaille des fonctions disponibles sous
Oracle.

Rappel : BD "Gestion des intervenants" : Schma relationnel


1
2

tIntervenant (#pknom, prenom, poste)


tCours (#pkannee, #pknum, titre, type, fkintervenant=>tIntervenant,
debut, \fin)

Exemple

: BD "Gestion des intervenants" : Question avec CASE

1
2
3
4
5
6
7

SELECT pknum,
CASE
WHEN type='C' THEN 'Cours'
WHEN type='TD' THEN 'Travaux dirigs'
END AS type_label,
debut
FROM tCours

1
2
3
4

PKNUM
----1
2

TYPE_LABEL
--------------Cours
Travaux dirigs

DEBUT
--------01-JAN-01
02-JAN-01

6. Fonctions de traitement des dates


Syntaxe : Gestion des dates avec TO_DATE
La gestion des dates peut poser des problmes selon les formats paramtrs sur le
serveur Oracle (en gnral par dfaut le format est DD-MON-YY). La solution la plus
rigoureuse consiste utiliser la fonction de conversion TO_DATE.
1

to_date('20021130', 'YYYYMMDD') quivaut 30-NOV-2002.

1 - http://docs.oracle.com/cd/B19188_01/doc/B15917/sqfunc.htm
Stphane Crozat

32

32

Stphane Crozat

32

Rappels thoriques

Attention : TO_CHAR(date) et "fm" (format mask)


Les paramtres de type fm pour format mask (fmday, fmDay, fmDAY, fmMonth...)
permettent de supprimer les zros et espaces.
Ils sont privilgier en gnral :

TO_CHAR(date,'day') retourne 'saturday___' (avec des espaces la fin)

TO_CHAR(date,'fmday') retourne 'saturday'

Exemple

: BD "Gestion des intervenants" : Question avec date

SELECT pknum, TO_CHAR(debut, 'fmday') FROM tcours;

1
2
3
4

PKNUM
----1
2

Exemple
1
2

TO_CHAR(DEBUT,'FMDAY')
---------------------monday
tuesday

: BD "Gestion des intervenants" : Insert avec date

INSERT INTO tCours (pkannee, pknum, titre, type, debut,


fkintervenant)
VALUES ('2003', tCoursSeq.NEXTVAL, 'Relationnel','C', TO_DATE('0801-2001','DD-MM-YYYY'), 'CROZAT');

3
4

SELECT debut FROM tCours;

1
2
3
4
5

DEBUT
--------01-JAN-01
02-JAN-01
08-JAN-01

Complment

TO_CHAR(date)2 ; TO_CHAR(date)3

TO_CHAR(number)4

TO_DATE(char)5 ; TO_DATE(char)6

Formatage7

7. Sous-requtes dans la clause FROM


Il est possible de raffiner progressivement une requte en enchanant les questions
dans la clause FROM.

Syntaxe
1

2
3
4
5
6
7

SELECT ... FROM

http://docs.oracle.com/cd/B19306_01/server.102/b14200/functions180.htm
http://www.techonthenet.com/oracle/functions/to_char.php
http://docs.oracle.com/cd/B19306_01/server.102/b14200/functions181.htm
http://docs.oracle.com/cd/B19306_01/server.102/b14200/functions183.htm
http://www.techonthenet.com/oracle/functions/to_date.php
http://docs.oracle.com/cd/B19306_01/server.102/b14200/sql_elements004.htm

Stphane Crozat

33

Rappels thoriques
2
3
4
5

Rappels thoriques

(SELECT ...
FROM ...
WHERE ...)
WHERE ...

Remarque : Sous-sous requte


Il est possible d'imbriquer successivement plusieurs sous-requtes.
1
2
3
4
5
6
7

SELECT ... FROM


(SELECT ... FROM
(SELECT...
FROM ...
WHERE)
WHERE ...)
WHERE ...

Syntaxe : Jointure de sous-requtes


Il est possible de faire le produit ou la jointure de sous-requtes.
1
2
3
4
5
6

SELECT ... FROM


(SELECT ... FROM
WHERE...)
(SELECT ... FROM
WHERE...)
WHERE ...

Mthode
Cette extension est particulirement utile pour les calculs dagrgat aprs filtrage
ou pour enchaner les calculs dagrgat (par exemple pour faire la moyenne de
comptage aprs regroupement).

Exemple
1

select avg(c) from (select count(b) as c from t group by a)

Exemple
semaine
1
2
3
4

: Enchanement de calculs d'aggrgat

: Calcul de la moyenne des ventes par jour de la

SELECT avg(q) FROM


(SELECT jds AS jds, COUNT(*) AS q
FROM ventes v
GROUP BY jds)

C. Rappels Oracle
1. Accs inter-schmas
Un schma Oracle correspond au sein d'une base de donnes (instance Oracle) un
espace isol comportant toutes les tables appartenant d'un utilisateur du SGBD.
Ainsi chaque utilisateur possde un schma.

Stphane Crozat

34

34

Stphane Crozat

34

Rappels thoriques

Pour simplifier on pourrait plutt dire qu'une base Oracle est en fait une collection
de BD et qu'un schma est une BD.
Lorsqu'un utilisateur se connecte il se connecte gnralement dans son propre
schma. Il lui est nanmoins possible de travailler sur les tables d'autres schmas,
condition d'avoir les droits associs bien entendu.
Instance Oracle
sch1

tab2

tab1
tab3

sch2

sch3

Organisation en schmas d'une instance Oracle

Syntaxe : Lecture des donnes d'une table d'un autre schma


Il suffit de prfixer les noms des tables de leur nom de schma.
1

SELECT * FROM schema.table;

2. Fentrage des donnes


Syntaxe : Rownum
1
2

SELECT ... FROM ... WHERE rownum<=N;


-- avec N le nombre de lignes dsires.

Rownum
La restriction ROWNUM <= N dans la clause WHERE permet filtrer les N premires
lignes de la table.

Remarque
rownum est une pseudo colonne qu'il est bien entendu possible de projeter : SELECT
rownum FROM ...

Syntaxe : Utilisation avance


1
2
3

SELECT a1, ..., aN FROM


(SELECT a1, ..., aN, rownum AS rnum FROM t)
WHERE rnum BETWEEN n1 AND n2

Cette syntaxe permet de slectionner une fentre sur les donnes et pas seulement
les N premires lignes.

Mthode

: Exploration de donnes massives

Lorsque l'on est en prsence de gros volumes de donnes, et que l'on veut se faire
une ide du contenu de ces donnes, il n'est pas souhaitable de faire un simple
SELECT *. En il serait trop long de rapatrier les dizaines de milliers de lignes et de
Stphane Crozat

35

Rappels thoriques

Rappels thoriques

plus cela serait inutile puisque seules quelques unes seraient effectivement lues.
L'usage de rownum permet de s'intresser des fentres de donnes
reprsentatives, pour se faire une ide gnrale.

3. Dictionnaire de donnes
Rappel
Le dictionnaire des donnes contient la description des objets crs et maintenus
par le serveur Oracle.

Syntaxe : Lister les objets appartenant l'utilisateur

SELECT
SELECT
SELECT
SELECT
...

*
*
*
*

FROM
FROM
FROM
FROM

user_tables;
user_sequences;
user_views;
user_procedures;

Syntaxe : Dcrire un objet

describe nom_objet

Complment

Afficher les diffrents types d'objets appartenant l'utilisateur :


SELECT object_type FROM user_objects;

Afficher la liste des objets appartenant l'utilisateur :


SELECT * FROM user_catalog;

Rappel : BD "Gestion des intervenants" : Schma relationnel


1
2

tIntervenant (#pknom, prenom, poste)


tCours (#pkannee, #pknum, titre, type, fkintervenant=>tIntervenant,
debut, \fin)

Exemple
catalogue
1
2
1
2
3
4
5
6
7
8
9
10
11
12

Stphane Crozat

36

: BD "Gestion des intervenants" : Utilisation du

SELECT table_name FROM user_tables;


DESCRIBE tCours;
TABLE_NAME
-----------------------------TINTERVENANT
TCOURS
Name
------------PKANNEE
PKNUM
TITRE
TYPE
FKINTERVENANT

Null
-------NOT NULL
NOT NULL

Type
-----------NUMBER(4)
NUMBER(2)
VARCHAR2(50)
NOT NULL CHAR(2)
NOT NULL VARCHAR2(20)

36

Stphane Crozat

36

Rappels thoriques
13
14

DEBUT
FIN

DATE
DATE

4. Excution de fichiers SQL


Mthode
Pour enregistrer un script SQL ou PL/SQL crit dans Oracle SQL Developer sous la
forme d'un fichier utiliser la fonction file > save as.

Mthode
Pour excuter un fichier SQL ou PL/SQL utiliser la commande @fichier.sql

Exemple
1
2
3

: script.sql

@file1.sql
@file2.sql
@file3.sql

5. Excuter des requtes SQL avec SQL Developer


L'espace de droite permet d'crire des requtes SQL (en haut) et de visualiser le
rsultat de l'excution (en bas). Appuyer sur le bouton Excuter un script
ou
faire F5 pour excuter les requtes saisies.

Image 8 SQL (script)

Stphane Crozat

37

Rappels thoriques

Rappels thoriques

Remarque
Pour effacer les rsultats d'excution prcdents, cliquer sur Effacer

Excuter une seule requte au sein d'un script


Pour n'excuter qu'une seule requte parmi celle saisies dans la zone du haut, la
slectionner, puis cliquer sur Excuter un script ou faire F5.

Image 9 SQL (instruction par instruction)

Excuter une seule requte SELECT


Pour les requtes SELECT, SQL Developer propose un affichage sous forme de
tableau, plus lisible que l'affichage texte. Pour excuter une requte SELECT et
obtenir un tel affichage, cliquer sur Excuter l'instruction
ou faire F9.

Stphane Crozat

38

38

Stphane Crozat

38

Rappels thoriques

Image 10 SQL (une seule instruction SELECT)

Attention
Le bouton Excuter l'instruction n'affiche pas les erreurs d'excution ou les
confirmations de cration ou insertion (requtes CREATE, INSERT, UPDATE), il est
donc rserver aux requtes SELECT valides (si le rsultat n'est pas correct,
utiliser Excuter un script).

Conseil
Dans le doute utilisez toujours F5 et jamais F9.

6. SQL*Plus
Dfinition : SQL*Plus

SQL*Plus est un client Oracle basique en mode texte, qui n'est plus vraiment
utilis (on utilise Oracle SQL Developer la place).
SQL*Plus dsigne aussi un langage interne Oracle destiner grer la
prsentation des rsultats de requtes en mode texte (tats textuels).

Complment

: SQL*Plus dans SQL Developer

Oracle SQL Developer utilise galement SQL*Plus mais ne supporte pas toutes les
fonctions.
http://www.oracle.com/technetwork/developer-tools/sql-developer/sql-worksheetcommands-097146.html

Stphane Crozat

39

Rappels thoriques

Mthode

Rappels thoriques

: Usages

Le paramtrage de la prsentation des rsultats de requte est utile au


dveloppeur pour avoir des retours lisibles dans son terminal d'excution.
Il peut aussi servir des parties applicatives comme le formatage pour un
export CSV.
...

Attention
SQL*PLus ne travaille ni sur le contenu ni sur la structure, uniquement sur la
prsentation.

a) Variables d'environnement
Syntaxe
SQL*Plus permet de fixer la valeur de variables d'environnement avec la
commande :
1

SET param valeur

Ces paramtres peuvent tre lus avec la commande :


1

SHOW param

Exemple
1

SET heading off

Permet de dsactiver l'affichage des enttes de colonne dans le rsultat affich.

Complment
http://docs.oracle.com/cd/B19306_01/server.102/b14357/ch12040.htm

b) Fichiers d'entre et de sortie


Syntaxe : Excuter un fichier
Pour excuter un fichier contenant des commandes SQL ou SQL*Plus :
1

@path/filename

Syntaxe : Sortie dans un fichier


Pour enregistrer les rsultats d'une excution de requtes dans un fichier :
1
2
3

SPOOL path/filename
-- requtes dont on veut rcuprer les rsultats dans le fichier
SPOOL OFF

Complment
Cration d'un fichier CSV avec SQL*Plus (cf. Cration d'un fichier CSV avec
SQL*Plus)

Stphane Crozat

40

40

Stphane Crozat

40

Rappels thoriques

c) Formattage d'une colonne de requte


Syntaxe
1

COLUMN nom_colonne FORMAT format

Largeur de la colonne : An

Chiffre (avec ou sans zro gauche) : 9 / 0

Symboles montaires : $ / L

Sparateurs de virgule et de milliers : . / ,

...

Exemple
1
2
3

COLUMN ename FORMAT A15


COLUMN sal FORMAT $99,990.00
COLUMN mgr FORMAT 999999999

D. Rappels Oracle PL/SQL


1. Structure d'un bloc PL/SQL
Syntaxe
1
2
3
4
5
6
7
8

[Declare]
Variables, curseurs, etc.
Begin
Instructions SQL et PL/SQL
[Exception]
Gestion d'erreur.
End ;
/

Attention : /
Un bloc PL/SQL est termin par un ; comme une instruction SQL.
Par ailleurs, dans les environnements d'excution Oracle (comme SQL*Plus, SQL
Developer...), il est ncessaire de sparer les blocs par un "/" (sur une nouvelle
ligne).
Une bonne habitude est donc de terminer les bloc PL/SQL par des "/".

Complment
http://stackoverflow.com/questions/3024418/two-plsql-statements-with-beginand-end-run-fine-seperately-but-not-together

2. Blocs PL/SQL : Procdure, fonction, bloc anonyme

Stphane Crozat

41

Rappels thoriques

Rappels thoriques

Syntaxe : Procdure
1
2
3
4
5
6
7
8

CREATE OR REPLACE PROCEDURE nom_proc


IS
...
BEGIN
...
[EXCEPTION]
...
END ;

Exemple
1
2
3
4
5
6

: Procdure

CREATE OR REPLACE PROCEDURE pHello (who VARCHAR2)


IS
BEGIN
DBMS_OUTPUT.PUT_LINE('Hello ' || who);
END;
/

Syntaxe : Fonction
1
2
3
4
5
6
7
8
9
10

FUNCTION nom_func
RETURN type_retourn
IS
...
BEGIN
...
RETURN valeur;
[EXCEPTION]
...
END ;

Exemple
1
2
3
4
5
6
7
8

: Fonction

CREATE OR REPLACE FUNCTION fDateDuJour RETURN date


IS
vDate date;
BEGIN
SELECT SYSDATE INTO vDate FROM DUAL;
RETURN vDate;
END;
/

Attention
Le type de retourn par une fonction ne doit pas spcifier de taille :

RETURN varchar

et non RETURN varchar(10)

http://docs.oracle.com/cd/B13789_01/server.101/b10759/statements_5009.htm

Syntaxe : Anonyme
1
2
3

Stphane Crozat

42

[DECLARE]
...
BEGIN

42

Stphane Crozat

42

Rappels thoriques
4
5
6
7

...
[EXCEPTION]
...
END ;

Exemple
1
2
3
4
5
6

: Script anonyme

SET SERVEROUTPUT ON;


BEGIN
pHello('World');
DBMS_OUTPUT.PUT_LINE(fDateDuJour);
END;
/

3. Affichage l'cran
Syntaxe
1

SET SERVEROUTPUT ON

1
2
3

BEGIN
DBMS_OUTPUT.PUT_LINE ('Hello World');
END;

4. crire du PL/SQL avec SQL Developer


Pour crer des blocs PL/SQL, procder comme pour le SQL, avec le bouton
Excuter un script.

Stphane Crozat

43

Rappels thoriques

Rappels thoriques

Image 11 PL/SQL (Fonction compile avec succs)

Attention : Traiter les erreurs de compilation


Pour voir les erreurs de compilation, il faut faire un clic droit sur le nom de la
fonction ou de la procdure (zone de gauche), puis choisir Compiler pour le
dbogage.
L'instruction show errors ne fonctionne pas.

Stphane Crozat

44

44

Stphane Crozat

44

Rappels thoriques

Image 12 PL/SQL (Fonction en erreur)

E. Rappels Oracle RO
1. Dclaration des types utilisateurs en SQL3
(extension au LDD)
Syntaxe : Dclaration de type
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19

Stphane Crozat

CREATE TYPE nom_type AS OBJECT (


nom_attribut1 type_attribut1
...
MEMBER FUNCTION nom_fonction1 (parametre1 IN|OUT
type_parametre1, ...) RETURN type_fonction1
...
) [NOT FINAL];
/
CREATE TYPE BODY nom_type
IS
MEMBER FUNCTION nom_fonction1 (...) RETURN type_fonction1
IS
BEGIN
...
END ;
MEMBER FUNCTION nom_fonction2 ...
...
END ;
END ;
/

45

Rappels thoriques

Rappels thoriques

Syntaxe : Hritage de type


1
2
3

CREATE TYPE sous_type UNDER sur_type (


Dclarations spcifiques ou surcharges
) ;

Remarque : NOT FINAL


Pour tre hritable, un type doit tre dclar avec la clause optionnelle NOT FINAL.

Remarque : Type retourn par une mthode


The datatype cannot specify a length, precision, or scale.
http://docs.oracle.com/cd/B13789_01/server.101/b10759/statements_5009.htm

2. Dfinition de tables objets (modles et LDD)


Dfinition
Une table peut tre dfinie en rfrenant un type de donnes plutt que par des
instructions LDD classiques. On parle alors de table objet.
Synonymes : table-objet, table d'objets

Syntaxe : Modle logique


1

nom_table de nom_type (#attributs_cls)

Syntaxe : LDD SQL3


1
2
3
4
5
6

CREATE TABLE nom_table OF nom_type (


PRIMARY KEY(attribut1),
attribut2 NOT NULL,
UNIQUE (attribut3)
FOREIGN KEY (attribut4) REFERENCES ...
);

Il est possible, sur une table ainsi dfinie, de spcifier les mmes contraintes que
pour une table cre avec une clause CREATE TABLE (contraintes de table). Ces
contraintes doivent tre spcifies au moment de la cration de la table, et non au
moment de la cration du type (bien que la dfinition de type permet de spcifier
certaines contraintes, comme NOT NULL).

Fondamental : OID
Les enregistrements d'une table-objet peuvent tre identifis par un OID

Fondamental : Mthodes
Des mthodes peuvent tre associes une table-objet.

Complment

: Hritage

Cette modalit de dfinition de schma permet de profiter de l'hritage de type


pour permettre l'hritage de schma de table.

Stphane Crozat

46

46

Stphane Crozat

46

Rappels thoriques

Exemple
1
2
3
4
5
6
7
8
9
10

CREATE OR REPLACE TYPE typIntervenant AS OBJECT(


pknom varchar2(20),
prenom varchar2(20)
);
/
CREATE TABLE tIntervenant OF typIntervenant (
PRIMARY KEY(pknom),
prenom NOT NULL
);

3. Mthodes de table objet


Dfinition : Mthodes de table
Si le type sur lequel s'appuie la cration de la table dfinit des mthodes, alors les
mthodes seront associes la table (mthodes de table).
Il sera possible d'accder ces mthodes de la mme faon que l'on accde aux
attributs (projection, slection...).

Syntaxe : Accs aux mthodes d'une table objet


1
2
3

SELECT t.m1(), t.m2() ...


FROM table t
...

Attention
L'utilisation d'un alias est obligatoire pour accder aux mthodes.

Exemple
1
2
3
4
5
6
7
8
9
10
11

CREATE OR REPLACE TYPE BODY typCours IS


MEMBER FUNCTION fin RETURN DATE
IS
BEGIN
RETURN SELF.debut + 5;
END;
END;
/
SELECT c.pkannee, c.pknum, c.fin()
FROM tCours c;

4. Mthodes et SELF
SELF
Lorsque l'on crit une mthode on a gnralement besoin d'utiliser les attributs
propres (voire d'ailleurs les autres mthode), de l'objet particulier que l'on est en
train de manipuler.
On utilise pour cela la syntaxe SELF qui permet de faire rfrence l'objet en
cours.

Stphane Crozat

47

Rappels thoriques

Rappels thoriques

Syntaxe : SELF
1
2

self.nom_attribut
self.nom_mthode(...)

Exemple
1
2
3
4
5
6
7
8
9
10

: Total d'une facture

MEMBER FUNCTION total RETURN number


IS
t number;
BEGIN
SELECT sum(f.qte) INTO t
FROM facture f
WHERE f.num=self.num;
RETURN t;
END total;

Remarque : SELF implicite


Dans certains cas simples, lorsqu'il n'y a aucune confusion possible, SELF peut tre
ignor et le nom de l'attribut ou de la mthode directement utilis.
Il est toutefois plus systmatique et plus clair de mettre explicitement le self.

Exemple
1
2
3
4
5

Stphane Crozat

48

: Exemple de SELF implicite

MEMBER FUNCTION adresse RETURN varchar2


IS
BEGIN
RETURN num || rue || ville;
END;

48

Stphane Crozat

48

Solution des
exercices
> Solution n1 (exercice p. 7)
1
2
3
4
5
6

-- mediatheque.sql
@create.sql
@insert1.sql
@insert2.sql
@insert3.sql
COMMIT;

> Solution n2 (exercice p. 12)


1
2
3
4
5

select p.num, p.designation, sum(lf.qte) as nb


from produit p, ligne_fact lf
where lf.produit=p.num
group by p.num, p.designation
order by nb desc;

> Solution n3 (exercice p. 12)


1
2
3
4
5
6
7

select c.num, c.nom, c.prenom, sum(p.prix*lf.qte)


from client c, produit p, facture f, ligne_fact lf
where p.num=lf.produit
and lf.facture=f.num
and f.client=c.num
group by c.num, c.nom, c.prenom
order by sum(p.prix*lf.qte) DESC;

> Solution n4 (exercice p. 12)


1
2
3
4
5
6
7
8
9

Stphane Crozat

select client, avg(montant) moy


from (
select c.num as client, f.num, sum(lf.qte*p.prix) as montant
from facture f, ligne_fact lf, client c, produit p
where lf.facture=f.num and lf.produit=p.num and f.client=c.num
group by c.num, f.num
)
group by client
order by moy;

49

Solution des exercices

Solution des exercices

> Solution n5 (exercice p. 12)


1
2
3

select distinct designation "PRIX MAX"


from produit
where prix in (select max(prix) from produit);

1
2
3

select distinct designation "PRIX MIN"


from produit
where prix in (select min(prix) from produit);

> Solution n6 (exercice p. 13)


1
2
3
4
5
6
7
8
9
10
11

SELECT c.num, c.nom, c.prenom, sum(p.prix*lf.qte) chiffre_affaire,


CASE
WHEN sum(p.prix*lf.qte)>500 THEN 'VIP'
WHEN sum(p.prix*lf.qte) BETWEEN 50 AND 500 THEN 'Ordinaire'
ELSE 'Potentiel'
END categorie
FROM client c, produit p, facture f, ligne_fact lf
WHERE p.num=lf.produit
AND lf.facture=f.num
AND f.client=c.num
GROUP BY c.num, c.nom, c.prenom;

> Solution n7 (exercice p. 13)


1
2
3
4
5
6
7
8
9
10
11
12

CREATE VIEW v_chiffre_affaire AS


SELECT c.num, c.nom, c.prenom, sum(p.prix*lf.qte) chiffre_affaire,
CASE
WHEN sum(p.prix*lf.qte)>500 THEN 'VIP'
WHEN sum(p.prix*lf.qte) BETWEEN 50 AND 500 THEN 'Ordinaire'
ELSE 'Potentiel'
END categorie
FROM client c, produit p, facture f, ligne_fact lf
WHERE p.num=lf.produit
AND lf.facture=f.num
AND f.client=c.num
GROUP BY c.num, c.nom, c.prenom;

> Solution n8 (exercice p. 13)


1

SELECT categorie FROM v_chiffre_affaire WHERE num=1;

> Solution n9 (exercice p. 15)

Stphane Crozat

1
2

SELECT ename||', '||job "EMPLOYE ET FONCTION"


FROM emp;

1
2
3
4

EMPLOYE ET FONCTION
------------------KING, PRESIDENT
BLAKE, MANAGER

50

50

Stphane Crozat

50

Solution des exercices


5

CLARK, MANAGER

> Solution n10 (exercice p. 15)


1
2
3
4
5
6
1
2
3
4
5
6

SELECT ename, hiredate


FROM emp
WHERE hiredate BETWEEN
TO_DATE('20-Feb-1981','DD-MON-YYYY')
AND TO_DATE('01-May-1981','DD-MON-YYYY')
ORDER BY hiredate;
ENAME
HIREDATE
----------ALLEN
20-FEB-81
WARD
22-FEB-81
JONES 02-APR-81
BLAKE 01-MAY-81

> Solution n11 (exercice p. 15)


1
2
3

SELECT ename
FROM emp
WHERE ename LIKE '%L%L%';

> Solution n12 (exercice p. 15)


1
2
3
4

SELECT ename, job, sal


FROM emp
WHERE job IN ('CLERK', 'ANALYST')
AND sal NOT IN (1000, 3000, 5000);

> Solution n13 (exercice p. 16)


1
2

SELECT ename, ROUND(MONTHS_BETWEEN (SYSDATE, hiredate)) MONTHS_WORKED


FROM emp;

> Solution n14 (exercice p. 16)


1
2
3
4
5
6
7

SELECT
ename||' gagne '
|| TO_CHAR(sal, 'fm$99,999.00')
|| ' par mois mail il veut '
|| TO_CHAR(sal * 3, 'fm$99,999.00')
|| '.' "SALAIRES DE REVES"
FROM emp;

> Solution n15 (exercice p. 16)


1

Stphane Crozat

SELECT ROUND(MAX(sal),0) "Maximum",

51

Solution des exercices


2
3
4
5

Solution des exercices

ROUND(MIN(sal),0) "Minimum",
ROUND(SUM(sal),0) "Sum",
ROUND(AVG(sal),0) "Average"
FROM emp;

> Solution n16 (exercice p. 16)


1
2
3
4
5

CREATE FUNCTION duree(debut date, fin date) RETURN integer


IS
BEGIN
RETURN to_number(to_char(fin,'j'),'99999999') to_number(to_char(debut,'j'),'99999999');
END;

> Solution n17 (exercice p. 17)


1
2
3

Stphane Crozat

52

CREATE VIEW vFilm AS


SELECT isan, titre, debut, fin, duree(debut,fin)
FROM Film;

52

Stphane Crozat

52

Signification des
abrviations
-

BD
CSV
LCD
LDD
LMD
MCD
MLD
OID
OS
SGBD
SGBDR
SQL
XML

Stphane Crozat

Base de Donnes
Comma Separated Values
Langage de Contrle de Donnes
Langage de Dfinition de Donnes
Langage de Manipulation de Donnes
Modle Conceptuel de Donnes
Modle Logique de Donnes
Object Identifier
Operating Systme (Systme d'Exploitation)
Systme de Gestion de Bases de Donnes
Systme de Gestion de Bases de Donnes Relationnelles
Structured Query Language
eXtensible Markup Language

53

Bibliographie

[Abbey01] ABBEY MICHAEL, COREZ MICHAEL, ABRAMSON IAN, Oracle 9i : Notions fondamentales,
CampusPress, 2001.

Stphane Crozat

55

Webographie

[w_loria.fr/~roegel(1)] ROEGEL DENIS, Oracle : SQL, http://www.loria.fr/~roegel/cours/iut/oracle-sql.pdf ,


1999.

Stphane Crozat

57

Vous aimerez peut-être aussi