Vous êtes sur la page 1sur 183

Bases de donnes

2004 - 2005

Mihaela Mathieu
mathieu@emse.fr

Bases de donnes

2004-2005

Objectifs :
comprendre et matriser les fonctions dun SGBD relationnel (Oracle et MySQL)
connatre le langage SQL
savoir dvelopper une application sous Oracle et MySQL

c M. Mathieu

Bases de donnes

2004-2005

Contenu du cours :
Introduction aux SGBD(R)
historique
dfinitions, panorama du march
prsentation dOracle et de SQL*Plus
prsentation de MySQL
Manipulation et description des objets dune base - langage SQL
Systme transactionnel
Administration systme dOracle
catalogues de donnes
gestion des utilisateurs

c M. Mathieu

Bases de donnes

2004-2005

Programmation et bases de donnes


programmation en PL/SQL
Java et le SGBD (Oracle)

c M. Mathieu

Bases de donnes

2004-2005

Contenu TP :
travail avec Oracle (SQL, PL/SQL, C, Java) depuis une plate-forme Windows
ou Unix

Contenu TD :
* rappel du modle relationnel

c M. Mathieu

Bases de donnes

2004-2005

Le cours ne comprend pas :

progammation C pour les bases de donnes


aspects XML
module Oracle Web
... dautres modules dOracle
notions de bases de donnes OLAP, bases de donnes distribues

c M. Mathieu

Bases de donnes

2004-2005

Pr-requis :
logique
cours Systmes dInformations

c M. Mathieu

Bases de donnes

2004-2005

Chapitre 1 :
Introduction aux SGBD(R)
1.
2.
3.
4.

Dfinitions
tat du march
Prsentation dOracle et de SQL*Plus
Prsentation de MySQL

c M. Mathieu

Bases de donnes

2004-2005

Base de donnes = collection structure de donnes cohrentes, intgres, protges et accessibles simultanment aux utilisateurs.
Systme de Gestion de Bases de Donnes = logiciel complexe capable dassurer
lexploitation correcte et efficace des BD.
BD au coeur des Systmes dInformation importance capitale de la qualit,
de la fiabilit et de la bonne exploitation des SGBDs.
Volume dune BD : entre 1 MegaBytes et 10? TeraBytes.
La taille dune BD doit tre transparente lutilisateur et au dveloppeur (-), de
mme pour son dploiement.

c M. Mathieu

Bases de donnes

2004-2005

Une reprsentation dune BD :


Schma externe

Schma externe

Schma conceptuel

Schma physique

Mmoire (externe)

c M. Mathieu

10

Bases de donnes

2004-2005

Le schma conceptuel indique la faon dont les donnes sont modlises,


structures (selon le modle choisi : relationnel, objet ou autre ; les tables et les
indexes, les procdures ...)
Le schma physique indique comment dont les structures choisies sont implantes physiquement. Tout est stock en mmoire.
Les schmas externes sont ddies aux utilisateurs et donnent des vues (partielles) des donnes de la base.

c M. Mathieu

11

Bases de donnes

2004-2005

Les acteurs dune BD :


utilisateurs : nafs, occasionnels, avertis
dveloppeurs
administrateurs (DBA) : administrateurs de donnes et administrateurs systme
experts

c M. Mathieu

12

Bases de donnes

2004-2005

UTILISATEUR
Schma externe

Schma externe

Schma conceptuel

DEVELOPPEUR

Schma physique
EXPERT
DBA
Mmoire (externe)

c M. Mathieu

13

Bases de donnes

2004-2005

Plusieurs configurations sont possibles :


une BD sur une seule machine
plusieurs BD sur la mme machine
une BD sur plusieurs machines (BD distribue)
Une BD peut admettre 1 ou plusieurs utilisateurs simultans.
Pour nimporte quelle configuration le SGBD doit assurer le bon fonctionnement dans la transparence.
Un SGBD doit assurer :

la dfinition des bases de donnes et des objets contenus


la manipulation des donnes
la confidentialit
lintgrit des donnes
la scurit de fonctionnement
la gestion des accs concurrents

c M. Mathieu

14

Bases de donnes

2004-2005

Les SGBD ont un modle de reprsentation des donnes.


Classification de SGBD selon leur modle :

relationnel
rseau, hirarchique (plus maintenant)
orient objet (pass de mode). Exemple : O2
XML

Les fonctions dun SGBD sont indpendantes du modle de reprsentation des


donnes, mais la ralisation de ces fonctions y dpend.
Quelques SGBD :

petits (bureautique) : Paradox, MS Access


moyens SGBD : dBASE, FoxPro
de taille importante : Oracle, DB2, SQL Server, Ingres
logiciel libre : MySQL, PostgeSQL.

Le prix dun SGBD varie entre 100 et quelques 106 euros.


c M. Mathieu

15

Bases de donnes

2004-2005

MySQL - logiciel libre


- SGBD relationnel, client/serveur
- facile installer et utiliser

- supporte mal les gros volumes de donnes


- langage SQL rduit par rapport au standard
- assure mal la cohrence et la consistence de donnes

c M. Mathieu

16

Bases de donnes

2004-2005

ORACLE - SGBD produit depuis 1975 par Oracle Corporation


- SGBD priodiquement mis jour et en volution (dernires versions : 9i et
10G). Version utilise 8.1.7.
SGBD relationnel (qui tolre des reprsentations objets depuis la version 8
et des traitements RI et en langage XML depuis la version 9).
Pourquoi Oracle ?

utilise SQL trs proche du standard comme langage dinterrogation


fiable
multi-utilisateurs
comporte toutes des fonctions des SGBD
possibilit de dvelopper des applications varies
trs rpandu en milieu industriel

(les moins : administration assez lourde pour des gros volumes de donnes, son prix)
c M. Mathieu

17

Bases de donnes

2004-2005

Les composants dOracle :


SQL*Plus : permet de description et la manipulation des donnes travers
le langage SQL
SQL*Loader, SQL*Net, SQL*Admin
compilateur Pro*C
Oracle Entreprise Manager
OracleWeb : dveloppement des application Web
Portail dentreprise, gestionnaire de documents papiers et multimdia
Oracle JDevelopper : ralisation des applications multi-fonctions, multi-fentres
sur la BD
...
Architecture Client /Serveur sur des serveurs Unix, Windows (NT, XP ...), Linux et
clients PC, Linux, Unix.
c M. Mathieu

18

Bases de donnes

2004-2005

Les objets quOracle manipule :


pour la manipulation des donnes :
les tables
les squences
les indexes
les synonymes
les clusters - jointure physiques sur plusieurs tables (distantes)
pour les traitements :
les fonctions et procdures stockes et/ou appeles explicitement
les triggers - procdures dclenches lors des vnements prcis
les assertions - procdures de vrifications lances systmatiquement
pour la gestion des utilisateurs
les users et leurs droits explicites
c M. Mathieu

19

Bases de donnes

2004-2005

Les mta-donnes dOracle :


des tables spcifiques avec des informations sur des objets de la mme
catgorie
Oracle sait aussi grer les transactions.

Une base Oracle peut sinterfacer facilement avec une autre base Oracle ou
autre.
Des nombreux logiciels de dveloppement dapplications travaillent sur les
bases Oracle (Swing, PowerBuilder, OpenRoad, ....)

c M. Mathieu

20

Bases de donnes

2004-2005

Prsentation SQL*Plus
SQL*Plus est un outil dOracle pour interroger la BD.
fonctionne comme un interprteur en ligne
En entre :

des commandes propres


des ordres SQL
des procdures PL/SQL
des fichiers SQL

Il est appel avec la commande :


>sqlplus nom utilisateur@base.localisation[/mot de passe]
c M. Mathieu

21

Bases de donnes

2004-2005

Exemple 1 :
SQL>desc agent ou SQL>describe agent
commande SQL*PLUS qui indique la structure de lobjet agent.
quivalent :
SQL > desc agent
Exemple 2 :
SQL > select *
from agent ;
(toutes les instructions SQL finissent par les caractre ; )
Exemple 3 :
SQL > @fichier.sql excute les ordres contenus dans fichier.sql
c M. Mathieu

22

Bases de donnes

2004-2005

Architecture Oracle utilise :


Oracle 8.1.7 en client/serveur sur educusers (le serveur) et optxy et asixy
(les clients Sun) et PC (les clients Windows).

c M. Mathieu

23

Bases de donnes

2004-2005

Chapitre 2 :
Types de donnes
Les tables dune BD relationnel se composent des attributs qui contiennent
des donnes. Chaque attribut a un type de donnes prcis.
Les types de donnes sous SQL :
tous les types sont simples (pas de types composs, pas de rfrences ...)
ordonns ou pas, indexables ou pas

c M. Mathieu

24

Bases de donnes

2004-2005

Les types de donnes sont les suivants :


Chanes de caractres :
VARCHAR2(taille) : taille variable dau plus 2000 caractres (VARCHAR
sous MySQL)
CHAR(taille) :taille fixe dau plus 255 caractres
LONG : au plus 2 109 caractres
non-indexable
un seul champ LONG par table

c M. Mathieu

25

Bases de donnes

2004-2005

Nombres :
NUMBER(n,v) : n chiffres, v chiffres aprs la virgule (DECIMAL sous
MySQL)
INTEGER
FLOAT
Dates :
DATE : date et heure
type ordonn
permet des oprations numriques
(elle est visible comme une chane de caractres selon le format de
sortie)
Donnes binaires :
RAW(taille) : jusqu 255 octets
LONG RAW : jusqu 2 Giga Octets
pareil que long
pb pour la rcupration de la valeur
c M. Mathieu

26

Bases de donnes

2004-2005

Les constantes :

texte : dlimites par des apostrophes ou guillemets : Chane ou Chaine


numriques : nombre entiers ou virgule : 12, 12,5 ou 12.5
valeurs logiques : TRUE, FALSE
la date courante : SYSDATE (ou NOW sous MySQL)
lobjet NULL
manque de donnes, vide

c M. Mathieu

27

Bases de donnes

2004-2005

La valeur NULL :

dsigne un manque de donnes


0 nest pas NULL
si une expression contient NULL, est vaut NULL
la comparaison avec NULL : IS NULL , est pas = NULL
La fonction NVL permet de corriger dans des expressions une possible valeur NULL :
NVL (attribut, valeur par-dfaut)
La fonction COALESCE est une extension de NVL en admettant un nombre
variable de paramtres, elle retourne la premire valeur non nulle rencontre dans la liste de ses paramtres.

c M. Mathieu

28

Bases de donnes

2004-2005

Fonctions de conversion :
TO CHAR : numrique ou date -> chane de caractres
TO NUMBER : chane ->numrique
TO DATE : chane -> date
Autres fonctions :
GREATEST, LEAST
Opration et fonctions pour le type DATE :
oprations + et - avec la signification :
date +|- nombre : ajout ou suppression dun nombre de jours de la date
date1 - date2 : le nombre de jours entre les deux dates
calcul de dates : LAST DAY, NEXT DAY, ADD MONTHS
c M. Mathieu

29

Bases de donnes

2004-2005

La table DUAL
est cre par dfaut par Oracle et accessible par tous les utilisateurs
ne contient quun champ DUMMY avec la valeur C
est utilise pour obtenir des valeurs calcules sur la base des constantes
Oracle
Exemple :
SELECT SYSDATE FROM DUAL ;

c M. Mathieu

30

Bases de donnes

2004-2005

Chapitre 3 :
Langage SQL
1. Manipulations (interrogations et modifications des objets donnes dune base)
2. Descriptions (crations, modifications, suppressions)
3. Contrle (gestion des transactions).

c M. Mathieu

31

Bases de donnes

2004-2005

SQL = Structured Query Language

1980 - version stable


issu de QUEL sur Ingres et SEQUEL sur SYSTEM R (IBM)
langage non-procdural
langage interactif

Trois dimensions du langage :


dfinition et modification du schma dune base de donnes relationnelle
interrogation et modification (non-procdurale) de la base
contrle de scurit et confidentialit de la base.
Une commande SQL est souvent appele requte.
SQL ne fait pas la diffrence entre les petites et les grandes lettres (sauf
lintrieur des chanes de caractre).
c M. Mathieu

32

Bases de donnes

2004-2005

1. Consultation de donnes - une seule commande :


SELECT [ALL/DISTINCT/UNIQUE]
liste de slection
FROM nom table, ...
[WHERE condition de recherche]
[GROUP BY liste attributs]
[HAVING condition de recherche]
[ORDER BY liste attributs]
ou une version qui opre avec des ensembles :
requte SELECT1 {UNION | MINUS | INTERSECT} requte SELECT2

car le rsulat dune requte SELECT est un ensemble de tuples, i.e. une table.
c M. Mathieu

33

Bases de donnes

2004-2005

On apple clause une partie dune requte.


Les clauses SELECT et FROM sont obligatoires.
La clause SELECT contient la liste de slction ainsi que des descripteurs
pour la prsentation du rsultat.
La liste de slection contient : des attributs, des expressions o des attributs ou des constantes interviennent. Un attribut est sous la forme champs ou
table.champs.
Le symbole * dans la liste de slection signifie tous les champs de la table.
Exemple :
SELECT * FROM LECTEUR ;

fournit tous les enregistrements de cette table.


c M. Mathieu

34

Bases de donnes

2004-2005

SELECT NOM, PRENOM, AGE FROM LECTEUR

fournit uniquement les champs indiqus de la table, prsents enregistrement par


enregistrement.
Les options DISTINCT, UNIQUE assurent la non-redondance du rsultat (option implicite : ALL, donc rdondance).
Exemple :

SELECT PRENOM FROM LECTEUR ;

fournit tous les champs PRENOM des enregistrements de cette table, mme les
doublons.
SELECT DISTINCT PRENOM FROM LECTEUR

fournit lensemble des champs PRENOM, donc sans les doublons.

c M. Mathieu

35

Bases de donnes

2004-2005

La clause FROM contient une liste dau moins une table avec ou sans synonyme pour une criture quivalente plus rapide.
Exemple : les deux requtes ci-dessous sont strictement quivalentes :
SELECT NOM, PRENOM, AGE FROM LECTEUR

et
SELECT L.NOM, L.PRENOM, L.AGE FROM LECTEUR L

Une vue ou un synonyme se comporte dans une requte SELECT comme une
table.
(On se concentre pour linstant sur les requtes SELECT qui oprent sur une
seule table).

c M. Mathieu

36

Bases de donnes

2004-2005

La clause ORDER BY permet dafficher les rsultats selon des champs prsents dans sa liste de slection. Le tri peut tre croissant (option ASC - implicite)
ou dcroissant (option DESC).

La liste de la clause ORDER BY contient des lments de mme type que la


clause SELECT (sauf le *) et / ou des numros.
Exemple :

SELECT NOM, PRENOM FROM LECTEUR ORDER BY AGE

et
SELECT NOM, PRENOM , AGE FROM LECTEUR ORDER BY 3

Les numros font rfrence aux lments de la clause SELECT.


En absence de cette clause les rsultats sont prsents dans leur ordre dobtention par le systme.
c M. Mathieu

37

Bases de donnes

2004-2005

Les conditions de recherche sont formes dune ou plusieurs conditions relies


par les oprateurs logiques : NOT, AND et OR. Ces conditions sont de 3 types :
conditions de comparaisons
conditions de jointure
conditions sous-requte

c M. Mathieu

38

Bases de donnes

2004-2005

Conditions de comparaison permettent de comparer un attribut ou une expression un autre attribut ou valeur.
La syntaxe est :
exp oprateur comparaison exp
exp [NOT] BETWEEN exp AND exp
exp [NOT] IN (liste valeurs)
attribut [NOT] LIKE chane
attribut IS [NOT] NULL
exp dsigne une expression forme des attributs, constantes, fonctions relis
par les oprateurs : +, -, *, /, ||. Les oprateurs de comparaisons sont ceux connus.
Exemple :
SELECT * FROM LECTEUR
WHERE AGE < 10 ;
c M. Mathieu

39

Bases de donnes

2004-2005

Le prdicat BETWEEN permet de vrifier si lexpression situe gauche se


trouve dans lintervalle dfini.
Exemple :
SELECT *
FROM LECTEUR
WHERE AGE BETWEEN 10 AND 14 ;

Le prdicat IN permet de vrifier si un attribut se trouve dans la liste de valeurs


indiques.
Exemple :
SELECT *
FROM LECTEUR
WHERE AGE IN (10, 11, 12, 13, 14) ;
c M. Mathieu

40

Bases de donnes

2004-2005

Le prdicat LIKE permet de raliser des comparaisons entre un attribut et une


chane de caractres en utilisant des caractres de substitution :
pour zro ou plusieurs caractres (%)
pour un seul caractre ( )
Exemple :
SELECT *
FROM LECTEUR
WHERE PRENOM LIKE Mich% ;

permet davoir les enregistrements qui correspond aux lecteurs dont le prnom
commence par Mich.

c M. Mathieu

41

Bases de donnes

2004-2005

Les fonctions sur les chanes de caractres :


UPPER() - conversion en majuscules
LOWER() - conversion en minuscules
TRIM() - suppression des rptitions dun caractre gauche ou droite ou
aux deux extrmits
SUBTRING() - cration dune chane a partir dune autre.
Les fonction sur les dates :
DATE(exp) - conversion dune expression numrique ou chane de caractre
vers une date
DAY(date) - le jour du mois de la date
MONTH(date) - le mais de la date
YEAR(date) - lanne de la date
c M. Mathieu

42

Bases de donnes

2004-2005

Les fonctions agrgat (de regroupement) permettent dobtenir des donnes synthtiques concernant une table ou des attributs de la table :

COUNT(* / attribut) - le nombre denregistrements satisfaisant la requte


SUM(attribut) - la somme des valeurs
MIN(attribut) - le minimum
MAX(attribut) - le maximum
AVG(attribut) - la moyenne arithmtique
STDEV(attribut) - lcart-type
VARIANCE(attribut) - la variance lie lcart-type

La fonction COUNT peut contenir aussi les directives DISTINCT ou ALL.


Exemple :
SELECT COUNT(*), AVG(AGE) FROM LECTEUR ;

fournit le nombre denregistrements dans la table LECTEUR et la moyenne dge.


c M. Mathieu

43

Bases de donnes

2004-2005

La clause GROUP BY permet de grouper le rsultat en fonction des valeurs des


attributs prsents dans la liste SELECT.
Exemple 1 :
SELECT COUNT(*), AGE
FROM LECTEUR
GROUP BY AGE ;

fournit le nombre denregistrements dans la table LECTEUR pour chaque tranche


dage. La mme requte sans la clause GROUP BY est rronne, car imbigue.

Exemple 2 :
SELECT COUNT(*)
FROM LECTEUR
WHERE PRENOM = Anna ;

fournit le nombre denregistrements dans la table LECTEUR qui ont le prnom


Anna.
c M. Mathieu

44

Bases de donnes

2004-2005

La clause HAVING dcrit une restriction poses sur un groupe des tuples,
donc toute condition qui est pose sur un agrgat doit figurer dans la clause HAVING.
Exemple 3 :

SELECT COUNT(*), AGE


FROM LECTEUR GROUP BY AGE
HAVING COUNT(*) >= 2 ;

fournit les tranches dage avec au moins deux enregistrements dans la table
LECTEUR .

c M. Mathieu

45

Bases de donnes

2004-2005

Travail avec la valeur NULL


Des champs peuvent avoir la valeur NULL.
Exemple :

select anom, aprenom, commission


from agent ;

Rsultat :

JACQ
LEM
DESCH
BART
BLANCO
DESS

Aime
Roger
Didier
Fabs
Laurent
Lim

10.5

....
c M. Mathieu

46

Bases de donnes

2004-2005

Les requtes dagrgat comme :


select min(commission)
from agent

ou

select count(commission)
from agent

oprent uniquement sur des valeurs non NULL.

La requte :

select anom, aprenom, nvl(to char(commission), sans)


from agent

affiche :

ANOM
---------JACQ
LEM
DESCH
BART
BLANCO

APRENOM
--------------Aime
Roger
Didier
Fabs
Laurent

NVL(TO CHAR(COMMISSION),SANS)
----------sans
sans
sans
sans
10.5

DESS

Lim

sans

c M. Mathieu

47

Bases de donnes

2004-2005

Le fonctionnement de la fonction COUNT et des autres fonctions agrgat


Exemples :

select count(*)
from agent ;

fournit le nombre total denregistrements de la table AGENT.

select count(fonction)
from agent ;
fournit le nombre dapparitions du champ FONCTION de la table AGENT.

select count(distinct fonction)


from agent ;

fournit le nombre dapparitions des valeurs distinctes du champ FONCTION.


c M. Mathieu

48

Bases de donnes

2004-2005

La requete :

select fonction, count(*)


from agent ;

est ambigue et non-rsolue.


La requete :

select fonction, count(*)


from agent
group by fonction ;

fournit :

FONCTION
COUNT(*)
------------ ---------ANALYSTE
2
CAPITAINE
1
COMMERCIAL
4
DIRECTEUR
1
EMPLOYE
4
GARDIEN
1
PRESIDENT
1

qui est la liste de toutes les valeurs du champ FONCTION, avec leur nombre
dapparitions.
c M. Mathieu

49

Bases de donnes

2004-2005

Si la liste de slection dune requete SELECT contient des fonctions dagrgat


et des attributs des tables de slection, dans la clause GROUP BY il faut imprativement indiquer tous les attributs ou fonctions scalaires sur ces attributs qui
apparaissent dans la clause SELECT.

c M. Mathieu

50

Bases de donnes

2004-2005

Requtes SELECT sur plusieurs tables

Dans la clause FROM on fait figurer plusieurs tables ou on utilise une condition
de sous-requte.
Exemple :
SELECT lecteur.*, pret.*
FROM lecteur, pret ;

fournit les enregistrements concatenns de deux tables.


En absence de toute condition entre les champs de deux tables la requte
ralise simplement le produit cartsien : il faut donc ajouter des conditions de
jointure.
c M. Mathieu

51

Bases de donnes

2004-2005

Conditions de jointure

Un jointure est un lien entre des attributs semblables des deux tables diffrente :
table1.attribut1 oprateur table2.attribut2
Loprateur de comparaison peut tre : =, <, >, <> ( !=), <=, >=.
Exemple :
SELECT LECTEUR.CODE LECTEUR, LECTEUR.NOM, LECTEUR.PRENOM
FROM LECTEUR, ENSEIGNANT
WHERE LECTEUR.NOM = ENSEIGNANT.NOM AND
LECTEUR.PRENOM = ENSEIGNANT.PRENOM ;

permet dextraire des informations de la table LECTEUR qui ont un correspondant


dans la table ENSEIGNANT.
c M. Mathieu

52

Bases de donnes

2004-2005

Les jointures sapplent internes quand lexistence des deux attributs (table1.attribut1,
table2.attribut2) est obligatoire.
Un cas particulier de jointure interne est lquijointure : on teste lgalit entre
des attributs qui ont des domaines compatibles et la mme signification smantique.
Exemple :
SELECT lecteur.*, pret.*
FROM lecteur, pret
WHERE lecteur.code lecteur = pret.code lecteur ;

on fournit uniquement les lecteurs qui ont des prts en cours, un lecteur apparat
autant de fois que le nombre denregistrements de la table pret.

c M. Mathieu

53

Bases de donnes

2004-2005

Exemple : les lecteurs qui ont en prt la livre LIle Mistrieuse :


SELECT nom, prenom
FROM lecteur l, pret p, document d
WHERE lecteur.code lecteur = pret.code lecteur
AND p.code document = d.code document
AND d.titre = LIle Mystrieuse ;

Lordre des conditions dquijointure nest pas importante, de mme dans une
quijointure on peut permuter les deux attributs.

Remarque : dautres conditions que = ou != sont rarement utilises dans les


jointures.

c M. Mathieu

54

Bases de donnes

2004-2005

Une condition de jointure externe sexprime laide du (+) mis cot dun
attribut :
table1.attribut1 = table2.attribut2(+)
ou
table2.attribut2(+) = table1.attribut1
avec la signification : si des enregistrement de la table2 existent et vrifient la
clause WHERE ils sont slectionns conformment une jointure classique ; si
des enregistrement de la table2 nexistent pas les enregistrements de la table1
sont toutefois slectionns.

c M. Mathieu

55

Bases de donnes

2004-2005

Exemple : soient les tables EMPLOYE(NOM, CODE S) et SERVICE(CODE S,


NOM SERVICE) avec les enregistrements :
NOM
Anna
Nicolas
Andr
Paul
CODE S
170
800
117

c M. Mathieu

CODE S
117
170
170

NOM SERVICE
RH
Direction
Comptabilit

56

Bases de donnes

2004-2005

Pour afficher les employs et leur service :


SELECT nom, nom service
FROM employe, service

WHERE e.code s = s.code s ;


mais lemploy Paul ny figure pas.
La jointure ouverte (externe) :
SELECT nom, nom service
FROM employe, service

WHERE e.code s = s.code s(+) ;


fournit :
NOM
Andr
Anna
Nicolas
Paul
c M. Mathieu

NOM SERVICE
RH
Comptabilit
RH
57

Bases de donnes

2004-2005

Autre jointure ouverte :


SELECT nom, nom service
FROM employe, service

WHERE e.code s(+) = s.code s ;


fournit :
NOM
Andr
Anna
Nicolas

NOM SERVICE
RH
Contabilit
RH
Direction

Si on veut obtenir une jointure deux entres, il faut utiliser lopration UNION.

c M. Mathieu

58

Bases de donnes

2004-2005

Une condition de sous-requte :


[NOT] EXISTS (requte SELECT)
la condition est value vrai, si la requte SELECT retourne au moins une
ligne.
Exemple :
SELECT *
FROM PRET
WHERE EXISTS
(SELECT * FROM DOCUMENT) ;

affiche le contenu de la table PRET uniquement si la table DOCUMENT nest


pas vide.
c M. Mathieu

59

Bases de donnes

2004-2005

Exemple 1 : vrifier que des exemplaires du livre Les Fourmis sont en prt :
SELECT COUNT(*)
FROM document d
WHERE d.titre = Les formis
AND EXISTS
(SELECT *
FROM pret p
WHERE d.code document = p.code document) ;

c M. Mathieu

60

Bases de donnes

2004-2005

Exemple 2 : vrifier que tous les exemplaires du livre Les Fourmis sont en
prt :
SELECT Oui
FROM document d
WHERE d.titre = Les formis
AND NOT EXISTS
(SELECT *
FROM pret p
WHERE d.code document = p.code document)
HAVING COUNT(*) = 0 ;

c M. Mathieu

61

Bases de donnes

2004-2005

Requtes imbriques
Les imbrications des requtes peuvent apparatre au niveau des conditions de
la clause WHERE et au niveau des tables de slection.
(Oracle admet jusqu 16 requtes imbriques.)
Les imbrications de la clause WHERE sont de type :
table.attribut = (requte SELECT)
ou
table.attribut IN (requte SELECT)
ou
table.attribut {<,>,<=,>=} {ANY|ALL}(requte SELECT)
Les deux premires formes sont smantiquement quivalentes, mais leur faon dtre rsolues par le SGBD est diffrent.
c M. Mathieu

62

Bases de donnes

2004-2005

Les sous-requtes qui apparaissent dans la partie droite ne doivent pas contenir des clauses ORDER BY.
Une requte imbrique peut scrire comme une requte non-imbrique.
Exemple : afficher tous les lecteurs ayant emprunt des livres depuis 24h :
SELECT DISTINCT l.nom, l.prenom
FROM lecteurs l
WHERE l.code lecteur IN (SELECT p.code lecteur
FROM pret p
WHERE p.date pret > SYSDATE -1) ;

Cette requte peut scrire comme :


SELECT DISTINCT l.nom, l.prenom
FROM lecteurs l, pret p
WHERE l.code lecteur = p.code lecteur
AND p.date pret > SYSDATE -1 ;
c M. Mathieu

63

Bases de donnes

2004-2005

Exemple : afficher les agents qui gangent au moins comme un plus grand
salaire dune fonction :
SELECT anom, aprenom
FROM agent
WHERE salaire >= ANY (SELECT MAX(salaire) FROM agent
GROUP BY fonction)

Exemple : afficher les agents qui gangent plus que le plus grand salaire de
chaque fonction :
SELECT anom, aprenom
FROM agent
WHERE salaire >= ALL (SELECT MAX(salaire) FROM agent
GROUP BY fonction)
c M. Mathieu

64

Bases de donnes

2004-2005

Le rsultat dune requte SELECT peut tre utilis comme une table de slection.
Exemple : afficher les agents qui gagnent le plus grand et le plus bas salaire :
select anom, aprenom
from agent A,
( select min(salaire) as sal from agent) B,
( select max(salaire) as sala from agent) C
where A.salaire = B.sal or A.salaire = C.sala ;

Dans les requtes de cette forme lusage des synonymes devient impratif.
(Les synonymes sont utiliss pour les noms des tables de la clause FROM et
pour la liste de slection de la clause SELECT. Ces synonymes sont volatiles.)

c M. Mathieu

65

Bases de donnes

2004-2005

Une requte ensembliste est de forme :


requte1 UNION [ALL] | MINUS | INTERSECT requte2
o UNION, MINUS, INTERSECT ralise les oprations des ensembles connues.
La version UNION ALL ralise lunion des rsultats de chaque requte sans
liminer les doublons.
Les listes de slection des deux requtes se doivent tre compatibles par type.

c M. Mathieu

66

Bases de donnes

2004-2005

Exemple : afficher les agents qui gagnent le plus grand et le plus bas salaire :
select anom, aprenom
from agent
where salaire = (select min(salaire) from agent)
union
select anom, aprenom
from agent
where salaire = (select max(salaire) from agent) ;

c M. Mathieu

67

Bases de donnes

2004-2005

Langage SQL - Mise jour des donnes


Modifications de donnes :
insertion INSERT
mise jour - UPDATE
suppression - DELETE (TRUNCATE)
1. Insertion
INSERT INTO nom table [(liste attributs)]
VALUES (liste valeurs)
Si les champs de la table sont explicits par (liste attributs), la liste des valeurs
doit avoir la mme longueur car la correspondance se fait de 1 1, sinon, la liste
des valeurs doit correspondre en longueur et en type la liste des attributs de la
table dans leur ordre de dfinition.
Si des attributs ne sont pas spcifis, ils prendront la valeur NULL ou leur
valeur par dfaut.
c M. Mathieu

68

Bases de donnes

2004-2005

Exemple : la table COLLECTIVITE a la structure suivante :

SQL>desc collectivite
Name
Type
---------------------------------------------------------------------IDCOLLECT
NUMBER
CDESINATION
VARCHAR2(20)

alors :

INSERT INTO COLLECTIVITE


VALUES (9, Picardie) ;

est quivalent :
INSERT INTO COLLECTIVITE (CDESINATION, IDCOLLECT)
VALUES (Picardie, 8) ;

c M. Mathieu

69

Bases de donnes

2004-2005

Une autre forme de lordre INSERT :


INSERT INTO nom table[(liste attributs)]
requte SELECT ;
permet linsertion dans la table indique des enregistrements (mme plusieurs)
obtenus avec la requte SELECT.
Exemple :

INSERT INTO AGENT BIS


SELECT * FROM AGENT ;

ralise une copie de la table AGENT dans la table AGENT BIS


qui a la mme structure.

c M. Mathieu

70

Bases de donnes

2004-2005

2. Modification
UPDATE nom table
SET nom attribut = valeur,.../
(liste attributs) = (liste valeurs)...
WHERE condition ;
Cette instruction permet la modification des enregistrements vrifiant la condition ; cette modification porte sur les attributs prciss dans la clause SET qui se
voient attribus les valeurs indiques.
Ces valeurs sont soit des constantes, soit des expressions contenant des oprateurs et fonctions (except les fonctions agrgats) qui portent sur des constantes
et des attributs.
Le type dune valeur associe pour un attribut modifi doit tre compatible
avec le type de lattribut.
c M. Mathieu

71

Bases de donnes

2004-2005

Exemple :

UPDATE COMMANDE
SET DATEC = sysdate,
DATEL = DATEL + 10
WHERE IDCOMM = 20 ;

est quivalent avec :

UPDATE COMMANDE
SET (DATEC , DATEL) = (sysdate, DATEL+ 10)
WHERE IDOMM = 20 ;

Cette requte modifie lenregistrement de la table COMMANDE ayant la


valeur 20 pour lattribut cl IDCOMM.

c M. Mathieu

72

Bases de donnes

2004-2005

La forme suivante de UPDATE permet de faire la modification des attributs


avec des valeurs obtenues par une ou plusieurs requtes SELECT (appeles
sous-requtes) :
UPDATE nom table
SET (attribut) = (sous-requte), ...
(liste attributs) = (sous-requte)
[WHERE condition] ;
Les sous requtes doivent imprativement retourner un seul enregistrement.
Si la sous-requte fait intervenir la table nom table et les attributs modifier,
on dit que la requte est corrle. Dans une requte corrle on doit utiliser des
synonymes pour les tables.
c M. Mathieu

73

Bases de donnes

2004-2005

Exemple 1 - une requte non-corrle qui attribue un certain agent le salaire


maximum de la fonction COMMERCIAL :
UPDATE AGENT
SET SALAIRE = (SELECT MAX(SALAIRE) FROM AGENT WHERE FONCTION =
COMMERCIAL)
WHERE IDAGENT = 210 ;

Exemple 2 - une requte corrle, qui attribue un certain agent le salaire maximum de son service :
UPDATE AGENT A1
SET SALAIRE = (SELECT MAX(A2.SALAIRE)
FROM AGENT A2
WHERE A2.SERVICE ID = A1.SERVICE ID)
WHERE IDAGENT = 210 ;

c M. Mathieu

74

Bases de donnes

2004-2005

3. Suppression
DELETE FROM nom table
[WHERE condition] ;
Cette instruction permet denlever de la table nom table tous les enregistrements qui vrifient la condition.
En absence de la clause WHERE tous les enregistrements de la table seront
effacs.

Lordre :
TRUNCATE nom table ;
permet la suppression rapide de tous les enregistrements de la table nom table.
c M. Mathieu

75

Bases de donnes

2004-2005

Exemple :

DELETE FROM COMMANDE


WHERE DATEL < SYSDATE - 365 ;

efface les enregistrements de la table COMMANDE qui ont la date de livraison


pass de plus dun an.
Les instructions :

DELETE FROM COMMANDE ;

et

TRUNCATE COMMANDE ;

fournissent presque le mme rsultat : leffacement de tous les enregistrements


de la table COMMANDE, mais la deuxime forme est plus rapide et ne ncessite
pas de confirmation.

c M. Mathieu

76

Bases de donnes

2004-2005

SQL - langage de contrle des donnes


Leffet des mises jour :
les requte INSERT, UPDATE, DELETE modifient dabord le buffer utilisateur. Elles doivent tre rendues dfinitives avec lordre SQL :
COMMIT
ou annules avec lordre
ROLLBACK
la requte TRUNCATE est effective (une fois quelle est saisie, elle est directement excute sur la base).

c M. Mathieu

77

Bases de donnes

2004-2005

Transactions
Transaction = une squence de commandes traite comme une opration atomique
afin de garantir la cohrence et lintgrit des donnes de la base.
Les commandes sont des mises jour et / ou des simples consultations.

Exemple 1 : lenregistrement dune commande VPC de plusieurs produits, qui


comporte :
linsertion de lentte de la commande
linsertions des produits commands
Ces insertions doivent tre excutes de faon indissociable et dfinitive.
Exemple 2 : la rservation de places dans un avion (problme de concurrence
daccs) - solution : gestion transactionnelle des oprations sur la base.
Exemple 3 : un transfert bancaire entre 2 comptes.
c M. Mathieu

78

Bases de donnes

2004-2005

Les proprits dune transactions :


atomicit : les oprations dune transaction sont excutes comme une
unique opration
consistance : la base reste dans un tat cohrent la fin de la transaction
isolation : la transaction sexcute indpendamment dautres oprations sur
la base
durabilit : les mises jour dune transaction sont dfinitives
(ACID)

Une transaction comporte :


un dbut : cration
une fin : validation ou annulation
c M. Mathieu

79

Bases de donnes

2004-2005

Cration dune transaction :


implicite : partir de la premire instruction qui suit la connexion la base
ou aprs un ordre COMMIT ou ROLLBACK
explicite : par lexcution de lordre :
SET TRANSACTION {READ ONLY | READ WRITE}
Validation :
implicite : la fin de la connexion
explicite : par lordre COMMIT
Annulation :
explicite : par lordre ROLLBACK ou :
ROLLBACK TO SAVEPOINT point de retour
ou le point de retour est cre avec lordre :
SET SAVEPOINT point de retour
lintrieur de la transaction.
c M. Mathieu

80

Bases de donnes

2004-2005

Exemple 1 :
SQL>SELECT* FROM AGENT ;
SQL>INSERT INTO AGENT...
SQL>UPDATE AGENT SET ...
SQL>SELECT * FROM AGENT ;
SQL>COMMIT ;

Les ordres INSERT et UPDATE font partie dune mme transaction, ils seront
excuts lun aprs lautre, mais leur excution est faite dans un intervalle
de temps indivisible. Lors du deuxime ordre SELECT les modifications sont
visibles, bien quelles ne soient pas encore effectues dans la base.
Exemple 2 :

SQL>SET TRANSACTION READ ONLY


SQL>SELECT * FROM AGENT ;
SQL>SELECT * FROM SERVICE ;
SQL>COMMIT ;

On obtient le contenus de deux tables au mme moment, savoir la dclaration


de la transaction.

c M. Mathieu

81

Bases de donnes

2004-2005

Une transaction READ ONLY contient uniquement des ordres SELECT et


LOCK TABLE nom table
Les requte SELECT sont excutes avec le contenu de la base tel quil tait au
moment de la dclaration SET TRANSACTION.

SQL*Plus dispose aussi la commande :


SET AUTOCOMMIT [ON | OFF]
Si on a loption ON sur le paramtre AUTOCOMMIT, aprs chaque requte correcte syntaxiquement lordre COMMIT est fait automatiquement.
c M. Mathieu

82

Bases de donnes

2004-2005

SQL - Langage de dfinition des donnes


Trois ordres pour dfinir des objets dans la base :
CREATE objet nom liste paramtres
ALTER objet nom option| paramtre
DROP objet [option]
ou objet peut tre : table, vue, indexe, synonyme, squence, profil utilisateur, procdure stocke ou dclenche, tablespace, base, etc.

Ces ordres se auto-valident, savoir si ils sont corrects syntaxiquement et


fonctionellement, ils sont immdiatement excuts dans la base de faon dfinitive et irrversible.
c M. Mathieu

83

Bases de donnes

2004-2005

Manipulation des tables


Une table se compose de colonnes, qui ont chacune un type, et doit respecter des contraintes dintgrit. Les contraintes dintgrit sont des conditions qui
sexprime sur une ou plusieurs colonnes de la table avec, parfois, des colonnes
dune deuxime table.

La dfinition dune table se fait avec lordre :


CREATE TABLE nom table
[(nom colonne type [DEFAULT valeur ] [contrainte colonne],...
[contrainte table, ...])]
[options de stockage, cluster, paralllisme, etc]
[AS requte SELECT ]
Les options de stockage et autres dpendent du SGBD (travail de ladministrateur de BD).
c M. Mathieu

84

Bases de donnes

2004-2005

Exemple 1 :

CREATE TABLE COLLECTIVITE


(IDCOLL NUMBER(2) DEFAULT 0,
NOM COLLECTIVITE VARCHAR2(30)) ;

Les contraintes dintgrits sur une colonne contrainte colonne ou sur une
table contrainte table sont de forme :
[CONSTRAINT nom contrainte] description contrainte
Si le nom dune contrainte nest pas indique, il est gnr automatiquement.
Le nom sert pouvoir supprimer la contrainte ou pouvoir lactiver / dsactiver.
La description contrainte est de forme :
[NOT] NULL, CHECK, UNIQUE, PRIMARY KEY, FOREIGN KEY
c M. Mathieu

85

Bases de donnes

2004-2005

[NOT] NULL indique si la colonne est autorise ou pas avoir la valeur NULL
(par dfaut NULL autoris).
UNIQUE [(colonne, ..)] indique que la colonne ou la liste des colonnes engendrent lunicit de lenregistrement (forment une cl potentielle).
CHECK (condition) indique que la condition qui porte sur une ou plusieurs
colonnes de la table doit tre toujours satisfaite.
PRIMARY KEY[(colonne,...)] indique que la ou les colonnes auxquelles la
contrainte est associe forment la cl primaire de la table (ORACLE admet donc
des cls multiples ayant jusquau 16 colonnes).

c M. Mathieu

86

Bases de donnes

2004-2005

FOREIGN KEY [(colonne, ...)] REFERENCES table2 (colonne, ...) [ON DELETE CASCADE]
Une telle contrainte est une contrainte dintgrit rfrentielle. La ou les colonnes
de cette cl trangre doivent correspondre en nombre et en type avec les colonnes indiques de la table2. De plus, les colonnes de cette table2 (qui peut tre
diffrente de la table de dfinition ou la mme) doivent imprativement tre soit
une cl primaire, soit associes une contrainte UNIQUE.
Leffet de cette contrainte est que les valeurs des colonnes de la table1 doivent
toujours se retrouver dans la table2.
La clause ON DELETE CASCADE indique que si un enregistrement de la table2
est supprim, les enregistrements de la table1 avec la cl trangre correspondante doivent aussi tre supprims.
Aucune contrainte dintgrit nest obligatoire pour une table.
c M. Mathieu

87

Bases de donnes

2004-2005

Exemple 2 :

CREATE TABLE COLLECTIVITE


(IDCOLL NUMBER(2) DEFAULT 0 CONSTRAINT NN COLL IDCOLL NOT NULL
CONSTRAINT PK COLLECTIVITE PRIMARY KEY,
NOM COLLECTIVITE VARCHAR2(30) NOT NULL) ;

quivalent :

CREATE TABLE COLLECTIVITE


(IDCOLL NUMER(2) DEFAULT 0 CONSTRAINT NN COLL IDCOLL NOT NULL ,
NOM COLLECTIVITE VARCHAR2(30) NOT NULL,
CONSTRAINT PK COLLECTIVITE PRIMARY KEY(IDCOLL)) ;

Exemple 3 :

CREATE TABLE EMPLOYE


(IDEMP NUMBER(5) DEFAULT 0 NOT NULL CONSTRAINT PK EMPLOYE PRIMARY KEY,
NOM VARCHAR25(50) NOT NULL,
PRENOM VARCHAR2(50)NOT NULL,
IDCHEF NNUMBER(5) NULL,
NO SS VARCHAR2(15) CONSTRAINT CC EMP1 CHECK(NO SS LIKE 1% OR NO SS
LIKE 2%),
IDCOLL NUMBER(2) CONSTRAINT FK EMP1 FOREIGN KEY REFERENCES
COLLECTIVITE(IDCOLL)) ;

c M. Mathieu

88

Bases de donnes

2004-2005

Exemple 4 :

CREATE TABLE EMPLOYE


(IDEMP NUMBER(5) DEFAULT 0 NOT NULL CONSTRAINT PK EMPLOYE PRIMARY KEY,
NOM VARCHAR25(50) NOT NULL,
PRENOM VARCHAR2(50)NOT NULL,
IDCHEF NNUMBER(5) NULL ,
NO SS VARCHAR2(15) CONSTRAINT CC EMP1 CHECK(NO SS LIKE 1% OR NO SS
LIKE 2%),
IDCOLL NUMBER(2) CONSTRAINT FK EMP1 FOREIGN KEY REFERENCES
COLLECTIVITE(IDCOLL),
CONSTRAINT FK EMP2 FOREIGN KEY (IDCHEF) REFERENCES EMPLOYE(IDEMP)) ;

Dans cette table il y a deux cls trangres. La contrainte FK EMP1 exige que
la table COLLECTIVITE soit cre avant et que les insertions dans la table EMPLOYE
soient faites aprs celles de la table COLLECTIVITE. La contrainte FK EMP2 est trs
difficile satisfaire lors des insertions, car les insertions doivent tre faites dans
un ordre stricte avant dassurer linsertion dun chef avant ses employs. Que
faire pour saffranchir ?

c M. Mathieu

89

Bases de donnes

2004-2005

La clause AS requte SELECT permet dinsrer directement dans la table


les enregistrements obtenus avec la requte. Lusage de cette clause change le
format de description de la table :
la description peut manquer et, dans ce cas, les noms des colonnes de la
table seront donns par les noms des colonnes prsentes dans la requte ;
les mmes contraintes dintgrit sont galement ajoutes.
si la description est prsente, on nindique pas le type des colonnes qui
est donn par le type des colonnes de SELECT ; le nombre de colonnes
retournes par ce SELECT doit correspondre au nombre des colonnes de
la table.
Exemple 5 :

CREATE TABLE EMP ARCHIVE


AS SELECT * FROM EMPLOYE ;

Attention ! toute mise jour postrieure cette dclaration pour la table EMPLOYE
nest pas rpercute sur la table EMP ARCHIVE.
c M. Mathieu

90

Bases de donnes

2004-2005

La modification dune table est ralise par un ordre :


ALTER TABLE nom table option ;
Les options sont :
des changements de lespace de stockage, des partitions, du paralllisme, etc
non explicites dans ce cours
RENAME TO nom nouvelle table
qui permet de changer le nom de la table
{ADD | MODIFY} [(colonne type [DEFAULT valeur] contrainte colonne , ...)]
[contrainte table]
DROP COLUMN nom colonne
qui permet dajouter des nouvelles colonnes la table et des nouvelles contraintes
sur la tables ou de modifier le type, la valeur par dfaut et les contraintes NULL
dune colonne.
c M. Mathieu

91

Bases de donnes

2004-2005

Les modifications de type autorises sont celles qui augmentent ou diminuent


( condition que ce soit possible) la taille du type ou les transformations VARCHAR2 CHAR.
Exemple 6 :

ALTER TABLE EMP ARCHIVE RENAME ARCHIVE EMPLOYE ;

change le nom de la table cre en exemple 5


Exemple 7 :

ALTER TABLE EMPLOYE ADD


(DATEE DATE DEFAULT SYSDATE NOT NULL) ;
ALTER TABLE EMPLOYE MODIFY
(NOM VARCHAR25(50) NOT NULL,
PRENOM VARCHAR2(50)NOT NULL)

ajoute une colonne la table EMPLOYE et modifie deux autres colonnes.


Exemple 8 : une solution la question pose en exemple 4 est de faire dabord
les insertions et ensuite ajouter la contrainte dintgrit rfrentielle :

ALTER TABLE EMPLOYE ADD

CONSTRAINT FK EMP2 REFERENCES EMPLOYE(IDEMP) ;


c M. Mathieu

92

Bases de donnes

2004-2005

Les options :
{DROP | DISABLE | ENABLE} {CONSTRAINT nom contrainte | PRIMARY
KEY | UNIQUE (liste colonnes)} CASCADE ;
permet de supprimer, dsactiver ou activer une contrainte dintgrit sur une
table. Loption CASCADE est obligatoire si la contrainte est PRIMARY KEY
ou UNIQUE et si elle est rfrence par des contraintes FOREIGN KEY.

Exemple 9 : une autre solution la question pose en exemple 4 est de dsactiver


la contrainte dintgrit rfrentielle, de faire les insertions et ensuite de lactiver.
ALTER TABLE EMPLOYE DISABLE
CONSTRAINT FK EMP2 ;
INSERT INTO EMPLOYE ... ;
INSERT INTO EMPLOYE ... ;
ALTER TABLE EMPLOYE DISABLE
CONSTRAINT FK EMP2 ;
c M. Mathieu

93

Bases de donnes

2004-2005

Exemple 10 : modifier la cl primaire dune table signifie sa suppression suivie de


sa seconde cration et des ventuelles r-crations des contraintes dintgrits
rfrentielles :

ALTER TABLE EMPLOYE DROP PK EMPLOYE CASCADE ;


ALTER TABLE EMPLOYE ADD CONSTRAINT PK EMPLOYE PRIMARY KEY (NOM,PRENOM) ;
ALTER TABLE EMPLOYE ADD CONSTRAINT CU EMPLOYE UNIQUE (IDEMP) ;
ALTER TABLE EMPLOYE ADD CONSTRAINT

FK EMP2 FOREIGN KEY (RESPONSABLE)

REFERENCES EMPLOYE(IDEMP) ;

c M. Mathieu

94

Bases de donnes

2004-2005

La suppression dune table est ralise avec lordre :


DROP TABLE nom table CASCADE CONSTRAINTS ;
avec loption CASCADE CONSTRAINTS on supprime toutes les contraintes rfrentielles qui font appel cette table.
Lors de lexcution de cet ordre le SGBD :
supprime tous les enregistrements de la table
supprime tous les indexes associs
invalide les objets (synonyme, vue ou autre) qui font rfrence cette table.
Exemple 11 :
DROP TABLE EMPLOYE CASCADE CONSTRAINTS ;
c M. Mathieu

95

Bases de donnes

2004-2005

Les squences
Une squence est un compteur qui sincrmente et qui fournit sa valeur courante afin dtre utilise comme valeur de colonne.
Cration :
CREATE SEQUENCE nom squence [INCREMENT BY valeur1] [START WITH
valeur2] [MAXVALUE valeur3 | NOMAXVALUE] [MINVALUE valeur4 | NOMINVALUE] [CYCLE | NOCYCLE] ;
Modification :
ALTER SEQUENCE nom squence paramtres
o les paramtres sont les mmes que pour la cration, lexception de START
WITH.
Suppression :
DROP SEQUENCE nom squence ;
c M. Mathieu

96

Bases de donnes

2004-2005

Lusage dune squence :


squence.CURVAL : donne la valeur courante
squence.NEXTVAL : incrmente la squence et retourne le rsultat.
Une squence peut tre utilise par plusieurs tables.
Exemple :

CREATE SEQUENCE NO EMP START WITH 200 INCREMENTED BY 5 ;


INSERT INTO EMPLOYE VALUES (NO EMP.NEXTVAL, DUPONT, D., ..) ;
ALTER SEQUENCE NO EMP INCREMENTED BY 10) ;
INSERT INTO EMPLOYE VALUES (NO EMP.NEXTVAL, DUPOND, D., ..) ;
SELECT NO EMP.CURVAL
FROM DUAL ;

c M. Mathieu

97

Bases de donnes

2004-2005

Les vues
Une vue est une table logique base sur une ou plusieurs tables ou vues et
qui na pas dexistence physique.
elle est une requte SELECT
elle ne stocke donc pas des donnes
les mises jour partir des tables est automatique
Une vue est cre pour :
la confidentialit
masquer la complexit des donnes de la base en consultation / modification
c M. Mathieu

98

Bases de donnes

2004-2005

Cration :
CREATE [OR REPLACE] VIEW nom vue [(liste colonnes)] AS requte SELECT
[WITH READ ONLY] [WITH CHECK CONTRAINT condition] ;
La vue est cre partir de la requte SELECT indique qui ne doit pas contenir la clause ORDER BY. Les noms des colonnes de la vue sont soit explicits
avec liste colonnes, soit donns par la requte SELECT.
Suppression :
DROP VIEW nom vue ;

c M. Mathieu

99

Bases de donnes

2004-2005

Exemple :

CREATE VIEW AFFECTATION (SALARIE, GROUPE)


AS
SELECT IDEMP, IDCOLL FROM EMPLOYE ;
CREATE VIEW CHEFS AS
SELECT DISTINCT NOM AS NOM CHEF, PRENOM AS PRENOM CHEF
FROM EMPLOYE E1
WHERE EXISTS (SELECT * FROM EMPLOYE E2
WHERE E2.ID CHEF = E1.IDEMP) ;

c M. Mathieu

100

Bases de donnes

2004-2005

Les index
Les index sont des objets Oracle attachs une table, crs implicitement ou
explicitement dans le but dacclrer laccs cette table.
Un index se traduit par une structure de donnes de type table de hachage ou B-arbre.

Index crs :
implicitement - les cls primaires et les attributs formant une contrainte dintgrit UNIQUE
explicitement avec lordre :
CREATE INDEX nom index ON nom table (liste colonnes) [options de stockage] ;

c M. Mathieu

101

Bases de donnes

2004-2005

Suppression dun index :


suppression de la contrainte PRIMARY KEY ou UNIQUE
explicitement avec :
DROP INDEX nom index
Afin dobtenir vraiment une acclration du temps daccs il est souhaitable que
la table ait un taille importante et que les colonnes sur lesquelles on met lindex
se trouvent dans la partie WHERE des requtes accdant cette table.
Il est conseill aussi de mettre dans la partie WHERE dune requte des conditions qui portent sur la totalit des colonnes dun index.

c M. Mathieu

102

Bases de donnes

2004-2005

Exemple : Mme pour une table avec 14 enregistrements leffet dun index est
visible :
select *
from agent
where datee>01-DEC-91 ;
Elapsed : 00 :00 :00.06
CREATE INDEX AGENT IDX1
ON AGENT(DATEE) ;
Index created.
Elapsed : 00 :00 :00.89
select *
from agent
where datee > 01-DEC-91 ;
Elapsed : 00 :00 :00.01
c M. Mathieu

103

Bases de donnes

2004-2005

Chapitre 4 :
Notions dadministration de bases
de donnes
Application Oracle
1.
2.
3.
4.
5.

Synonymes et catalogues de donnes


Gestion des utilisateurs
Gestion des connexions la base
Gestion de la mmoire
Cration et entretien dune base

c M. Mathieu

104

Bases de donnes

2004-2005

Les synonymes
Un objet est dsign compltement comme :
[instance base.][proprietaire.]objet[@lien connexion]
lobjet tant table, vue, squence, synonyme, procdure stock, etc.

Afin dviter cette criture pour dsigner lobjet on utilise un synonyme dfinit
avec :
CREATE [PUBLIC] SYNONYM nom synonyme FOR dsignation complte
Le synonyme pourra tre utilis dans des ordres SELECT, UPDATE, MODIFY,
DELETE, LOCK TABLE, GRANT, REVOKE.
c M. Mathieu

105

Bases de donnes

2004-2005

Exemple 1 :

CREATE SYNONYM market


FOR scott.market research ;
CREATE PUBLIC SYNONYM emp
FOR scott.emp@sales ;

Le premier synonyme fait rfrence une table dun autre utilisateur de la mme
base et le deuxime une table dune base distante.
Exemple 2 :

CREATE
CREATE
CREATE
CREATE
CREATE

PUBLIC
PUBLIC
PUBLIC
PUBLIC
PUBLIC

SYNONYM
SYNONYM
SYNONYM
SYNONYM
SYNONYM

FOURNISSEUR FOR system.FOURNISSEUR ;


SERVICE FOR system.SERVICE ;
COMMANDE FOR system.COMMANDE ;
AGENT FOR system.AGENT ;
FOURNITURE FOR system.FOURNITURE ;

CREATE PUBLIC SYNONYM COLLECTIVITE FOR system.COLLECTIVITE ;

c M. Mathieu

106

Bases de donnes

2004-2005

Les catalogues des donnes


Oracle organise des mta-informations sur les objets contenus dans la base,
ces mta-informations se prsentent sous forme des tables en mode lecture uniquement.
Les dictionnaires de donnes contiennent des informations sur :
les dfinitions de tous les objets de la base (tables, vues, squences, procdures, etc.)
lespace mmoire allou et utilis par chaque objet
les valeurs pas dfaut des colonnes
les contraintes dintgrit
les utilisateurs et leurs rles et privilges
dautres informations
Toutes ces informations sont la proprit de lutilisateur SYSTEM et sont gardes
dans un espace mmoire part.
Elles sont mises jour ds quun ordre LDD est xecut.
c M. Mathieu

107

Bases de donnes

2004-2005

Ces informations sont visibles avec les vues : USER *, ALL *, DBA *.
La liste de ces vues se trouve dans la table DICTIONARY ayant deux colonnes : TABLE NAME et COMMENTS.
Les vues suivantes sont accessibles par nimporte quel utilisateur :
ALL
ALL
ALL
ALL
ALL
ALL
ALL
ALL
ALL
ALL
ALL
ALL

CATALOG
COL COMMENTS
CONS COLUMNS
CONSTRAINTS
IND COLUMNS
INDEXES
OBJECTS
TAB COLUMNS
TAB COMMENTS
TABLES
USERS
VIEWS

Les informations sur vos propres tables cres se trouveront dans ALL TABLES
et USER TABLES, ALL CONSTRAINTS, ALL INDEXES.
c M. Mathieu

108

Bases de donnes

2004-2005

La gestion des utilisateurs


Laccs une BD Oracle se fait en sidentifiant avec un nom utilisateur et un mot
de passe crs par ladministrateur (DBA).
Un utilisateur peut avoir des droits (privilges) :
pour crer des objets qui deviennent les siens
pour utiliser des objets dj crs
La cration dun utilisateur (par le DBA) :
CREATE USER nom utilisateur IDENTIFIED BY mot passe [options de stockage] ;

Le changement de mot de passe (par lutilisateur ou par le DBA) :


ALTER USER nom utilisateur IDENTIFIED BY nouveau mot de passe ;
c M. Mathieu

109

Bases de donnes

2004-2005

La suppression dun utilisateur :


DROP USER nom utilisateur [CASCADE] ;
Laffectation et la suppression dun privilge (par le DBA ou le propritaire de
lobjet) :
GRANT privilge TO nom utilisateur ;
REVOKE privilge TO nom utilisateur ;
Les privilges :
le droit de se connecter la base (CONNECT),
de crer des objets (CREATE ...),
des consulter en lecture uniquement (SELECT ON objet)
ou en modification des objets existants (MODIFY ON objet)
(les objets doivent tre dsigns de manire non-ambigu)
c M. Mathieu

110

Bases de donnes

2004-2005

Exemple :

DROP USER LAURENT CASCADE ;


DROP USER OLIVIER CASCADE ;
/* Creation des utilisateurs profs */
create user LAURENT
identified by test default tablespace donneeopt
temporary tablespace temp quota 3M on donneeopt ;
create user OLIVIER identified by test default tablespace donneeopt
temporary tablespace temp quota 3M on donneeopt ;
grant connect to OLIVIER, LAURENT ;
grant create session, create table, create synonym, create view, create
sequence, create procedure to OLIVIER, LAURENT ;
grant create trigger to OLIVIER, LAURENT ;
GRANT
GRANT
GRANT
GRANT
GRANT

SELECT
SELECT
SELECT
SELECT
SELECT

ON
ON
ON
ON
ON

system.FOURNITURE TO OLIVIER, LAURENT ;


system.SERVICE TO OLIVIER, LAURENT ;
system.COMMANDE TO OLIVIER, LAURENT ;
system.AGENT TO OLIVIER, LAURENT ;
system.FOURNISSEUR TO OLIVIER, LAURENT ;

GRANT SELECT ON system.COLLECTIVITE TO OLIVIER, LAURENT ;


c M. Mathieu

111

Bases de donnes

2004-2005

La connexion une base (Oracle)


Laccs en mode client-serveur se fait selon ce schma :

Serveur Oracle

Net8

base1

base2

Poste client

Net8 - middleware qui sappuie sur un protocole rseau (TCP/IP). (remplace


SQL*Net).
c M. Mathieu

112

Bases de donnes

2004-2005

Sur le poste client il faut :


installer le logiciel Net8 dOracle
le configurer afin de rendre la base accessible (via fichier TNSNAMES.ORA)
installer soit des drivers JDBC pour programmer sous Java, soit un OBDC
afin daccder la base depuis MS Acces, soit des logiciels Oracle ou de
dveloppement.
Sur le serveur il faut configurer le fichier LISTNER.ORA.
Lemplacement des fichiers LISTNER.ORA et TNSNAMES.ORA est :
$ORACLE HOME/network/admin/.

c M. Mathieu

113

Bases de donnes

2004-2005

Oracle permet laccs dun utilisateur dj connect sur une base daccder
une autre base Oracle (modulo le protocole rseau, la configuration, le logiciel
Net8).
Depuis la base courante on accde aux objets de la base distante en indiquant :
[instance base.][proprietaire.]objet@lien connexion
Le lien connexion comporte le nom symbolique de la base distante et se dfinit
avec :
CREATE [PUBLIC] [SHARED] DATABASE LINK lien connexion CONNECT TO
nom utilisateur IDENTIFIED BY mot de passe USING nom symbolique
Exemple :

CREATE SHARED PUBLIC DATABASE LINK sales.hq.acme.com


CONNECT TO scott IDENTIFIED BY tiger
AUTHENTICATED BY anupam IDENTIFIED BY bhide
USING sales ;
c M. Mathieu

114

Bases de donnes

2004-2005

Oracle - fonctionnement du serveur


Sous Unix un utilisateur part pour Oracle.
Tout le travail du SGBD sappuie sur le listener :
> lsnrctl [start | stop | status]
Une fois le listner lanc les instances de base se lancent avec :
> set ORACLE SID=ORCL
>svrmgrl
connect internal/oracle
startup
exit
>
c M. Mathieu

115

Bases de donnes

2004-2005

Larrt du serveur doit tre prcd de larrt de toutes les instances de la


base :
> set ORACLE SID=ORCL
>svrmgrl
connect internal/oracle
shutdown [immediate]
exit
>

c M. Mathieu

116

Bases de donnes

2004-2005

Cration dune base

cration du fichier dinitialisation


cration de la nouvelle instance de base
cration des dictionnaires, tablespaces, procdures stockes ...
cration des utilisateurs

c M. Mathieu

117

Bases de donnes

2004-2005

Importer / exporter des donnes


Cest possible sous Oracle avec les excutables imp et exp qui se trouvent dans :
$ORACLE HOME/bin
Pur faire ces oprations il ny a pas besoin de privilges particuliers, part les
droits sur les objets (tables) manipuls.
Ces opration sont utiles pour transfrer les donnes dune base une autre
et aussi pour lentretien dune base.

c M. Mathieu

118

Bases de donnes

2004-2005

Chapitre 5 :
Introduction au PL/SQL

c M. Mathieu

119

Bases de donnes

2004-2005

PL/SQL :

une marque Oracle


un vrai langage complmentaire SQL
un langage structur et procdural
permet la cration des fonctions / procdures stockes au niveau de la base
permet un accs plus fin la base avec une gestion explicite des erreurs

La structure du code :
[DECLARE
-- declarations]
BEGIN
-- instructions
[EXCEPTION
--traitement exceptions]
END ;
c M. Mathieu

120

Bases de donnes

2004-2005

Un programme PL/SQL peut tre :


un bloc anonyme saisis directement sous SQL*Plus
un bloc anonyme cr dans un fichier.pl et excut depuis SQL*PLUS :
SQL>@fichier.pl
une fonction/procdure stocke, un package ou un trigger appel depuis
des requtes SQL, dautre code PL/SQL ou dclenchs lors des certains
vnements :
CREATE FUNCTION/PROCEDURE/TRIGGER nom code ...
AS ...
Exemples :
c M. Mathieu

121

Bases de donnes

2004-2005

Exemples : un code PL/SQL qui ne fait rien :


SQL> begin
2 null ;
3 end ;
4 /
SQL>run
Procedure PL/SQL terminee avec succes.

ou qui fait la mme chose (pas grand chose) sous forme de procdure stocke :
SQL> create or replace procedure rien
2 is
3 begin
4 null ;
5 end ;
6 /
Procedure creee.
SQL> execute rien
Procedure PL/SQL terminee avec succes.
c M. Mathieu

122

Bases de donnes

2004-2005

SQL et PL/SQL

Des ordres SQL sont supports dans PL/SQL et des fonctions crites en
PL/SQL sont utilisables dans les ordres SQL.
Les instructions acceptes sous PL/SQL du langage de manipulation de donnes (LMD) et certaines instructions de gestion de transactions, savoir :

INSERT, UPDATE, DELETE, SELECT,


COMMIT, ROLLBACK, SAVEPOINT,
LOCK TABLE,
SET TRANSACTION READ ONLY.

Les ordres du LDD ne sont pas supports.


c M. Mathieu

123

Bases de donnes

2004-2005

Exemple :

DECLARE
qty on hand NUMBER(5) ;
BEGIN
SELECT quantity INTO qty on hand FROM inventory
WHERE product = TENNIS RACKET
FOR UPDATE OF quantity ;
IF qty on hand > 0 THEN -- check quantity
UPDATE inventory SET quantity = quantity - 1
WHERE product = TENNIS RACKET ;
INSERT INTO purchase record
VALUES (Tennis racket purchased, SYSDATE) ;
ELSE
INSERT INTO purchase record
VALUES (Out of tennis rackets, SYSDATE) ;
END IF ;
COMMIT ;
EXCEPTION
WHEN no data found THEN
INSERT INTO error table
VALUES (Product Tennis Rackets not found) ;
END ;
/
c M. Mathieu

124

Bases de donnes

2004-2005

Dclaration de variables

Types de donnes :

BINARY INTEGER
Entier
NUMBER [(n,m)]
CHAR [(longueur max)]
Caractres long. fixe < 32767 o
LONG et LONG RAW
VARCHAR2 (longueur max)
Caractres long. Var < 32767 o
DATE
BOOLEAN
True,False ou Null

V Prix

NUMBER(4,2) := 11.5 ;

Affecter des valeurs :


V Prix

:= 15 ;

V PrixUnitaire

:= V Prix ;

c M. Mathieu

125

Bases de donnes

2004-2005

Dclaration de constantes :
credit limit CONSTANT REAL := 5000.00 ;

La lecture dune variable (dans un bloc anonyme) est faite avec &variable

Dclaration de variables globales :


VARIABLE type nom variable ;
Une variable globale sutilise avec :nom variable.
VARIABLE NUMBER(10,2) PRIX ;
...
BEGIN
:PRIX := CALCUL(...)
...
END
PRINT PRIX ;
c M. Mathieu

126

Bases de donnes

2004-2005

Exemple : Retrouver le type dun fournisseur donn.


/* usage des variables internes */
set serveroutput on
DECLARE
VFNom Fournisseur.FNom%TYPE ;
VFType Fournisseur.FType%TYPE ;
Resultat CHAR(80) ;
BEGIN
SELECT FNom, FType
INTO VFNom, VFType
FROM Fournisseur
WHERE IdFourS = 107 ;
Resultat := Fournisseur : || 107 || Nom : ||
VFNom || Type : || VFType ;
DBMS OUTPUT.PUT LINE(Resultat) ;
END ;
c M.

/ Mathieu

127

Bases de donnes

2004-2005

/* Avec des variables globales dont un prompteur */


ACCEPT PID PROMPT Numero fournisseur :
VARIABLE Resultat CHAR (80) ;
DECLARE
VFNom Fournisseur.FNom%TYPE ;
VFType Fournisseur.FType%TYPE ;
BEGIN
SELECT FNom, FType
INTO VFNom, VFType
FROM Fournisseur
WHERE IdFourS = &PID ;
:Resultat := Fournisseur : || &PID || Nom : || VFNom ||
Type : || VFType ;
END ;
/
print Resultat ;

c M. Mathieu

128

Bases de donnes

2004-2005

Lattribut %TYPE
permet de dfinir des variables partir :
dune colonne de table
NomF

Agent.ANom%TYPE ;

dune autre variable


Prix

NUMBER (4,2) ;

Prix Max

v Prix%TYPE := 56 ;

Lattribut %ROWTYPE
permet de dclarer une variable partir dun ensemble de colonnes dune table
(ou vue)
Agent enregistrement

c M. Mathieu

Agent%ROWTYPE ;

129

Bases de donnes

2004-2005

Deux types de donnes composites


table PL/SQL :
record PL/SQL : similaire aux structures denregistrement
Exemple RECORD PL/SQL
DECLARE
IS RECORD
TYPE Agt enreg
( AgtNom
VARCHAR(25),
AgtPrenom
VARCHAR(25) ) ;
Enreg Agent

c M. Mathieu

Agt enreg ;

130

Bases de donnes

2004-2005

Les expressions font intervenir les oprateurs connus, des constantes et des
fonctions Oracle ou dfinies par lutilisateur lexception de fontions dagrgat.

Les structures de contrle :


structures de test :
IF - THEN
IF - THEN - ELSE
IF - THEN - ELSIF
structures itratives :
LOOP et EXIT
WHILE - LOOP
FOR - LOOP
structure de contrle squentiel :
GOTO
NULL
c M. Mathieu

131

Bases de donnes

2004-2005

Exemples :

IF sales > quota THEN


compute bonus(empid) ;
UPDATE payroll SET pay = pay + bonus WHERE empno = emp id ;
END IF ;
IF trans type = CR THEN
UPDATE accounts SET balance = balance + credit WHERE ...
ELSE
IF new balance >= minimum balance THEN
UPDATE accounts SET balance = balance - debit WHERE ...
ELSE
RAISE insufficient funds ;
END IF ;
END IF ;

c M. Mathieu

132

Bases de donnes

2004-2005

WHILE total <= 25000 LOOP


...
SELECT sal INTO salary FROM emp WHERE ...
total := total + salary ;
END LOOP ;
FOR ctr IN 1..10 LOOP
IF NOT finished THEN
INSERT INTO ... VALUES (ctr, ...) ;
factor := ctr * 2 ; -- legal
ELSE
ctr := 10 ; -- illegal
END IF ;

-- legal

END LOOP ;

c M. Mathieu

133

Bases de donnes

2004-2005

DECLARE
done BOOLEAN ;
BEGIN
...
FOR i IN 1..50 LOOP
IF done THEN
GOTO end loop ;
END IF ;
...
< <end loop> > -NULL ;
END LOOP ; -- not an executable statement
END ;

c M. Mathieu

134

Bases de donnes

2004-2005

Curseurs
curseurs implicits (SELECT)
curseurs variable

c M. Mathieu

135

Bases de donnes

2004-2005

Exemple :

CURSOR c1 IS SELECT empno, ename, job, sal FROM emp


WHERE sal > 2000 ;
CURSOR c2 RETURN dept%ROWTYPE IS
SELECT * FROM dept WHERE deptno = 10 ;
CURSOR c3 (start date DATE) IS
SELECT empno, sal FROM emp WHERE hiredate > start date ;

c M. Mathieu

136

Bases de donnes

2004-2005

Exemple :
DECLARE

VFourT Id
VPrix
VIdCom
CURSOR

Commande.FourT Id%TYPE ;
Commande.Prix %TYPE ;
Commande.IdCom%TYPE ;
LCurseur1
SELECT
FROM
WHERE

IS
IdCom, Prix
Commande
FourT Id = &VFourT Id ;

BEGIN
...
OPEN
LOOP

LCurseur1 ;

...
FETCH LCurseur1 INTO VIdCom, VPrix ;
EXIT WHEN LCurseur1%ROWCOUNT>5
OR
%NOTFOUND ;
...
END LOOP ;
CLOSE

LCurseur1 ;

END ;
c M. Mathieu

137

Bases de donnes

2004-2005

Traitement derrreurs
Liste des erreurs prdfinies :
ACCESS INTO NULL ORA-06530
CURSOR ALREADY OPEN ORA-06511
DUP VAL ON INDEX ORA-00001
INVALID CURSOR ORA-01001
INVALID NUMBER ORA-01722
LOGIN DENIED ORA-01017
NO DATA FOUND ORA-01403
NOT LOGGED ON ORA-01012

c M. Mathieu

138

Bases de donnes

2004-2005

PROGRAM ERROR ORA-06501


ROWTYPE MISMATCH ORA-06504
SELF IS NULL ORA-30625
STORAGE ERROR ORA-06500
SUBSCRIPT BEYOND COUNT ORA-06533
SUBSCRIPT OUTSIDE LIMIT ORA-06532
SYS INVALID ROWID ORA-01410
TIMEOUT ON RESOURCE ORA-00051
TOO MANY ROWS ORA-01422
VALUE ERROR ORA-06502
ZERO DIVIDE ORA-01476

c M. Mathieu

139

Bases de donnes

2004-2005

Exemple :

DECLARE
pe ratio NUMBER(3,1) ;
BEGIN
DELETE FROM stats WHERE symbol = XYZ ;
SELECT price / NVL(earnings, 0) INTO pe ratio FROM stocks
WHERE symbol = XYZ ;
INSERT INTO stats (symbol, ratio) VALUES (XYZ, pe ratio) ;
EXCEPTION
WHEN ZERO DIVIDE THEN
...
WHEN NOT FOUND THEN
...
END ;

c M. Mathieu

140

Bases de donnes

2004-2005

DECLARE
pe ratio NUMBER(3,1) ;
BEGIN
DELETE FROM stats WHERE symbol = XYZ ;
BEGIN ---------- sub-block begins
SELECT price / NVL(earnings, 0) INTO pe ratio FROM stocks
WHERE symbol = XYZ ;
EXCEPTION
WHEN ZERO DIVIDE THEN
pe ratio := 0 ;
END ; ---------- sub-block ends
INSERT INTO stats (symbol, ratio) VALUES (XYZ, pe ratio) ;
EXCEPTION
WHEN OTHERS THEN
...
END ;

c M. Mathieu

141

Bases de donnes

2004-2005

DECLARE
v ename emp.ename%TYPE ;
v job emp.job%TYPE ;
BEGIN
SELECT ename, job
INTO v ename, v job
FROM emp
WHERE hiredate BETWEEN 1-JAN-92 AND 31-DEC-92 ;
...
EXCEPTION
WHEN no data found THEN
INSERT INTO error tab
VALUES (Nobody in 92) ;
WHEN too many rows THEN
INSERT INTO error tab
VALUES (More then one person in 92) ;
END ;
c M. Mathieu

142

Bases de donnes

2004-2005

Si dautres erreurs ORACLE apparaissent, PL/SQL a deux variables qui permet


de rcuprer lerreur :
SQLCODE - le numro de lerreur
SQLERRM - le message complet
DECLARE
error-message CHAR (100) ;
error-code NUMBER ;
BEGIN
...
EXCEPTION
WHEN OTHERS

THEN
error message :=SUBSTR(SQLERM,1,100) ;
error code :=SQLCODE ;
INSERT INTO errors VALUES (error message, error code) ;
END ;

c M. Mathieu

143

Bases de donnes

2004-2005

Lutilisateur peut dfinir ses propres erreurs (des erreurs de traitement).


Il faut prciser explicitement lexception (erreur) et lors de son apparition le code
est interrompu avec :
RAISE exception

Exemple :
DECLARE
out of stock EXCEPTION ;
....
IF quantity on hand = 0 THEN
RAISE out of stock ;
END IF
....
EXCEPTION
WHEN out of stock THEN ----traitement
c M. Mathieu

144

Bases de donnes

2004-2005

Excution dynamique des requtes SQL

Avec linstruction :
EXECUTE IMMEDIATE dynamic string

Exemple 1 :

EXECUTE IMMEDIATE
< :my comm
EXECUTE IMMEDIATE

DELETE FROM emp WHERE sal > :my sal AND comm
DELETE FROM emp WHERE sal > :s AND comm < :c

ou :my sal est substitu avec sa valeur courante


c M. Mathieu

145

Bases de donnes

2004-2005

Exemple 2 :

DECLARE
TYPE EmpCurTyp IS REF CURSOR ;
EmpCurTyp ;
emp cv
my ename VARCHAR2(15) ;
NUMBER := 1000 ;
my sal
BEGIN
OPEN emp cv FOR
SELECT ename, sal FROM emp
WHERE sal > :s USING my sal ;
...
END ;

c M. Mathieu

146

Bases de donnes

2004-2005

Exemple 3 :

CREATE PROCEDURE create dept (


deptno IN OUT NUMBER,
dname IN VARCHAR2,
loc
IN VARCHAR2) AS
BEGIN
deptno := deptno seq.NEXTVAL ;
INSERT INTO dept VALUES (deptno, dname, loc) ;
END ;

Appel de cette procedure par du code PL/SQL dynamique :

DECLARE
plsql block VARCHAR2(500) ;
new deptno NUMBER(2) ;
new dname VARCHAR2(14) := ADVERTISING ;
VARCHAR2(13) := NEW YORK ;
new loc
BEGIN
plsql block := BEGIN create dept( :a, :b, :c) ; END ; ;
EXECUTE IMMEDIATE plsql block
USING IN OUT new deptno, new dname, new loc ;
IF new deptno > 90 THEN ...
END ;-c M. Mathieu

147

Bases de donnes

2004-2005

Procdures, fonctions et triggers

Sont des programmes qui contiennent du SQL et du PL/SQL qui sont gards
dans la base et excuts sur demande explicite (procdures et fonctions) ou lors
des vnements prcis (triggers).

cration : CREATE
modification du code : ALTER ou REPLACE
suppression : DROP

c M. Mathieu

148

Bases de donnes

2004-2005

Exemple 1 :

CREATE FUNCTION get bal(acc no IN NUMBER)


RETURN NUMBER
IS acc bal NUMBER(11,2) ;
BEGIN
SELECT balance
INTO acc bal
FROM accounts
WHERE account id = acc no ;
RETURN(acc bal) ;
END ;

Exemple 2 :

CREATE OR REPLACE PROCEDURE sam.credit (acc no IN NUMBER, amount IN


NUMBER) AS
BEGIN
UPDATE accounts
SET balance = balance + amount
WHERE account id = acc no ;
END ;
c M. Mathieu

149

Bases de donnes

2004-2005

Trigger = procdure stocke dclenche lors de linsertion, modification ou


suppression dun enregistrement dans une table ou vue bien prcise.
CREATE TRIGGER nom trigger [BEFORE | AFTER] venement ON table vue
[FOR EACH ROW] [WHEN (condition)]
code PL/SQL
Exemple :

CREATE TRIGGER scott.emp permit changes


BEFORE
DELETE OR INSERT OR UPDATE
ON scott.emp
pl/sql block
CREATE TRIGGER scott.salary check
BEFORE
INSERT OR UPDATE OF sal, job ON scott.emp
FOR EACH ROW
WHEN (new.job <> PRESIDENT)
pl/sql block
c M. Mathieu

150

Bases de donnes

2004-2005

Chapitre 6 :
JAVA et Oracle

c M. Mathieu

151

Bases de donnes

2004-2005

Trois faon dinterfacer JAVA (le langage) et Oracle (le SGBD) :


JDBC - API de Java
SQLJ - produit Oracle pour une Java VM qui supporte des requtes statiques
Fonctions stockes Java (PL/SQL)
CORBA et autres ...

c M. Mathieu

152

Bases de donnes

c M. Mathieu

2004-2005

153

Bases de donnes

2004-2005

JDBC (Java DataBase Conectivity)


Oracle a cr donc des drivers (thin, oci7, oci8, ...) et amlior considrablement le standard de JAVA.
Du point de vue de la programmation, les tches senchanent de la manire
suivante :

Cration dune instance dun driver JDBC


Connexion la base de donnes
Cration dun contexte de requte
Soumission dune requte SQL au serveur SGBD
Collecte et traitement des rsultats

c M. Mathieu

154

Bases de donnes

2004-2005

Packages java
Nous utiliserons les classes dfinies dans le package java.sql
DriverManager, Connection, Statement et ResultSet

Les rsultats (les valeurs des champs de la base) sobtiennent avec les mthodes get ? ? dfinies par linterface ResultSet. Les mthodes existent sous deux
formes autorisant laccs aux donnes soit par le nom du champ, soit par son index dans le ResultSet

les chanes de caractres :

String getString(int index) ; String getString(String name) ;

les entiers et les rels :

int getInt(int index) ; float getFloat(int index) ;


int getInt(String name) ; float getFloat(String name) ;

les dates :

Timestamp getDate(int index) ; Timestamp getDate(String name) ;

c M. Mathieu

155

Bases de donnes

2004-2005

Exemple :
import
import
import
import

java.sql.*
java.math.*
java.io.*
java.awt.*

class JdbcTest {
public static void main (String args []) throws SQLException {
// Load Oracle driver
DriverManager.registerDriver (new oracle.jdbc.driver.OracleDriver()) ;
// Connect to the local database
Connection conn =
DriverManager.getConnection (
"jdbc :oracle :thin :@educusers :1521 :dbem",
"scott", "tiger") ;

c M. Mathieu

156

Bases de donnes

2004-2005

// Query the employee names


Statement stmt = conn.createStatement () ;
ResultSet rset = stmt.executeQuery ("SELECT ENAME FROM EMP") ;
// Print the name out
while (rset.next ())
System.out.println (rset.getString (1)) ;
// Close the result set, statement, and the connection
rset.close() ;
stmt.close() ;
conn.close() ;
}
}

c M. Mathieu

157

Bases de donnes

2004-2005

JDBC permet aussi des reqtes dynamiques :


import java.sql.* ;
public static void projectsDue(boolean dueThisMonth) throws
SQLException {
// Get JDBC connection from previously initialized SQLJ
DefaultContext.
Connection conn = DefaultContext.getDefaultContext().getConnection() ;
String query = "SELECT name, start date + duration " +
"FROM projects WHERE start date + duration >=
sysdate" ;
if (dueThisMonth)
query += " AND to char(start date + duration, fmMonth) " +
" = to char(sysdate, fmMonth) " ;

c M. Mathieu

158

Bases de donnes

2004-2005

PreparedStatement pstmt = conn.prepareStatement(query) ;


ResultSet rs = pstmt.executeQuery() ;
while (rs.next()) {
System.out.println("Project : " + rs.getString(1) + " Deadline :
" +
rs.getDate(2)) ;
}
rs.close() ;
pstmt.close() ;
}

c M. Mathieu

159

Bases de donnes

2004-2005

Les traitements par lot (batch) sous JDBC :


DriverManager.registerDriver(new oracle.jdbc.driver.OracleDriver()) ;
conn = DriverManager.getConnection(
"jdbc :oracle :thin :@educusers :1521 :dbem", "scott",
"tiger") ;
stmt = conn.createStatement() ;
try { stmt.execute(
"create table mytest table (col1 number, col2
varchar2(20))") ;
} catch (Exception e1) {}
//
// Insert in a batch.
//
pstmt = conn.prepareStatement("insert into mytest table values
( ?, ?)") ;

c M. Mathieu

160

Bases de donnes

2004-2005

pstmt.setInt(1, 1) ;
pstmt.setString(2, "row 1") ;
pstmt.addBatch() ;
pstmt.setInt(1, 2) ;
pstmt.setString(2, "row 2") ;
pstmt.addBatch() ;
pstmt.executeBatch() ;
//
// Select and print results.
//
rset = stmt.executeQuery("select * from mytest table") ;
while (rset.next())
{
System.out.println(rset.getInt(1) + ", " + rset.getString(2)) ;
}

c M. Mathieu

161

Bases de donnes

2004-2005

SQLJ
Extension de Java qui fonctionne avec les mme drivers que JDBC, le code est
fait pour requtes statiques et excution est plus rapide.
>sqlj code.sqlj // produit code.java
>javac code.java

Exemple :

void runExample() throws SQLException


{
System.out.println() ;
System.out.println( "Running the example." ) ;
System.out.println() ;
/* Reset the database for the demo application.
*/
#sql { DELETE FROM SALES } ;

c M. Mathieu

162

Bases de donnes

2004-2005

/* Insert a row into the cleared table.


*/
#sql
{
INSERT INTO SALES VALUES(
101,Relativistic redshift recorder,
TO DATE(22-OCT-1997,dd-mon-yyyy),
10999.95,
1,John Smith)
};
/* Insert another row in the table using bind variables.
*/
int
itemID = 1001 ;
String itemName = "Left-handed hammer" ;
double totalCost = 79.99 ;
Integer salesRepID = new Integer(358) ;
String salesRepName = "Jouni Seppanen" ;
Date
dateSold = new Date(97,11,6) ;

#sql { INSERT INTO SALES VALUES( :itemID, :itemName, :dateSold, :totalCo


:salesRepID, :salesRepName) } ;

c M. Mathieu

163

Bases de donnes

2004-2005

/* Instantiate and initialize the iterator.


**
** The iterator object is initialized using the result of a query.
** The query creates a new instance of the iterator and stores it
in
** the variable sales of type SalesRecs. SQLJ translator has
** automatically declared the iterator so that it has methods for
** accessing the rows and columns of the result set.
*/
SalesRecs sales ;
#sql sales = { SELECT item number,item name,sales date,cost,
sales rep number,sales rep name FROM sales } ;
/* Print the result using the iterator.
**
** Note how the next row is accessed using method next(), and how
** the columns can be accessed with methods that are named after
the
** actual database column names.
*/

c M. Mathieu

164

Bases de donnes

while( sales.next() )
{
System.out.println(
System.out.println(
System.out.println(
System.out.println(
System.out.println(

2004-2005

"ITEM ID : " + sales.item number() ) ;


"ITEM NAME : " + sales.item name() ) ;
"COST : " + sales.cost() ) ;
"SALES DATE : " + sales.sales date() ) ;
"SALES REP ID : " + sales.sales rep number()

);
System.out.println( "SALES REP NAME : " + sales.sales rep name()
);
System.out.println() ;
}
/* Close the iterator.
**
** Iterators should be closed when you no longer need them.
*/
sales.close() ;
}

c M. Mathieu

165

Bases de donnes

2004-2005

Fonctions stockes Java


Les fonctions Java se compilent dabord afin dobtenir des classes, ensuite ces
classes sont charges dans la base avec :
loadjava -user nom/mot de passe@lien connexion nom classe.class
Une dfinition de type CREATE FUNCTION est ncessaire en indiquant quil
sagit du code Java. Lappel se fait indiquant le nom et les paramtres.
Exemple 1 : soit la fonction trs simple :

public class Test


{
public static String Message(){return "Bonjour !" ;}
}

Elle est compile et charge :

> javac Test.java


> loadjava -user mihaela/test@dbem.world java.class
c M. Mathieu

166

Bases de donnes

2004-2005

Sous SQL*Plus on dfinit la fonction et on lappelle :


SQL>
2
3
4

CREATE FUNCTION TESTJAVA RETURN VARCHAR2


AS LANGUAGE JAVA
NAME Test.Message() return java.lang.String ;
/

Fonction cre.
SQL>

CALL TESTJAVA() INTO :R ;

Appel termin.
SQL> PRINT :R ;
R
-------------------------------Bonjour !
SQL> SELECT TESTJAVA() FROM DUAL ;
TESTJAVA()
--------------------------------------------------------Bonjour !
c M. Mathieu

167

Bases de donnes

2004-2005

Exemple 2 : Soit la code java suivant :


public class Fibonacci
{
public static int fib (int n)
{
if (n==1 || n==2) return 1 ;
else
return fib(n-1) + fib(n - 2) ;
}
}

qui est compil et charg dans la base avec loadjava. Au niveau de SQL*Plus :
SQL>
SQL>
2
3
4

CREATE OR REPLACE FUNCTION fib (n NUMBER) RETURN NUMBER


AS LANGUAGE JAVA
NAME Fibonacci.fib(int) return int ;
/

Fonction cre.
c M. Mathieu

168

Bases de donnes

2004-2005

Son appel est prpar et effectu :

SQL> VARIABLE n NUMBER


SQL> VARIABLE f NUMBER
SQL> EXECUTE :n := 7 ;

Procdure PL/SQL termine avec succs.


SQL> CALL fib( :n) INTO :f ;
Appel termin.
SQL> PRINT :f ;
F
---------13

c M. Mathieu

169

Bases de donnes

2004-2005

Chapitre 7 :
Programmation C et Oracle

c M. Mathieu

170

Bases de donnes

2004-2005

Oracle offre la possibilit dcrire des programmes en langages de haut niveau


(FORTRAN, COBOL, C/C++) qui englobent des facilits pour le travail avec les
bases de donnes.
Pro*C/C++ est le prcompilateur pour C/C++. Il permet de :
crire des programmes en C et C++
excuter lintrieur du programme nimporte quel type dordre SQL standard :
cration dynamique des tables : CREATE, ALTER, DROP
manipulation des donnes : SELECT, INSERT, DELETE, UPDATE
transactions : COMMIT, ROLLBACK
c M. Mathieu

171

Bases de donnes

2004-2005

inclure des blocs PL/SQL


traiter les erreurs
convertir les types internes de donnes Oracle en types de donnes C
utiliser des accs concurents
prcompiler dynamiquement
crer et excuter dynamiquement des ordres SQL
travailler avec les objets de lutilisateur (fonction, procdures, triggers, vue,
etc)
travailler avec des objets de grande taille

c M. Mathieu

172

Bases de donnes

2004-2005

Le schma de construction de lexcutable :

c M. Mathieu

173

Bases de donnes

2004-2005

Le prcompilateur se trouve dans $ORACLE HOME/bin et transforme un programme avec extension .pc en programme .c ou .cpp.
Tout source .pc doit contenir au moins :
# include <sqlca.h>
Cette librairie se trouve dans le rpertoire $ORACLE HOME/precomp/public/.

Attention ! ! les options de prcompilation, compilation et dition des liens sont


nombreuses et parfois indispensables.

c M. Mathieu

174

Bases de donnes

c M. Mathieu

2004-2005

175

Bases de donnes

2004-2005

La connexion doit se faire avant tout acces la base.


La syntaxe est :
EXEC SQL CONNECT { :user IDENTIFIED BY :oldpswd | :usr psw }
[[ AT { dbname | :host variable }] USING :connect string ]
[ {ALTER AUTHORIZATION :newpswd | IN { SYSDBA | SYSOPER } MODE} ] ;
Une forme simple :
EXEC SQL CONNECT :username IDENTIFIED BY :password ;
ou username and password sont des variables hte de type CHAR or VARCHAR.
On utilise aussi :
EXEC SQL CONNECT :usr pwd ;
ou usr pwd contient toute la chane de connexion, le mot de passe tant spar
avec un /.
c M. Mathieu

176

Bases de donnes

2004-2005

Exemple :
char *username = "SCOTT@DBEM.WORLD" ;
char *password = "TIGER" ;
...
EXEC SQL WHENEVER SQLERROR ...
EXEC SQL CONNECT :username IDENTIFIED BY :password ;

Plusieurs connexion simultanes des bases de donnes sont possibles.

c M. Mathieu

177

Bases de donnes

2004-2005

Les ordres SQL embarqus sont sous forme :


EXEC SQL <ordre SQL standard> ;
(une clause INTO peut apparatre pour SELECT ou FETCH).

Un bloc PL/SQL embarqu est dfini avec :


EXEC SQL EXECUTE
<bloc PL/SQL>
c M. Mathieu

178

Bases de donnes

2004-2005

Les variables hte :


sont dclares en dbut de programme dans un bloc compris entre :
BEGIN DECLARE SECTION
....
END DECLARE SECTION
sont utilises pour manipuler les donnes
sont utilisables comme des variables C.
Exemple :

EXEC SQL BEGIN DECLARE SECTION ;


VARCHAR nom[50] ;
int sal, emp no ;
EXEC SQL END DECLARE SECTION ;

Usage :

emp no = 2000 ;
EXEC SQL SELECT anom, salaire
INTO :nom, :sal
FROM agent
WHERE id agent = :emp no ;
c M. Mathieu

179

Bases de donnes

2004-2005

Usage illgal :

emp no = 2000 ;
strcpy(ma table, agent) ;
EXEC SQL SELECT anom, salaire
INTO :nom, :sal
FROM :ma table
WHERE id agent = :emp no ;

Dans des ordres SQL le nom des objets doit tre explicite !

c M. Mathieu

180

Bases de donnes

2004-2005

Un curseur identifie une ligne retourne dune table dans une requte. Les instructions :
DECLARE CURSOR
OPEN
FETCH
CLOSE
permettent de dclarer, ouvrir, utiliser et fermer un curseur.
Un curseur doit avoir un nom unique et tre dclar une seule fois.

c M. Mathieu

181

Bases de donnes

2004-2005

Exemple :

/* Declare the cursor. All static SQL explicit cursors


* contain SELECT commands. salespeople is a SQL identifier,
* not a (C) host variable.
*/
EXEC SQL DECLARE salespeople CURSOR FOR
SELECT ENAME, SAL, COMM
FROM EMP
WHERE JOB LIKE SALES% ;
/* Open the cursor. */
EXEC SQL OPEN salespeople ;
/* Get ready to print results. */
printf("\n\nThe companys salespeople are--\n\n") ;
printf("Salesperson Salary Commission\n") ;
printf("----------- ------ ----------\n") ;

c M. Mathieu

182

Bases de donnes

2004-2005

/* Loop, fetching all salespersons statistics.


* Cause the program to break the loop when no more
* data can be retrieved on the cursor.
*/
EXEC SQL WHENEVER NOT FOUND DO break ;
for ( ; ;)
{
EXEC SQL FETCH salespeople INTO :emp rec ptr ;
printf("%s %9.2f %12.2f\n", emp rec ptr->emp name,
emp rec ptr->salary, emp rec ptr->commission) ;
}
/* Close the cursor. */
EXEC SQL CLOSE salespeople ;

c M. Mathieu

183