Bases de Données

Transcription

Bases de Données
Bases de Données
1
PLAN
1 : Introduction
2 : Le langage SQL
3 : Intégrité des données
4 : PL/SQL
5 et 6 : Conception des bases de données
7 : Organisation et administration d'une base de données
(Oracle)
2
Bibliographie
Livres :
Bases de données Objet et relationnel de Georges Gardarin (Edition
Eyrolles)
Web:
http://www-inf.int-evry.fr/COURS/BD/accueil-ext.html (modèle
relationnel, SQL, Conception Entité-Association)
http://esesa1.supelec.fr/www/yb/poly_bd/sql/tdm_sql.html (language
SQL)
http://cui.unige.ch/~nerima/index_bd.html (modèle relationnel, SQL,
Conception Entité-Association)
3
1 : Introduction
4
Définition
Base de données : ensemble structuré de données
!
!
!
!
enregistrées avec le minimum de redondance
pour satisfaire simultanément plusieurs utilisateurs
de façon sélective
en un temps opportun.
Stockage des données :
Sur support permanent
Administration des données :
Systèmes de Gestion de Base de Données (SGBD)
5
Système de Gestion de Base de Données
Un Système de Gestion de Base de Données (SGBD) est un
ensemble de logiciels permettant la recherche, la mise à jour et la
sauvegarde de données stockées sur mémoire secondaire.
SGBD
Système d’exploitation
Disque
Place du SGBD dans le système
6
Système de Gestion de Base de Données
Un SGBD assure
! la description des données,
! leur recherche et mise à jour,
! la sûreté : vérifier les droits d’accès des utilisateurs; limiter les
accès non autorisés ; crypter les informations sensibles
! la sécurité : sauvegarde et restauration des données; limiter les
erreurs de saisie, de manipulation.
! l’intégrité : définir des règles qui maintiennent l’intégrité de la base
de données (contraintes d’intégrité)
! la concurrence d’accès : détecter et traiter les cas où il y a conflit
d’accès entre plusieurs utilisateurs.
7
Système de Gestion de Base de Données
Domaine d’utilisation :
!
!
!
!
!
!
!
Bases de Connaissances,
Systèmes Experts,
Systèmes d’Information Géographique,
Edition de Documents Informatisés (EDI),
Systèmes d’Information Documentaire (SID),
Conception Assistée par Ordinateur (CAO),
Gestion de Production Assistée par Ordinateur (GPAO)
Ce sont des domaines où une information structurée est enregistrée
et gérée par un SGBD et traitée selon des besoins spécifiques
(l’interface et les outils de traitement dépendant plus particulièrement
de l’application).
8
Modélisation des données
On distingue trois niveaux de description des données:
! niveau interne
! niveau conceptuel
! niveau externe
9
Application
Niveau
Application
Schéma externe
Application
Schéma externe
vues
externe
Niveau
Schéma conceptuel
structure des données
:
types, droits d’accès
conceptuel
Niveau
Schéma physique
structures de stockage
:
fichiers, …
interne
10
Le niveau interne
Spécifie comment les données sont enregistrées sur les mémoires
secondaires (disque, bandes, …). Le schéma physique décrit les
données telles quelles sont stockées dans la machine
Exemple :
! les fichiers qui les contiennent (nom, localisation, taille)
11
Le niveau conceptuel
Le schéma conceptuel : description des données qui existent dans
l’entreprise sans souci d’implantation en machine:
! les types de données élémentaires
( par ex. titre de livre, nom d’auteur, éditeur, nombre de pages)
! les types de données composés (description des objets)
(par ex. livre, personne…)
! les types de données composés (description des associations
entre les objets
( par ex. un livre emprunté par une personne,…)
! certaines règles
(par ex. une personne ayant plus d’une semaine de retard
pour rendre un livre à la bibliothèque n’a pas le droit
d’emprunter des livres pendant deux semaines, …)
12
Exemple de schéma conceptuel
PERSONNE
LIVRE
EMPRUNT
titre
N° de
SS
Date
N°
auteur
N°
édit.
Type
Nom
Adr
13
Le niveau externe
C'est le plus haut niveau d'abstraction de la base de données.
Il est aussi appelé niveau vue et est propre à un utilisateur ou à un
groupe d'utilisateurs et ne lui présente qu'une vue partielle de la
réalité : celle qui intéresse son service.
Il y a bien entendu plusieurs vues d'une même BD.
14
Historique des SGBD
Trois générations dans l’évolution des systèmes de gestion de base de
données (SGBD).
Chaque génération est caractérisée par le modèle de données qu’elle
propose.
Les systèmes hiérarchiques et réseaux
Les systèmes relationnels
Les systèmes objets
15
Les systèmes hiérarchiques et réseaux
1. Les systèmes hiérarchiques et réseaux
Ces systèmes sont apparus dans les années 60 et constituent la
première génération de SGBD.
Ils résultent d’une approche de conception système qui vise à étendre
le système de fichier par des possibilités de liaison inter-fichiers
matérialisées par des pointeurs.
16
Les systèmes hiérarchiques et réseaux
Modèle hiérarchique (1960)
! Les données sont représentées dans la base sous la forme d’un
arbre
! La structure d’arbre utilise des pointeurs et détermine le chemin
d’accès aux données.
serviceresponsableresponsableexécutant exécutant exécutant exécutant
17
Les systèmes hiérarchiques et réseaux
Modèle réseau (1970)
! Les données sont représentées dans la base sous la forme d’un
graphe quelconque
! La structure de graphe utilise des pointeurs et détermine le chemin
d’accès aux données.
serviceresponsableresponsableexécutant exécutant exécutant exécutant
18
Les systèmes relationnels
2. Les systèmes relationnels
Ces systèmes constituent la deuxième génération de SGBD. Ils sont
fondés sur le concept de relation, d’où leur nom relationnel. Ces
systèmes ont été assez long à s’imposer et représentent aujourd’hui la
grande majorité des SBGD.
On note plusieurs étapes dans l’apparition de ces systèmes :
! 1970 : apparition du modèle relationnel
! 1980 : apparition du premier SGBD relationnel : SGBDR
! 1990 : les SGBDR représente plus de 50% du parc des SGBD
19
Les systèmes relationnels
La théorie des SGBDR est fondée sur la théorie mathématique des
relations
Représentation des données sous la forme de tables constituées de
lignes et de colonnes
Dominent le marché des SGBD
Table des services
Table des responsablesService
ResponsableResponsable
Exécutant
20
Les systèmes objets
3. Les systèmes objets
Ils sont fondés sur le modèle à objets qui permet de représenter
beaucoup de situations du monde réel, par la richesse des concepts
qu’il propose.
Le modèle est apparu dans les années 1980, et les premiers systèmes
sont apparus dans les années 1990.
Objet1
Objet
1
Objet2
Personne
Annuaire
21
Le Modèle Relationnel
Les concepts de base :
Le modèle relationnel a été inventé par E.F.Codd en 1970. Il se
fonde sur le concept mathématique de relation.
! Définition : Un domaine est un ensemble de valeurs.
! Exemple :
- domaine des entiers (domaine infini)
- domaine de chaînes de caractères
22
Le Modèle Relationnel
! Définition : Une relation est un sous-ensemble du produit cartésien
d’une liste de domaines, caractérisé par un nom.
! Exemple :
Soit D1 = { Chine, Pays-Bas, Portugal } et D2 = { escudo, florin, yuan }.
La relation PAYS :
Pays
NomPays
Monnaie
Chine
Yuan
Pays-Bas
Florin
Portugal
Escudo
23
L’unicité de clé
! Définition : Une clé de la relation est un ensemble minimal d’attributs
dont la connaissance des valeurs permet d’identifier un tuple unique de
la relation considérée.
Plus formellement, une clé d’une relation R est un ensemble d’attributs
X tel que quels que soient les tuples t1 et t2 d’une instance de R, t1(X)
! t2(X) .
Toute relation possède au moins une clé.
S’il existe plusieurs clés, on en choisit une que l’on appelle clé
primaire.
! Exemple :
L’attribut NomPays est la clé de la relation PAYS (NomPays, Monnaie).
24
Schéma de relation
! Définition : Un attribut est une colonne d’une relation caractérisée
par un nom.
! Exemple : NomPays, Monnaie
! Définition : Le schéma de relation est composé du nom de la
relation suivi de la liste des attributs et de la définition de leurs
domaines.
Un schéma de relation est noté sous la forme :
R (A1 : D1, A2 : D2, …, An : Dn)
25
Schéma de relation
! Exemple :
PAYS ( NomPays : VARCHAR2(25), Monnaie : VARCHAR2(25) ,
Population : INTEGER)
Le schéma d’une relation représente son intention.
Une table représente une extension d’une relation.
26
L’algèbre Relationnelle
L'algèbre relationnelle : langage interne d'un SGBD relationnel.
Elle se compose d'opérateurs de manipulation des relations. Ces
opérateurs sont regroupés en deux familles :
! les opérateurs ensemblistes : union, intersection, différence et
produit cartésien.
! les opérateurs relationnels : restriction, projection, jointure et
division.
27
Union
R
A
B
C
a1
b1
c1
a1
b2
a2
b1
R1 A
B
C
a1
b2
c1
c2
a2
b2
c1
c2
a2
b1
c2
Porte sur deux relations (compatibles) de même schéma.
U = R " R1
U
A
B
C
a1
b1
c1
a1
b2
c2
a1
b2
c1
a2
b2
c1
a2
b1
c2
28
Intersection
R
A
B
C
a1
a1
a2
b1
b2
b1
c1
c1
c2
S
A
B
C
a1
a2
a2
b2
b2
b2
c1
c1
c2
Porte sur deux relations (compatibles) de même schéma.
I=R#S
On prend les tuples communs aux 2 relations.
I
A
a1
B
b2
C
c1
29
Différence
R
A
B
C
a1
a1
a2
b1
b2
b1
c1
c1
c2
S
A
B
C
a1
a2
a2
b2
b2
b2
c1
c1
c2
Porte sur deux relations (compatibles) de même schéma.
D=R-S
On conserve les tuples présents dans la relation R et qui ne sont pas
dans la relation S
D
A
B
C
a1
a2
b1
b1
c1
c2
30
Intersection
Remarque : L’intersection peut être exprimée avec la différence
R1 # R2 = R1 – (R1 – R2)
ou
R1 # R2 = R2 – (R2 – R1)
31
Le produit cartésien
Le produit cartésien d’un ensemble de domaines D1, D2, …, Dn est
l’ensemble de tuples < v1, v2, … vm> tel que pour chaque i de 1 à m vi
appartient à Di.
Exemple de produit cartésien:
Soit D1 = {Chine, Hollande, Portugal} et D2 = {escudo, florin,
yuan}.
D1 $ D2 =
Chine
Escudo
Chine
Florin
Chine
Yuan
Pays-Bas
Escudo
Pays-Bas
Florin
Pays-Bas
Yuan
Portugal
Escudo
Portugal
Florin
Portugal
Yuan
32
Restriction/Sélection
Employé
Matricule
1050
832
900
Nom
Dupond
Durand
Duval
dept
10
20
10
Emp_dept10 = % dept = ‘10’ Employé
En SQL, l’opération est la suivante:
SELECT * FROM Employé WHERE dept = 10;
Emp_dept10 Matricule
1050
900
Nom
Dupond
Duval
dept
10
10
33
Projection (1/2)
Employé
Matricule
1050
832
900
Nom
Dupond
Durand
Duval
dept
10
20
10
Notation algébrique: & attributs (RELATION)
EmployéMN = & {Matricule, Nom} Employé
En SQL, l’opération est la suivante:
SELECT Matricule, Nom FROM Employé;
EmployéMN
Matricule
1050
832
900
Nom
Dupond
Durand
Duval
34
Projection (2/2)
Département
dept
10
20
NomDept
Finances
Ventes
Lieu
Paris
Lyon
DépartementN = & {Nom} Département
En SQL: SELECT Nom FROM Département;
DépartementN NomDept
Finances
Ventes
35
Jointure
Employé
Matricule
1050
832
900
Nom
Dupond
Durand
Duval
dept
10
20
10
Département
Emp_dept = Employé
dept
10
20
NomDept
Finances
Ventes
Lieu
Paris
Lyon
Département
Emp_dept
Matricule
1050
832
900
Nom
Dupond
Durand
Duval
dept
10
20
10
NomDept
Finances
Ventes
Finances
Lieu
Paris
Lyon
Paris
36
Division
Le résultat de la division d’une relation P(A1,…Ai,Ai+1,…,An)
par une relation R(Ai+1,…,An) est une relation S(A1,…Ai)
définie par :
! le schéma de S constitué de tous les attributs de P qui
n’appartiennent pas a R, soit A1,…Ai ;
! tous les tuples s j de S tels que quel que soit le tuple r i de R le tuple
(s j , r i) est un tuple de P (c’est-à-dire P ' S $ R ).
Répond au type de question suivante : quels sont les « A » qui
sont associés à tous les « C » ?
37
Division
certifications PILOTE APPAREIL
Sierra
737
Sierra
757
Sierra
747
Delta
320
Delta
757
Alpha
737
Alpha
757
Alpha
747
Alpha
320
India
737
certificationsA = certifications ÷ avions
avions
APPAREIL
320
certificationsA PILOTE
Delta
Alpha
38
Division (2)
certifications PILOTE APPAREIL
Sierra
737
Sierra
757
Sierra
747
Delta
320
Delta
757
Alpha
737
Alpha
757
Alpha
747
Alpha
320
India
737
certificationsA = certifications ÷ avions
avions
APPAREIL
737
757
747
certificationsA PILOTE
Sierra
Alpha
39
Jointure, restriction et projection
équipement
VOL
890
890
891
891
836
APPAREIL
D9S
310
D9S
310
757
certification
PILOTE APPAREIL
Sierra
757
Sierra
D9S
Bravo
310
Hotel
D9S
Hotel
310
optionsVP = % VOL = 890 (& {VOL, PILOTE} (equipement
certification))
Select
from
where
and
VOL, PILOTE
equipement E, certification C
E.appareil = C.appareil
VOL = 890
optionsVP
VOL
890
890
890
PILOTE
Sierra
Hotel
Bravo
40
Les Arbres Algébriques
Nous venons de voir comment décrire une requête au moyen des
opérateurs de l'algèbre relationnelle.
Il existe une description graphique plus lisible : l'arbre algébrique.
Un arbre algébrique est un arbre dont :
- les feuilles sont les relations de base ;
- les nœuds sont les opérateurs ;
- la racine est le résultat ;
- les liens représentent les flux de données.
41
Les Arbres Algébriques
Des nœuds différents représentent les cinq principaux opérateurs
relationnels : l'union, la différence, la restriction, la projection et la
jointure.
restriction
#
union
jointure
projection
différence
42
2 : Le langage SQL
43
Définition
Structured Query Language (SQL) :
Ensemble de commandes utilisées par les utilisateurs et les
programmes pour définir, rechercher ou modifier des données dans
une base de données relationnelle.
C’est le langage standard des SGBDR.
44
Définition
SQL se divise en plusieurs parties :
! Langage d’interrogation (ordre SELECT)
! Langage de manipulation de données (ordres UPDATE, INSERT,
DELETE)
! Langage de définition de données (ordre CREATE, ALTER, DROP)
! Langage de contrôle de l’accès aux données (ordres GRANT,
REVOKE)
45
Les types de données de SQL
1. Type Caractère : CHAR
permet de stocker une chaîne de caractères de longueur fixe.
CHAR [(longueur)]
Par défaut longueur est égale à 1, maximale: 2000.
2. Type Caractère : VARCHAR2
permet de stocker une chaîne de caractères de longueur variable.
VARCHAR2(longueur_max)
Longueur maximale: 4000 caractères
46
Les types de données de SQL
3. Type numérique : NUMBER
permet de représenter les entiers, les nombres décimaux et les
nombres en virgule flottante.
NUMBER [ (précision [, échelle] )]
précision : nombre de chiffres significatifs
échelle : nombre de chiffres à droite de la marque décimale
La valeur 123456.78 est de type NUMBER (8 , 2).
4. Type date : DATE
Le format standard est 25-OCT-2003.
(ou : ’25/10/03’ , ‘25 oct 2003’ , …. )
47
Syntaxe d’une requête de sélection
La commande SELECT permet d’effectuer les opérations suivantes :
Projection, Restriction, Jointure, …
Syntaxe générale :
SELECT …
FROM …
WHERE …
GROUP BY …
HAVING …
ORDER BY
optionnelles
L'ordre des clauses est imposé
48
Recherche de données
Projection
Syntaxe :
SELECT [DISTINCT] {*, attribut , … }
FROM table ;
« * » signifie que toutes les colonnes de la table sont sélectionnées.
DISTINCT permet de supprimer les duplications.
49
Recherche de données
Exemple :
Soit la base de données de gestion des réservations de places de
spectacles pour un théâtre:
Spectacle (NumSpec, NomSpec, DatDebSpec, DatFinSpec)
Représentation (NumRep, NumSpec, DatRep, HeureRep)
Place (NumRep, NumPlace, Prix)
Réservation (NumRes, NumRep, NumPlace, NomDem, TelDem)
SELECT DISTINCT NomSpec
FROM Spectacle ;
Cette requête permet d’obtenir le nom de tous les spectacles figurant
dans la base de données.
50
Recherche de données
Restriction
Syntaxe :
SELECT *
FROM table
WHERE condition ;
Exemple:
SELECT DISTINCT NomSpec
FROM Spectacle
WHERE DatDebSpec = ’02-oct-2003’;
51
Prédicats de sélection
! prédicat de comparaison à l’aide des opérateurs : <, >, <=, >=, =, !=
ou <>.
! prédicat d’intervalle BETWEEN AND : expr BETWEEN expr1 AND
expr2
teste si la valeur d’une expression est comprise entre deux valeurs.
(Ex. : Prix BETWEEN 100 AND 200)
! une comparaison de chaînes de caractères LIKE : expr LIKE
chaîne, où chaîne peut contenir le caractère % qui remplace une
chaîne de caractères de longueur quelconque ou le caractère _ qui
remplace un seul caractère. (Ex. : NomSpec LIKE ‘Rev%’)
! prédicat de test IS [NOT] NULL
vérifie si une valeur est inconnue. (Ex. : TelDem IS NOT NULL )
52
Prédicats de sélection
! prédicat d’appartenance IN : expr IN (exp1, exp2, …)
vrai si la valeur de expr est égale à l’une des celles de exp1, exp2, ….
(Ex. : NumRep IN (1, 3, 13) )
! prédicat EXISTS
retourne une valeur vraie s'il existe au moins une ligne satisfaisant les
conditions de la sous-interrogation
! prédicat ANY ou ALL
doit être précédé par un opérateur de comparaison et retourne une
valeur vraie en fonction de l’opérateur de comparaison utilisé et des
tuples résultant de la sous-requête exprimée
Les prédicats peuvent être composés de plusieurs conditions grâce
aux opérateurs logiques : NOT, AND, OR.
53
Prédicats de sélection
! Exemples :
Toutes les places qui coûtent moins de 100 francs pour la
représentation N°7:
SELECT *
FROM Place
WHERE Prix <= 100 AND NumRep = 7;
Toutes les représentations du spectacle N°13 entre le 15 septembre
1999 et le 15 janvier 2000 ou entre le 15 septembre 2000 et le 15
janvier 2001:
SELECT *
FROM Représentation
WHERE DatRep BETWEEN ‘15-SEP-1999’ AND ‘15-JAN-2000’
OR DatRep BETWEEN ‘15-SEP-2000’ AND ‘15-JAN-2001’ ;
54
Jointure
Jointure:
Une jointure permet de sélectionner des données de plusieurs tables.
! Syntaxe :
SELECT [table1.]attribut [, table2.attribut, …]
FROM table1, table2 [, table3,…]
WHERE conditions ;
Il est nécessaire de préciser le nom de la table dans laquelle on
sélectionne un attribut si le même attribut est présent dans d’autres
tables participant à cette jointure.
55
Jointure
! Exemple : Toutes les représentations du spectacle “ Révisor ” entre
le 15 septembre 1999 et le 15 janvier 2000:
SELECT DatRep, HeurRep
FROM Représentation, Spectacle
WHERE DatRep BETWEEN (15-SEP-99( AND (15-JAN-2000(
AND NomSpec = (Révisor(
AND Spectacle.NumSpec = Représentation.NumSpec ;
! Remarque : on peut remplacer les noms des tables par les alias plus
courts :
SELECT DatRep, HeurRep
FROM Représentation R, Spectacle S
WHERE DatRep BETWEEN (15-SEP-99( AND (15-JAN-2000(
AND NomSpec = (Révisor(
AND S.NumSpec = R.NumSpec ;
56
Tri des données
Pour trier/ordonner les données résultant d’une requête on utilise la
clause ORDER BY.
! Syntaxe :
SELECT [DISTINCT] {*, attribut , … }
FROM table
[ WHERE conditions ]
[ ORDER BY { colonne, expr} [ASC | DESC] ];
où :
! ORDER BY précise que le résultat sera trié
! ASC ordre croissant (ordre par défaut)
! DESC ordre décroissant
57
Tri des données
! Exemple :
La date et l’heure de toutes les représentations du spectacle
“ Révisor ” qui sont programmées entre le 15 septembre 1999 et le 15
janvier 2000 :
SELECT DatRep, HeureRep
FROM Représentation, Spectacle
WHERE DatRep BETWEEN ‘15-SEP-99’ AND ‘15-JAN-2000’
AND NomSpec = ‘Révisor’
AND Spectacle.NumSpec = Représentation.NumSpec
ORDER BY DatRep ;
58
Groupement des données
Les fonctions d’agrégats sont :
!
!
!
!
!
AVG(expression) : moyenne des valeurs d’une colonne
SUM(expression) : somme des valeurs d’une colonne
MIN(expression) : la plus petite des valeurs d’une colonne
MAX(expression) : la plus grande des valeurs d’une colonne
COUNT(expression) : compte le nombre de valeurs
! Exemple :
La moyenne des prix des places de toutes les représentations
SELECT AVG(Prix)
FROM Place ;
59
Groupement des données
! Définition : On appelle groupe un ensemble de lignes, résultat
d’une requête, qui ont une valeur commune dans une ou plusieurs
colonnes.
La clause GROUP BY permet de diviser les données d’une table en
plusieurs groupes.
! Syntaxe :
SELECT attribut , fonction_d’agrégat(attribut)
FROM table [, table … ]
[ WHERE conditions ]
[ GROUP BY expr [, expr … ] ]
[ ORDER BY attribut ];
L’utilisation de la clause WHERE permet d’exclure certaines lignes du
résultat avant de les diviser en groupes.
60
Groupement des données
! Exemple :
La moyenne des prix des places pour chaque représentation :
SELECT AVG(Prix), NumRep
FROM Place
GROUP BY NumRep;
61
Groupement des données
Pour spécifier quels groupes doivent être sélectionnés dans le
résultat on utilise la clause HAVING.
! Syntaxe :
SELECT attribut, fonction_d’agrégat(attribut)
FROM table [, table … ]
[ WHERE conditions ]
[ GROUP BY expr [, expr … ] ]
[ HAVING condition_de_groupe ]
[ ORDER BY attribut ];
62
Groupement des données
Pour restreindre les groupes :
SQL> SELECT AVG(Prix), NumRep
2 FROM Place
3 WHERE AVG(Prix) < 200
4 GROUP BY NumRep ;
WHERE AVG(Prix) < 200
*
ERREUR à la ligne 3:
ORA-00934: group function is not allowed here
La requête précédente peut être réécrite de la manière suivante :
SELECT AVG(Prix), NumRep
FROM Place
GROUP BY NumRep
HAVING AVG(Prix) < 200;
63
Les sous-requêtes
L’expression d’une clause WHERE peut prendre la forme :
… WHERE attribut opérateur (SELECT …) ;
! Exemple :
Rechercher toutes les personnes ayant réservé une place pour la
dernière représentation de l’année 1999. Pour cela il est nécessaire
de connaître la date de la dernière représentation, ce qui peut être
exprimé par la requête suivante :
SELECT MAX(DatRep)
FROM Représentation
WHERE DatRep <= ’31-12-99’;
64
Les sous-requêtes
Voici la requête complète qui utilise la requête précédente comme une
sous-requête :
SELECT NomDem
FROM Réservation Rs, Représentation Rp
WHERE Rp.NumRep = Rs.NumRep
AND Rp.DatRep = ( SELECT MAX(DatRep)
FROM Représentation
WHERE DatRep<=’31-12-99’ );
Il existe plusieurs types de sous-requête :
! Sous-requête mono-ligne
! Sous-requête multi-ligne
! Sous-requête multi-colonne
65
Les sous-requêtes
Une sous-requête mono-ligne doit être utilisé avec les opérateurs de
comparaison tels que =, >, >=, <, <=, <>.
! Exemple : l’exemple précédent est une requête mono-ligne.
Une sous-requête multi-ligne doit être utilisée avec les opérateurs
pouvant traiter plusieurs lignes : IN, ALL, ANY :
! Opérateur IN : WHERE attribut IN (liste de valeurs)
! Opérateur ALL : WHERE attribut opér_compar ALL (liste de
valeurs)
! Opérateur ANY : WHERE attribut opér_compar ANY (liste de
valeurs)
66
Les sous-requêtes
! Exemple : Les personnes ayant réservé le plus de places :
SELECT NomDem
FROM Réservation
GROUP BY NomDem, TelDem
HAVING COUNT (NomDem) = ( SELECT MAX(COUNT(NomDem))
FROM Réservation
GROUP BY NomDem, TelDem
);
67
Les sous-requêtes
Une sous-requête multi-colonnes
doit utiliser l’opérateur IN
permettant de comparer les lignes colonne par colonne.
Exemple : Toutes les personnes ayant réservé des places, à la fois
pour la représentation N°1 et pour la représentation N°2.
SELECT DISTINCT NomDem, TelDem
FROM Réservation
WHERE NumRep = 1
AND (NomDem, TelDem) IN ( SELECT NomDem, TelDem
FROM Réservation
WHERE NumRep = 2
);
68
Les opérateurs UNION, INTERSECT, MINUS
Pour exprimer les opérateurs ensemblistes de l’algèbre relationnelle
tels que : UNION, INTERSECTION et DIFFERENCE le langage SQL
offre les opérateurs UNION , INTERSECT et MINUS.
! Syntaxe :
SELECT attribut,…
FROM table, …
[ WHERE condition ]
opérateur
SELECT attribut,…
FROM table, …
[ WHERE condition ]
69
Les opérateurs UNION, INTERSECT, MINUS
! Exemples :
Toutes les personnes ayant réservé des places à la fois pour la
représentation N°1 et la représentation N°2 peut être exprimée de la
façon suivante :
SELECT DISTINCT NomDem, TelDem
FROM Réservation
WHERE NumRep = 1
INTERSECT
SELECT DISTINCT NomDem, TelDem
FROM Réservation
WHERE NumRep = 2 ;
70
Manipulation des données
Le langage de manipulation de données permet de modifier le
contenu des objets de la base.
L’unité de manipulation est une ligne.
4 commandes SQL permettent la modification des données :
•
•
•
•
UPDATE : mise à jour de lignes
INSERT : ajout de lignes
DELETE : suppression des lignes sélectionnées
TRUNCATE : suppression de toutes les lignes d’une table
71
Modification des données - UPDATE
Permet de modifier les valeurs d’une ou plusieurs colonnes, dans une
ou plusieurs lignes existantes d’une table.
! Syntaxe :
UPDATE table
SET attribut1 = expr1 [, attribut2 = expr2]
[ WHERE condition] ;
! Exemple :
UPDATE Place
SET Prix = Prix + 100
WHERE NumPlace <= 25;
72
Insertion de lignes - INSERT
Permet d’ajouter une ligne dans une table en spécifiant les valeurs à
insérer.
! Syntaxe :
INSERT INTO table [(attribut1 [, attribut2 ])]
VALUES (valeur1 [, valeur2 ]) ;
! Exemple :
INSERT INTO Réservation (NumRes, NumRep, NumPlace, NomDem)
VALUES (23, 1, 126, (Smith() ;
Il est possible d’insérer dans une table des lignes provenant d’une
sous-requête :
INSERT INTO table [(attribut1 [, attribut2 ])]
SELECT …;
73
Suppression de lignes - DELETE
Permet de supprimer certaines lignes d’une table.
! Syntaxe :
DELETE FROM table
[ WHERE condition ]
! Exemple :
Supprimer toutes les réservation du demandeur Smith.
DELETE FROM Réservation
WHERE NomDem = (Smith( ;
74
Suppression de lignes - TRUNCATE
Permet de supprimer toutes les lignes d’une table.
! Syntaxe :
TRUNCATE TABLE table
[ DROP | REUSE STORAGE ]
où les options DROP STORAGE et REUSE STORAGE permettent de
gérer l’espace mémoire :
• DROP STORAGE – après la suppression les blocs mémoire libérés
sont réaffectés à la base
• REUSE STORAGE – conserve l’espace mémoire alloué à la table
75
Les Droits des Utilisateurs
Un utilisateur est défini par :
!
!
!
!
un nom d’utilisateur
un mot de passe
un ensemble de privilège
un profil
Un privilège est le droit attribué à un utilisateur d’exécuter certains
ordres SQL.
Exemple : CREATE SESSION, CREATE TABLE
Un utilisateur possède un certain nombre d’objets :
SELECT OBJECT_NAME, OBJECT_TYPE, CREATED FROM
user_objects;
76
Les Droits des Utilisateurs
Un utilisateur possède les droits de modifications et de suppression de
ses propres objets.
Un utilisateur ne peut accéder aux objets d’un autre utilisateur si le
propriétaire de ces objets ne lui a pas donné les droits correspondants.
SQL> SELECT * FROM scott.dept;
SELECT * FROM scott.dept
*
ERREUR à la ligne 1:
ORA-01031: insufficient privileges
77
Attribution des privilèges
GRANT privilège_objet
ON objet
TO utilisateur
[WITH GRANT OPTION] ;
78
Attribution des privilèges
! Exemple :
SQL> connect scott/tiger@oracle8
Connecté.
SQL> GRANT select , insert
2 ON dept
3 TO userA;
Autorisation de privilèges (GRANT) acceptée.
SQL> connect userA@oracle8;
Entrez mot de passe: *******
Connecté.
SQL> select * from scott.dept;
DEPTNO DNAME
LOC
---------- -------------- ------------10 ACCOUNTING NEW YORK
20 RESEARCH
DALLAS
30 SALES
CHICAGO
40 OPERATIONS BOSTON
79
Suppression des privilèges
REVOKE privilège_objet
ON objet
FROM utilisateur;
80
Gestion des transactions
Une transaction est une suite de commandes SQL qui doivent être
effectuées correctement et entièrement ou pas du tout.
A tout moment l’utilisateur a la possibilité soit de valider les
modifications soit de les annuler.
! Validation explicite d’une transaction : la commande COMMIT
! Validation implicite d’une transaction :
" A l’exécution de l’une des commandes du langage de définition de
données : CREATE, ALTER, DROP, TRUNCATE, RENAME…
" A l’arrêt normal d’une session (EXIT)
81
Gestion des transactions
! Annulation explicite d’une transaction : la commande ROLLBACK
! Annulation implicite d’une transaction :
" A l’arrêt anormal d’un session
" Dans la situation d’inter-blocage
82
Les points de reprise
Un utilisateur peut définir des points de reprise dans une transaction
pour permettre les rollback d’une partie de la transaction.
SQL> UPDATE…
SQL> SAVEPONT point1 ;
Savepoint created.
SQL> INSERT …
SQL> SAVEPOINT point2 ;
Savepoint created.
SQL> ROLLBACK TO point2 ;
Rollback complete.
83
Création et gestion des tables
Création d’une table – CREATE TABLE
! Syntaxe :
CREATE TABLE table
(colonne type [DEFAULT expr]
[,colonne type [DEFAULT expr])] ) ;
Où DEFAULT expr : la valeur par défaut de l’attribut.
! Exemple :
CREATE TABLE Spectacle
( NumSpec NUMBER,
NomSpec VARCHAR2(20),
DatDebSpec DATE,
DatFinSpec DATE DEFAULT (01-12-00() ;
84
Création et gestion des tables
Création d’une table avec insertion de données:
Se fait par l’utilisation d’une sous-requête
! Syntaxe :
CREATE TABLE table
(attribut [, attribut ])
AS sous-requête ;
! Exemple :
CREATE TABLE Stat ( Nom, NbRep)
AS SELECT NomDem, COUNT(NomDem)
FROM Reservation
GROUP BY NomDem, TelDem;
85
Création et gestion des tables
Modification d’une table – ALTER TABLE
ALTER TABLE table
ADD ( attribut type [DEFAULT expr ]
[ , attribut type ] ) ;
Ou
ALTER TABLE table
MODIFY ( attribut type [DEFAULT expr ]
[, attribut type ] ) ;
! Exemple :
ALTER TABLE Stat
MODIFY ( NombreRep NUMBER DEFAULT 0 ) ;
86
Création et gestion des tables
Suppression d’une table – DROP TABLE
! Syntaxe :
DROP TABLE table ;
Renommer une table – RENAME
! Syntaxe :
RENAME table1 TO table2;
87
Création et gestion des vues
Vue : table virtuelle dont le schéma et le contenu sont dérivés de la
base réelle par un ensemble de requêtes.
Utilisées pour :
! Restreindre les accès aux données
! Offrir plus de commodité aux utilisateurs en ne leur présentant que
le sous ensemble des données qu’ils ont à manipuler
Propriétés :
! Virtuelle
- elle n ’est pas stockée dans la base de données
- son schéma est catalogué (avec sa définition)
! Dynamique
- elle est « re-calculée » chaque fois que l’on s’en sert
88
Création et gestion des vues
! Syntaxe :
CREATE [ OR REPLACE ] [ FORCE | NOFORCE ] VIEW vue
(attribut [, attribut ] )
AS sous-requête
[ WITH CHECK OPTION ]
[ WITH READ ONLY ] ;
! OR REPLACE recrée la vue si elle existe déjà
! WITH CHECK OPTION précise que seules les lignes accessibles
dans la vue peuvent être insérées ou modifiées.
! WITH READ ONLY précise qu’aucune modification (INSERT,
UPDATE, …) ne peut être faite sur les lignes de la vue.
89
Création et gestion des vues
! Exemple :
SQL> CREATE VIEW Zone1
2 (NumRep, NumPlace, Prix )
3 AS SELECT *
4
FROM Place
5
WHERE Prix < 100
6 WITH CHECK OPTION ;
Vue créée.
SQL> INSERT INTO Zone1
2 VALUES (4, 300, 150) ;
INSERT INTO Zone1
*
ERREUR à la ligne 1:
ORA-01402: view WITH CHECK OPTION where-clause violation
Remarque : l’interrogation des vues est identique à l’interrogation des
tables.
90
Création et gestion des vues
Suppression d’une vues – DROP VIEW
! Syntaxe :
DROP VIEW vue ;
91
Dictionnaires de données
Tables dans lesquelles sont stockées les descriptions des objets
de la base
! Il est tenu à jour automatiquement par le SGBD
! Ces tables peuvent être consultées au moyen du langage SQL
92
Dictionnaires de données
! DICTIONARY (DICT) : vues du dictionnaire
! USER_TABLES : tables et vues crées par l'utilisateur
! USER_CATALOG (CAT) : tables et vues sur lesquels l'utilisateur
a des droits, à l'exclusion des tables et vues du dictionnaire des
données
! USER_TAB_COLUMNS (COLS) : colonnes des tables ou vues
créées par l'utilisateur
! USER_INDEXES (IND) : index créés par l'utilisateur ou indexant
des tables de l'utilisateur
! USER_TAB_PRIVS : objets sur lesquels l'utilisateur est donneur
ou receveur de droits
93
3 . Intégrité des données
94
Contrainte d ’Intégrité
! Définition : Une contrainte d’intégrité est une assertion qui doit
être vérifiée par des données à des instants déterminés.
! Définition : Une base de données cohérente est une base de
données dont l’ensemble des contraintes d’intégrité est respecté par
les données de la base.
Il existe deux types de contraintes d’intégrité :
! Contraintes structurelles
! Contraintes non structurelles
95
Contraintes Structurelles
Permettent d’exprimer certaines propriétés des relations et des
domaines des attributs.
On distingue les contraintes structurelles suivantes :
! Unicité de clé :
Par exemple, la table Place possède une clé multiple
(NumRep, NumPlace)
! Contrainte référentielle :
Par exemple, toute valeur de l’attribut NumRep dans la
table Place doit être présente comme valeur de l’attribut
NumRep de la table Représentation, dont il est la clé.
96
Contraintes Structurelles
! Contrainte de domaine :
Par exemple, le numéro de place NumPlace dans la table Place
doit être compris entre 1 et 340.
! Contrainte de non nullité :
Par exemple la valeur de NumRep dans la table Représentation
ne pourra pas être nulle.
97
Contraintes non Structurelles
Permettent d’exprimer les règles d’évolution des données suite aux
mises à jour.
Parmi les contraintes non structurelles les contraintes suivantes sont
les plus utilisées :
! Les dépendances fonctionnelles. Par exemple, dans la table Place
le numéro de représentation et le numéro de place déterminent le prix
de la place :
NumRep, NumPlace ) Prix
! Les dépendances multivaluées.
98
Expression des contraintes en SQL
Le langage SQL permet la création de contraintes lors de la création
des tables par la commande CREATE TABLE.
! Syntaxe :
CREATE TABLE table
(attribut type [DEFAULT expr][contrainte_sur_attribut]
,…
[ contrainte_sur_table ]);
Où la contrainte_sur_attribut est une des contraintes suivantes :
!
!
!
!
!
NOT NULL
UNIQUE
PRIMARY KEY
REFERENCES table (attribut)
CHECK condition
99
Expression des contraintes en SQL
Et la contrainte_sur_table est une des contraintes suivantes :
!
!
!
!
!
UNIQUE (attribut, …)
PRIMARY KEY (attribut, …)
FOREIGN KEY (attribut, …)
REFERENCES table (attribut)
CHECK condition
100
Expression des contraintes en SQL
! Exemples :
SQL> CREATE table Spectacle
2 (NumSpec NUMBER(4),
3 NomSpec VARCHAR2(20),
4 DatDebSpec DATE,
5 DatFinSpec DATE,
6 CONSTRAINT NumSpec_pk PRIMARY KEY (NumSpec),
7 CONSTRAINT NomSpec_u UNIQUE (NomSpec));
Table créée.
101
Expression des contraintes en SQL
SQL> INSERT INTO Spectacle(NomSpec, DatDebSpec,DatFinSpec)
2 VALUES ('aaa', '01-08-99', '01-08-09');
INSERT INTO Spectacle(NomSpec, DatDebSpec, DatFinSpec)
*
ERREUR à la ligne 1:
ORA-01400: cannot insert NULL into
("USER"."SPECTACLE"."NUMSPEC")
SQL> INSERT INTO Spectacle
2 VALUES (100, 'aaa' , '01-08-99', '01-08-09');
1 ligne créée.
102
Expression des contraintes en SQL
SQL> INSERT INTO Spectacle
2 VALUES (200, 'aaa' , '01-08-99', '01-08-09');
INSERT INTO Spectacle
*
ERREUR à la ligne 1:
ORA-00001: unique constraint (USER.NOMSPEC_U) violated
103
Expression des contraintes en SQL
SQL> CREATE TABLE Représentation
2 (NumRep NUMBER(4),
3 NumSpec NUMBER(4),
4 DatRep DATE,
5 HeureRep VARCHAR2(10),
6 CONSTRAINT NumRep_pk PRIMARY KEY (NumRep),
7 CONSTRAINT NumSpec_fk FOREIGN KEY (NumSpec)
8 REFERENCES Spectacle (NumSpec));
Table créée.
104
Expression des contraintes en SQL
SQL> INSERT INTO Représentation
2
VALUES (13, 300, '01-08-99', '20-00') ;
INSERT INTO Représentation
*
ERREUR à la ligne 1:
ORA-02291: integrity constraint (USER.NUMSPEC_FK) violated - parent
key not found
105
Modification et ajout des contraintes
ALTER TABLE table
ADD [ CONSTRAINT contrainte ] type ( attribut );
ALTER TABLE table
DROP CONSTRAINT contrainte [CASCADE];
ALTER TABLE table
DISABLE CONSTRAINT contrainte [CASCADE] ;
ALTER TABLE table
ENABLE CONSTRAINT contrainte ;
106
Ajout et suppression des contraintes
SQL> alter table place
2 add constraint c_prix check (prix >100);
ICI
Instruction traitée
SQL> insert into place
2 values (1, 2, 60);
ORA-02290: violation de contraintes (USER.C_PRIX) de vérification
SQL> alter table place
2 drop constraint c_prix ;
Instruction traitée
107
Ajout et suppression des contraintes
SQL> insert into place
2 values (1, 2, 60);
1 ligne traitée
SQL> alter table place
2 add constraint c_prix check (prix >100);
add constraint c_prix check (prix >100)
*
ORA-02293: impossible ajouter contrainte de vérification [USER.C_PRIX] valeurs non conf. trouvées
108
Inconsistances
Exemple : Soit deux données A et B devant rester égales.
Transaction T1
Transaction T2
A = A*2
A = A+1
B = B+1
B = B*2
temps
A la fin des deux transactions la contrainte A = B n ’est plus vérifiée.
109
Inconsistances
Dans le deuxième exemple une perte de mise à jour survient
lorsqu’une transaction T1 exécute une mise à jour calculée à partir
d’une valeur périmée de données :
Transaction T1
Transaction T2
Lecture A ) a
Lecture A ) b
b=b+1
Ecriture b ) A
a=a*2
Ecriture b ) A
temps
110
Inconsistances
Pour éviter ces inconsistances le SGBD doit contrôler l’accès aux
données.
La technique la plus utilisée pour éviter les conflits d’accès aux
données est la technique de prévention des conflits basée sur le
verrouillage.
111
Mécanismes de verrouillage
Généralités
Le SGBD ORACLE offre deux types de verrouillages :
! Verrouillage au niveau de la ligne :
Lorsqu’une transaction modifie une table , seules les
lignes à modifier sont verrouillées.
! Verrouillage au niveau de la table :
Lorsqu’une transaction modifie une table , toutes les
lignes de la table sont verrouillées.
112
Mécanismes de verrouillage
Le verrouillage peut être :
! Implicite : géré automatiquement par le SGBD
! Explicite : géré explicitement dans la transaction
113
Mécanismes de verrouillage
Les verrous sur les données protègent les données des utilisateurs.
Il existe plusieurs types de verrous de données :
! Verrou exclusif sur la table (X) :
Posé explicitement par la commande : LOCK TABLE table IN
EXCLUSIVE MODE
Ce verrou réserve toutes les lignes de la table à condition qu’aucun
verrou ne soit déjà posé sur la table ou sur une des lignes. Seul
l’utilisateur courant peut modifier le contenu de la table. Les autres
transactions peuvent consulter les données de la table mais ne
peuvent ni les modifier ni poser de verrous sur la table ou sur les
lignes.
114
Mécanismes de verrouillage
! Verrou partagé sur la table (S) :
Posé explicitement par la commande : LOCK TABLE table IN
SHARE MODE
L’utilisateur qui a posé le verrou peut consulter et modifier la table
si aucun autre verrou n’a été posé. Les autres transactions
peuvent consulter les données et poser différents verrous
partagés sur la table (S, RS). Si plusieurs transactions verrouillent
une table en mode S, aucune d’entre elles ne peut effectuer une
mise à jour sur les données de la table.
115
Mécanismes de verrouillage
! Verrou exclusif des lignes (RX) :
Peut être posé explicitement par la commande LOCK TABLE
table IN ROW EXCLUSIVE MODE ou implicitement par Oracle
lors d’un UPDATE, INSERT ou DELETE.
116
Mécanismes de verrouillage
! Verrou partagé des lignes (RS) :
Peut être posé explicitement par la commande LOCK TABLE
table IN ROW SHARE MODE ou implicitement par Oracle lors
d’un SELECT … FOR UPDATE
Il signale l’intention de mettre à jour un sous-ensemble de lignes
de la table.
Remarque :
La vue V$LOCK du dictionnaire de données renseigne sur les verrous
actifs de la base.
117
Mécanismes de verrouillage
Exemple de verrouillage implicite
UPDATE Représentation
SET DatRep =’01-02-99’
WHERE NumSpec =13 ;
> 2 ligne(s) mise(s) à jour
(verrouille les lignes du
spectacle N°13)
commit ;
SELECT NumRep,
DatRep
FROM Représentation ;
NumRep
DatRep
13
01/02/99
SELECT NumRep,
DatRep
UPDATE Représentation
SET DatRep =’01-02-00’
WHERE NumSpec = 13 ;
(attente)
> 2 ligne(s) mise(s) à jour
commit ;
FROM Représentation ;
NumRep
DatRep
13
01/02/00
118
Mécanismes de verrouillage
Les inter-blocages (“ deadlock ”)
L’inter-blocage se produit lorsqu’un utilisateur attend une
ressource prise par un autre utilisateur et que cet autre utilisateur
attend une ressource prise par le premier. La situation est alors
bloquée.
Exemple :
La transaction T1 modifie la date des spectacles numéro 13 et 17.
La transaction T2 modifie l’heure de ces spectacles de la manière
suivante :
119
Mécanismes de verrouillage
Les inter-blocages (“ deadlock ”)
UPDATE Représentation
SET DatRep =’01-02-99’
WHERE NumSpec =13 ;
(verrouille les lignes du
spectacle N°13)
UPDATE Représentation
SET DatRep =’01-02-99’
WHERE NumSpec =17 ;
(attente)
UPDATE Représentation
SET HeurRep = ‘20-00’
WHERE NumSpec = 17
(verrouille les lignes du spectacle N°17)
UPDATE Représentation
SET HeurRep = ‘20-00’
WHERE NumSpec =13 ;
(attente)
120
Mécanismes de verrouillage
Résolution du problème par ORACLE :
Annulation automatique par ROLLBACK implicite de la transaction la
plus récente.
Comment éviter les inter-blockages :
! L’inter-blocage ne serait pas survenu si les deux transactions
cherchaient à accéder à la table dans le même ordre.
! Il faut donc toujours accéder aux tables dans le même ordre.
! Tout morceau de traitement identique doit être centralisé dans un
sous-programme.
! Il faut éviter les transactions trop longues.
121
4 . PL/SQL
122
Environnement PL/SQL
SQL
Application
SQL
SGBD
SQL
SQL
SQL
IF . . . THEN
SQL
ELSE
SQL
END IF ;
SQL
Application
Oracle
PL/SQL
123
Environnement PL/SQL
PL/SQL est un langage procédural qui permet
! la déclaration des variables
! les traitements : ordres SQL, boucles, gestion des curseurs
! la gestion des erreurs
124
Bénéfices de PL/SQL
! PL/SQL regroupe les requêtes SQL en un seul bloc qui est envoyé
au serveur en un seul appel
! PL/SQL améliore les performances (moins de communications à
travers le réseau)
! C’est un langage portable : il peut fonctionner sur toute plate-forme
supportant Oracle Server
! PL/SQL peut aussi coopérer avec les différents outils de
développement d’application de Oracle Server (p.ex. Developer 2000)
! Permet de créer des bibliothèques de code réutilisable
125
Environnement PL/SQL
Blocks
Anonymes
Triggers
d’application
DECLARE
BEGIN
Procédures
enregitrées
Procédures
d’application
EXCEPTION
Triggers
de base de données
END;
Packages
Développement de programmes MO-DU-LAIRE
126
Environnement PL/SQL
! Blocs anonymes : utilisés dans SQL*PLUS, les triggers, les
programmes précompilés
! Procédure enregistrée : block nommé et enregistré dans le serveur
Oracle et qui peut être invoqué par son nom
! Procédure d’application : block nommé et enregistré dans une
application Developper 2000 ou dans une librairie partagée
! Package : module PL/SQL qui regroupe un ensemble de procédures
127
Environnement PL/SQL
! Fonctions : blocs PL/SQL nommés et stockés, qui peuvent recevoir
des paramètres et qui peuvent être appelés comme les procédures
mais qui renvoient un résultat
! Trigger base de donnée : block associé à une table et déclenché
automatiquement lors d’une requête
! Trigger d’application : block PL/SQL associé à un événement
d’application
128
Caractéristiques de PL/SQL
Tout bloc PL/SQL est composé de 3 sections
1
DECLARE (optionel)
• variables, constantes, curseurs
2
BEGIN
(obligatoire)
• clauses SQL
• clauses PL/SQL
3
EXCEPTION (optionel)
• Actions à réaliser quand une exception est levée ou
quand une terminaison anormale a lieu
END;
(obligatoire)
DECLARE
BEGIN
EXCEPTION
END;
129
Les blocs PL/SQL
DECLARE
variable_v
VARCHAR2(5)
BEGIN
SELECT
colonne_c
INTO variable_v
FROM table_t ;
EXCEPTION
WHEN exception_e THEN
...
END;
DECLARE
BEGIN
EXCEPTION
END;
130
Les différents types de blocs
Anonyme
Procédure
[DECLARE]
PROCEDURE <nom>
IS
BEGIN
...
BEGIN
...
[EXCEPTION]
...
END;
[EXCEPTION]
...
END;
Fonction
FUNCTION <nom>
RETURN <type>
IS
BEGIN
...
RETURN <valeur> ;
[EXCEPTION]
...
END;
Commentaires :
-- commentaires sur une ligne
/* commentaires sur
plusieurs lignes */
131
Les Caractéristiques de PL/SQL
!
–
–
!
–
–
!
–
–
–
–
!
–
–
–
Gestion des variables
variables locales
variables d’environnement extérieures à PL/SQL
Structures de contrôle
traitements conditionnels
traitements répétitifs
Utilisation des curseurs
définition
utilisation de curseurs explicites
attributs des curseurs
modification des valeurs d’un curseur
Gestion des erreurs
anomalies programme utilisateur
erreurs Oracle
erreurs prédéfinies
132
Les variables et constantes
Utiliser les variables pour :
# L’enregistrement temporaire des données comme dans tout
langage de programmation procédural
# La manipulation de données enregistrées afin de réaliser des
calculs et autres manipulations sans accéder à la base de données
# La réutilisabilité : une fois déclarée, une variable peut être utilisée
plusieurs fois dans une application
# La facilité de maintenance : en utilisant %TYPE et %ROWTYPE
(voir plus tard), on déclare des variables ayant le même type que des
attributs de tables; si la définition de la table change, le type de la
variable change de même.
=> réduction des coûts de maintenance
133
Les variables et constantes
Syntaxe :
<nom> [CONSTANT] <type> [NOT NULL]
[ := | DEFAULT <expression> ] ;
Exemple :
DECLARE
dateEmprunt_v
noDept
_v
lieu_v
taux_c
DATE ;
NUMBER(2) NOT NULL := 10 ;
VARCHAR2(13) := ‘Paris’ ;
CONSTANT NUMBER := 20 ;
Note : constantes et variables NOT NULL doivent être
immédiatement affectées
134
Conventions
# Déclarer au plus une variable par ligne
# Les noms de variables doivent :
– commencer par une lettre
– être composé d’au plus 30 caractères (lettres, nombres ou
caractères spéciaux)
# Deux variables peuvent avoir le même nom dès lors qu’elles
appartiennent à des blocs différents
# Ne pas utiliser le noms de tables ni les noms d’attributs
# Utiliser les suffixes :
‘_c’ pour les constantes
‘_v’ pour les variables
‘_g’ pour les variables globales
135
Types définis par l’utilisateur
#
Syntaxe :
TYPE <nom_type> IS RECORD (
<nomchamps> <type> [ [NOT NULL]
[ := | DEFAULT <expression> ],
...);
#
Exemple :
SQL>
DECLARE
TYPE client_t IS RECORD (
numero NUMBER(4),
nom
CHAR(20),
adresse
CHAR(20) ) ;
client1_v client_t ;
BEGIN
client1_v.numero := 2516 ;
END ;
/
136
L’attribut %TYPE
#
A employer pour déclarer une variable en réutilisant :
– la définition d’un attribut de table
– la définition d’une autre variable déclarée précédemment
#
Exemple :
...
nomEmploye_v employe.nomEmp%TYPE ;
solde_v
NUMBER(7, 2) ;
soldeMinimal_v solde_v%TYPE := -2000 ;
#
Note :
– %ROWTYPE : idem que %TYPE mais pour définir une
variable de type enregistrement dont les champs
correspondent à tous les attributs d’une table
– les contraintes NOT NULL de la définition des attributs de
tables ne sont pas réutilisées avec %TYPE
137
Variables liées
#
Variables définies en dehors de blocs PL/SQL, dans
l’environnement (SQL*Plus, Developper 2000, programme
externe, package)
#
Syntaxe :
VARIABLE <nom> [CONSTANT] <type>
[ := | DEFAULT <expression> ] ;
#
[NOT NULL]
Exemple :
SQL> VARIABLE n NUMBER ;
...
SQL> PRINT n ;
#
Note : ces variables sont précédées de ‘:’ dans PL/SQL
138
Structures de contrôle
! Branchements conditionnels
– IF - THEN - END IF
– IF - THEN - ELSE - END IF
– IF - THEN - ELSIF - END IF
! Boucles
– LOOP - END LOOP
– WHILE - END LOOP
– FOR - END LOOP
! Note : la commande EXIT permet de sortir de tout type de
boucles
139
Structures de contrôle – branchement conditionnel
Branchement conditionnel :
! Syntaxe :
IF condition THEN traitement;
{ ELSEIF condition THEN traitement; }
[ ELSE traitement; ]
END IF;
! opérateurs utilisés dans les conditions : =, <, >, !=, <=, >=, IS NULL,
IS NOT NULL, BETWEEN, LIKE, AND, OR, …
140
Structures de contrôle - boucles LOOP
Structure répétitive : LOOP
! Syntaxe :
LOOP [ << libellé>>]
[commandes;]
[ EXIT [libellé ] WHEN condition ]
[commandes;]
END LOOP [libellé];
! Note :
Sans commande EXIT, les boucles LOOP sont infinies
141
Structures de contrôle - boucles LOOP
! Exemple :
DECLARE
fact NUMBER := 1;
i
NUMBER := 1;
BEGIN
LOOP
fact := fact * i;
i := i+1;
EXIT WHEN i = 10;
END LOOP;
INSERT INTO resultat
VALUES (('fact(9) = ', fact);
END ;
142
Structures de contrôle - boucles WHILE
Structure répétitive : WHILE
! Syntaxe :
[<< libellé>>]
WHILE condition
LOOP
commandes;
END LOOP [libellé];
143
Structures de contrôle - boucles WHILE
! !! Exemple :
DECLARE
fact NUMBER := 1;
i
NUMBER := 1;
BEGIN
WILE i <=9
LOOP
fact := fact * i;
i := i+1;
END LOOP;
INSERT INTO resultat
VALUES (('fact(9) = ', fact);
END ;
144
Structures de contrôle - boucles FOR
Structure répétitive : FOR
! Syntaxe :
[<< libellé>>]
FOR identificateur IN [REVERSE] exp1 ..exp2
LOOP
commandes;
END LOOP [libellé];
L'identificateur est déclaré implicitement
145
Structures de contrôle - boucles FOR
! !!Exemple :
DECLARE
fact NUMBER := 1;
BEGIN
FOR i IN 1..9
LOOP
fact := fact * i;
END LOOP;
INSERT INTO resultat
VALUES (('fact(9) = ', fact);
END ;
146
Structures de contrôle
! Ne pas modifier le compteur d’une boucle FOR
! Les boucles peuvent être imbriquées
! On peut nommer les boucles pour identifier explicitement laquelle
de deux boucles imbriquées se terminent
...
<<boucleExterne>>
LOOP
...
EXIT WHEN compteur_v = 10 ;
<<boucleInterne>>
LOOP
EXIT boulceExterne WHEN compteur_v = 100 ;
EXIT boulceExterne WHEN drapeau_v = TRUE ;
END LOOP boucleInterne ;
END LOOP boucleExterne ;
...
147
Commandes SQL intégrées à PL/SQL
SELECT :
SELECT attribut, …
INTO liste de variables locales ou externes
FROM table
[WHERE condition]
Une telle requête SQL doit ramener obligatoirement une ligne et
une seule.
Si ce n’est pas le cas, les exceptions NO_DATA_FOUND ou
TOO_MANY_ROWS sont levées.
148
Modifier des données dans PL/SQL
!
Trois commandes du langage de manipulation de données
(LMD) de SQL permettent de modifier une base de données :
– INSERT
– UPDATE
– DELETE
149
Modifier des données dans PL/SQL (INSERT)
BEGIN
INSERT
INTO Employe (noEmp, nomEmp, job, noDept)
VALUES (10, ‘Oracle’, ‘PROGRAMMEUR’, 10) ;
END ;
!
Note :
– on peut évidemment utiliser des variables au lieu de simples
valeurs prédéfinies
– il peut être utile d’utiliser des variables globales prédéfinies
comme USER ou SYSDATE
150
Modifier des données dans PL/SQL (UPDATE)
DECLARE
majorationSalaire_v Employe.salaire%TYPE := 2000;
BEGIN
UPDATE Employe
SET
salaire = salaire + majorationSalaire_v
WHERE job = ‘PROGRAMMEUR’ ;
END ;
!
Note :
– contrairement aux affectations PL/SQL, la clause update
utilise le signe ‘=‘ comme opérateur d’affectation
– si une variable a le même nom qu’un nom d’attribut de la
table manipulée dans la clause WHERE, le serveur Oracle
utilise en priorité l’attribut de table
151
Modifier des données dans PL/SQL (DELETE)
DECLARE
noDept_v Employe.noDept%TYPE := 10 ;
BEGIN
DELETE FROM Employe
WHERE noDept = noDept_v ;
END ;
152
Contrôler les transactions dans PL/SQL
!
!
!
!
La première commande INSERT/UPDATE/DELETE d’un block
entame une nouvelle transaction
La fin du block termine la transaction
Pour terminer explicitement une transaction, utiliser les
commandes SQL :
– COMMIT
=> valide les modifications faites depuis le début de la
transaction en cours, et entame une nouvelle transaction
– ROLLBACK
=> annule toutes les modifications faites depuis le début de
la transaction en cours , et entame une nouvelle transaction
Note :
Une transaction doit être un ensemble homogène de
manipulations de la base de données => il faut réfléchir à tous
les endroits où il est légitime de mettre un COMMIT
153
Contrôler les transactions dans PL/SQL
DECLARE
noDept_v Employe.noDept%TYPE := 10 ;
majorationSalaire_v Employe.salaire%TYPE := 2000;
BEGIN
DELETE FROM Employe
WHERE noDept = noDept_v ;
COMMIT ;
UPDATE Employe
SET
salaire = salaire + majorationSalaire_v
WHERE job = ‘PROGRAMMEUR’ ;
END ;
154
Déterminer le résultat d’une requête SELECT dans PL/SQL
!
Nécessite l’utilisation de curseurs
les curseurs sont des zones de travail privées; ce sont des
zones mémoire utilisées pour analyser et interpréter tout ordre
SQL.
!
Il y a deux types de curseurs :
– les curseurs implicites
le serveur Oracle utilise des curseurs implicites pour
exécuter vos requêtes SQL
– les curseurs explicites
sont des variables explicitement déclarées par le
programmeur
155
Déterminer le résultat d’une requête dans PL/SQL
!
Attributs des curseurs
en utilisant les attributs de curseurs, vous pouvez tester le résultat
de vos requêtes SQL
– SQL%ROWCOUNT
nombre de tuples affectés par la dernière requête SQL (entier)
– SQL%FOUND
booléen, vaut TRUE si la dernière requête SQL a affecté plus
d’un tuple
– SQL%NOTFOUND
booléen, vaut TRUE si la dernière requête SQL n’a affecté
aucun tuple
– SQL%ISOPEN
booléen indiquant si le curseur est ouvert ou fermé (par défaut
,les curseurs implicites sont toujours fermés à la fin de la
requête)
!
Note :
à la place de ‘SQL’, utilisez le nom de votre curseur pour identifier
l’état d’un curseur explicite
156
Gestion des curseurs
Gestion des curseurs explicites:
! Déclaration : dans la section DECLARE
CURSOR nom_curseur IS ordre_select;
! Ouverture : dans la section BEGIN .. END
OPEN nom_curseur;
! Assignation des valeurs d'une ligne aux variables réceptrices ou à la
structure (souvent dans une boucle)
FETCH nom_curseur INTO liste_variables /structure;
! Fermeture et libération de la place mémoire:
CLOSE nom_curseur;
157
Gestion des curseurs
DECLARE
CURCOR c_vendeur IS SELECT empno, salaire
FROM employes
WHERE fonction = 'vendeur';
v_empno employes.empno%TYPE;
v_salaire NUMBER;
BEGIN
OPEN c_vendeur;
LOOP
FETCH c_vendeur INTO v_nom, v_salaire;
EXIT WHEN c_vendeur%NOTFOUND;
1.2;
IF v_salaire < 10000 THEN v_salaire := v_salaire *
END IF;
UPDATE employes SET salaire = v_salair
WHERE empno = v_empno;
END LOOP;
CLOSE c_vendeur;
END;
158
Gestion des exceptions
! La gestion des exceptions permet d'affecter un traitement approprié
aux erreurs survenues lors de l'exécution d'un bloc PL/SQL.
! Il existe deux types d'erreurs :
- erreur interne d'Oracle
- erreur de programme utilisateur
! Les exceptions sont traitées dans une section particulière
– permet de ne pas avoir à vérifier les erreurs à chaque instant
– sépare le traitement normal du traitement associé aux situations
d’erreur
159
Gestion des exceptions
! Les exceptions peuvent être levées de deux manières :
– quand une erreur Oracle a lieu; les exceptions levées par Oracle
ont toutes un numéro prédéfini et un message d’exception associé
– quand le programmeur le demande explicitement (par exemple
parce qu’il prévoit un problème de validité des données que son
programme doit traiter)
! Lorsqu’un exception est levée :
– le bloc PL/SQL est automatiquement terminé
– les instructions de traitement d’exception associées au bloc sont
exécutées
160
Pour lever explicitement une exception
!
Déclarer l’ exception :
<nom de l’exception> EXCEPTION ;
!
Associer à l’exception un numéro d’exception (au niveau des
déclarations)
PRAGMA EXCEPTION_INIT (<nom de l’exception>,< numéro>) ;
!
Pour lever explicitement l’exception :
RAISE <nom de l’exception> ;
!
Note :
– les numéros d’exception allant de 0 à -20000 sont réservés
– utiliser les numéros allant de -20000 à -20999
– le traitement des exceptions définies par l’utilisateur et des
exceptions prédéfinies dans Oracle se fait de la même manière
161
Comment traiter les exceptions
!
DECLARE
BEGIN
EXCEPTION
END ;
Syntaxe :
EXCEPTION
WHEN <exception 1> [OR <exception 2> . . . ] THEN
<instructions>
...
WHEN <exception 3> [OR <exception 4> . . . ] THEN
<instructions>
...
WHEN OTHERS THEN
<instructions>
END ;
!
Note :
– un seul traitement d’exception est réalisé
avant la sortie du block
– utiliser systématiquement WHEN OTHERS
162
Définir, lever et traiter une exception - Exemple
DECLARE
erreurDonnees_v EXCEPTION ;
PRAGMA EXCEPTION_INIT (erreurDonnees_v, -2292) ;
BEGIN
...
IF (noDept_v > 10) THEN
RAISE erreurDonnees_v ;
END IF;
...
EXCEPTION
WHEN erreurDonnees_v THEN
...
END ;
163
Propagation des exceptions
!
Si une exception qui est levée peut être traitée par le bloc
courant, le bloc se termine de manière normale
!
Si ce n’est pas le cas, PL/SQL essaye de la traiter au niveau
supérieur
– fonction appelante
– procédure appelante
– bloc externe dans lequel le bloc au niveau duquel
l’exception levée est imbriqué
– environnement Oracle à partir duquel le bloc est exécuté :
SQL*Plus, Procedure Builder, Developer 2000
164
Exceptions prédéfinies
!
!
!
Récupérer le code numérique de l’exception qui vient d’être
levée :
SQLCODE
Récupérer le message correspondant à l’exception qui vient
d’être levée :
SQLERRM
Exemple :
BEGIN
dbms_output.enable ;
...
EXCEPTION
WHEN OTHERS THEN
dbms_output.put_line (‘code ’ || TO_CHAR(SQLCODE)) ;
dbms_output.put_line (SQLERRM) ;
END ;
165
Exceptions prédéfinies
#
Exemples :
– ZERO_DIVIDE
– INVALID_CURSOR
– NO_DATA_FOUND
– TOO_MANY_ROWS
– CURSOR_ALREADY_OPEN
– VALUE_ERROR
– LOGIN_DENIED
– INVALID_NUMBER (conversion vers numérique invalide)
– VALUE_ERROR (conversion ou troncature de numérique
invalide)
– ZERO_DIVIDE
#
Voir la liste complète des exceptions prédéfinies dans :
PL/SQL User’s Guide and Reference, Release 8. ‘‘Error
Handling’’
166
Envoi de messages d’erreur
!
Pour produire interactivement des messages d’erreur au niveau
applicatif
!
Syntaxe :
RAISE_APPLICATION_ERROR (<numéro>, <message>)
!
Exemple :
DECLARE
erreurDonnees_v EXCEPTION ;
BEGIN
...
EXCEPTION
WHEN erreurDonnees_v THEN
RAISE_APPLICATION_ERROR (-20000, ‘Données non
valides’);
END ;
167
Procédures
Création d'une procédure :
CREATE [OR REPLACE ] PROCEDURE nom_procedure
[ argument [mode] type,…]
[ IS | AS ] bloc PL/SQL
Où
• argument : nom du paramètre formel
• mode : définit si le paramètre formel est en
entrée : IN
sortie : OUT
en entrée et en sortie : IN OUT
168
Fonction
Création d'une fonction :
CREATE [OR REPLACE ] FONCTION nom_fonction
[ argument [ IN ] type, …]]
RETURN type_retour
[ IS | AS ] bloc PL/SQL
Où
• argument : nom du paramètre formel
• RETURN : définit le type de la valeur retournée par la fonction
169
Trigger
Création d'un trigger (déclencheur):
CREATE [OR REPLACE ] TRIGGER nom_trigger
séquence
événement [OR événement]
ON nom_table
[REFERNCING {[OLD [AS] ancien] | [NEW [AS] nouveau]}]
FOR EACH ROW
[WHEN condition]
bloc PL/SQL
170
Trigger
! Exemple
CREATE OR REPLACE TRIGGER maintientDuStock
AFTER INSERT OR UPDATE ON Stock
FOR EACH ROW
WHEN (:new.quantiteDispo < 10 OR :new.quantiteDispo IS NULL)
BEGIN
INSERT INTO Commandes (N°Produit, quantiteCommandee)
VALUES (:new.N°Produit, 200) ;
END ;
171
Trigger de niveau instruction / ligne
! Un trigger de niveau instruction :
– n’inclut pas la clause FOR EACH ROW dans l’instruction CREATE
TRIGGER
– ne s’exécute qu’une fois pour un événement particulier
– ne peut accéder aux valeurs des lignes qui pourraient être modifiées
par l’événement déclenchant
– est adapté pour retrouver l’auteur ou la date de l’événement
déclenchant
! Un trigger de niveau ligne :
– doit inclure la clause FOR EACH ROW dans l’instruction CREATE
TRIGGER
– est déclenché pour chaque ligne modifiée par l’événement
déclenchant
– peut accéder aux anciennes et aux nouvelles valeurs modifiées par
cet événement
– est adapté pour mettre en application les règles de gestion et de
sécurité
172
Référence aux colonnes de
la table sur laquelle porte le déclencheur
!
Dans le code associé aux triggers de niveau ligne, on veut
accéder aux valeurs des attributs de la ligne modifiée
=> utilisation de deux variables :
– :old
– :new
!
Pour un trigger sur INSERT
– les nouvelles valeurs sont dans :new.<nom d’attribut>
!
Pour un trigger sur UPDATE
– les anciennes valeurs sont dans :old.<nom d’attribut>
– les nouvelles valeurs sont dans :new.<nom d’attribut>
!
Pour un trigger sur DELETE
– les anciennes valeurs sont dans :old.<nom d’attribut>
173
Triggers BEFORE et AFTER
!
Un trigger BEFORE de niveau ligne :
– est exécuté avant que l’événement déclenchant n’ait lieu
– peut affecter les valeurs de la ligne insérée ou modifiée
!
Un trigger AFTER de niveau ligne :
– est exécuté après que l’événement déclenchant ait lieu
– ne peut pas affecter les valeurs de la ligne insérée ou
modifiée
!
Six triggers :
– BEFORE INSERT, BEFORE UPATE, BEFORE DELETE
– AFTER INSERT, AFTER UPDATE, AFTER DELETE
174
Activation / désactivation / suppression
des triggers
!
Désactivation de trigger - Syntaxe :
ALTER TRIGGER <nom du déclencheur> DISABLE ;
!
Activation de trigger - Syntaxe :
ALTER TRIGGER <nom du déclencheur> ENABLE ;
!
Suppression de trigger - Syntaxe :
DROP TRIGGER <nom du déclencheur> ;
175
Quelques remarques sur les triggers
!
Triggers en cascade : un trigger réalisant de INSERT, UPDATE ou
DELETE peut générer des événements amenant à l’exécution d’un
ou plusieurs autres triggers, et ainsi de suite; on parle alors de
triggers en cascade. Evitez plus de deux niveau de cascade.
!
Mutation : tant que les modifications (INSERT, UPDATE ou
DELETE) d’une table ne sont pas validées par un COMMIT, celleci est dite en cours de mutation. Un trigger de niveau ligne ne peut
lire ou modifier une table en cours de mutation (car elle est
instable).
!
Validation : un trigger ne peut ni exécuter d’instruction COMMIT ou
ROLLBACK, ni appeler de fonction, procédure ou sousprogramme de package invoquant ces instructions.
176