Cours 1 BD Avancees
Cours 1 BD Avancees
AVANCÉES
LGI3
2021-2022
Pr Cheikhou THIAM
cthiam@[Link]
2
ITION
Base de données (BD) : Collection de données
cohérentes et structurées
≠
B a s e de données
Fichiers
3
3
Bases de données avancées
ORGANISATION EN FICHIERS
Fichier
État de
Saisie Traitement sortie
4
4
Bases de données avancées
ON EN B D
Saisie
B as e
+ de Traitements
données
Contrôles
États de
sortie
5
5
Bases de données avancées
BD
Uniformisation de la saisie
6
6
Bases de données avancées
QU’UN S GBD ?
Exemples
– S G B D « bureautiques » : Access, Base, Filemaker, Paradox
– S G B D serveurs : Oracle, DB2, SQL Server, PostgreSQL,
MySQL, M a r i a D B …
7
7
Bases de données avancées
BD
Problém a - Indépendant d’un système
tique
de gestion de B D (SGBD)
Cahier des charges
S pécifica-
tions
Rédaction
Modèle Spécifique
conceptuel
Analyse Famille de S G B D
M odèle
log ique
Traduction S G B D particulier
Modèle
phys ique
Traduction
8
8
Bases de données avancées
COURS
9
9
Bases de données avancées
PARTIE 1
MODÉLISATION
CONCEPTUELLE
10
MODÈLE CONCEPTUEL UML
Diagramme de classes
11
[Link] 11
Bases de données avancées
CLASSES ET ATTRIBUTS
Classe : Groupe d’entités du monde réel ayant les m ê m e s
caractéristiques et le m ê m e comportement
ex. ETUDIANT
Représentation graphique :
12
12
Bases de données avancées
ATTRIBUTS
Type d’attribut :
– Nombre entier (Entier)
– Nombre réel (Réel)
– Chaîne de caractères (Chaîne)
– Date (Date)
13
13
Bases de données avancées
INSTANCES
Objets (individus) de la classe ETUDIANT = les étudiant·es
14
14
Bases de données avancées
IDENTIFIANT (1/2)
15
15
Bases de données avancées
IDENTIFIANT (2/2)
Le numéro d’étudiant est un attribut identifiant.
Convention graphique :
N B : Ne pas confondre avec
les attributs de classe UML
dont c’est la notation usuelle
16
16
Bases de données avancées
ASSOCIATIONS
17
17
Bases de données avancées
RÉCURSIVES
18
18
Bases de données avancées
MULTIPLICITÉ (OU CARDINALITÉ)
19
[Link] 19
Bases de données avancées
ASSOCIATIONS 1-1
ex. Un·e étudiant·e possède une et une seule carte
Izly. Cette dernière n’est possédée que par un·e
seul·e étudiant·e.
20
20
Bases de données avancées
ASSOCIATIONS 1-N
ex. Une épreuve relève d’une et une seule matière.
Une matière peut donner lieu à plusieurs épreuves.
21
21
Bases de données avancées
ASSOCIATIONS 0 OU 1-N
ex. Un·e étudiant·e peut appartenir ou non à un
groupe de TD. Un groupe de TD réunit plusieurs
étudiant·es.
22
22
Bases de données avancées
ASSOCIATIONS M-N
ex. Un·e étudiant·e peut passer plusieurs épreuves.
Une épreuve peut être passée par plusieurs
étudiant·es.
23
23
Bases de données avancées
CLASSES-ASSOCIATIONS
Il est possible de caractériser une association par des
attributs.
ex. Un · e étudiant · e qui passe une épreuve obtient une note.
24
B a ses c
dela snséee
d on s a.
v ancées 25
Bases de données avancées
EXEMPLE : SPÉCIFICATIONS (1/2)
25
25
Bases de données avancées
EXEMPLE : SPÉCIFICATIONS (2/2)
C haque épreuve relève d' une matière unique (mais une matière
donnée peut donner lieu à plu sieurs épreuves).
26
26
Bases de données avancées
D É M A R C H E D E MODÉLISATION CONCEPTUELLE
27
27
Bases de données avancées
EXEMPLE : D I A G R A M M E DE CLASSES
28
PARTIE 2
MODÉLISATION
LOGIQUE
29
RELATIONNEL
30
[Link] 30
Bases de données avancées
S GBD RELATIONNELS
Langages d’interrogation puissants et déclaratifs
Accès orienté valeur
Grande simplicité, absence de considérations physiques
Description du schéma très réduite
L D D intégré au L M D
Grande dynamique de structure
Optimisation de requêtes
Utilisation interactive ou à partir d’un langage hôte
31
[Link] 31
Bases de données avancées
ATTRIBUTS Modèle
relationnel
32
[Link] 32
Bases de données avancées
TS Modèle
relationnel
33
[Link] 33
Bases de données avancées
D’INTÉGRITÉ (1/2) Modèle
relationnel
34
[Link] 34
Bases de données avancées
D’INTÉGRITÉ (2/2) Modèle
relationnel
35
[Link] 35
Bases de données avancées
PRATIQUE Modèle
relationnel
EPREUVE MATIERE
36
[Link] 36
Bases de données avancées
RELATIONNEL (1/4)
Chaque classe devient une relation.
37
[Link] 37
Bases de données avancées
RELATIONNEL (2/4)
38
[Link] 38
Bases de données avancées
RELATIONNEL (3/4)
39
[Link] 39
Bases de données avancées
RELATIONNEL (4/4)
40
[Link] 40
Bases de données avancées
LOGIQUE RELATIONNEL Modèle
relationnel
GROUPE_TD (CodeGroupe)
41
[Link] 41
Bases de données avancées
ASSOCIATION M-N Modèle
relationnel
ETUDIANT
N um Etu N om Prénom
1110 Dupont Albertine PASSER (table « pont »)
2002 West James NumEtu# C o d e Ep r# Note
42
[Link] 42
Bases de données avancées
REDONDANCE Modèle
relationnel
43
[Link] 43
Bases de données avancées
LA REDONDANCE Modèle
relationne
Anomalies de suppression
ex. La suppression de l’étudiant n° 2 0 0 2 fait perdre
toutes les informations concernant l’épreuve ECOS102.
44
[Link] 44
Bases de données avancées
E
Pourquoi ?
– Suppression des problèmes de mise à jour
– Minimisation de l’espace de stockage
Comment ?
– D a n s le modèle conceptuel, ne spécifier que des attributs non
décomposables (première forme normale).
ex. Une adresse doit être décomposée en rue, code postal, ville…
– C’est tout !
45
[Link] 45
Bases de données avancées
Partie 3
Interrogation
et manipulation
de bases de données
B ase s de données avancées [Link] 46
46
RELATIONNELLE ? Modèle
relationnel
47
[Link] 47
Bases de données avancées
(1/5) Modèle
relationnel
48
B a s e s de données avancées
Bases de données avancées
[Link] R S 49
(2/5) Modèle
relationnel
Intersection : T = R ∩ S
ou T = INTERSECT (R, S)
R et S doivent avoir m ê m e schéma.
ex. Permet de trouver les étudiant·es commun·es à
deux formations.
Notation graphique : T
𝗇
R S
49
[Link]
Bases de données avancées
(3/5) Modèle
relationnel
Différence : T = R - S
ou T = MINU S (R, S)
R et S doivent avoir m ê m e schéma.
ex. Permet de retirer les étudiant·es de la relation S
existant dans la relation R.
Notation graphique : T
-
R S
50
[Link]
Bases de données avancées
(4/5) Modèle
relationnel
Produit cartésien : T = R x S
ou T = PRODUCT (R, S)
Associe chaque n-uplet de R à chaque n-uplet de S.
Notation graphique :
T
x
R S
51
[Link]
Bases de données avancées
N Modèle
relationnel
52
[Link]
Bases de données avancées
(5/5) Modèle
relationnel
Division : T= R ÷S
ou T = DIVISION (R, S)
R (A 1 , A 2 , … , A n ) S (A p+ 1 , … , A n )
T (A1 , A 2 , … , A p ) contient tous les n-uplets tels que leur
concaténation à chacun des n-uplets de S donne
toujours un n-uplet de R.
Notation graphique : T
R S
53
[Link]
Bases de données avancées
SION Modèle
relationnel
ex.
NumEtu CodeEprNote
101 INNFFOO11 11
101 ECO1 15 CodeEprNote
101 ECO2 12 ÷ INFO1 11
102 ECO1 9 ECO2 12
103 INNFFOO11 11
103 ECO2 12
NumEtu
= 101
103
54
[Link]
Bases de données avancées
SPÉCIFIQUES (1/3) Modèle
relationnel
55
[Link]
Bases de données avancées
SPÉCIFIQUES (2/3) Modèle
relationnel
56
[Link]
Bases de données avancées
SPÉCIFIQUES (3/3) Modèle
relationnel
57
[Link]
Bases de données avancées
REQUÊTE (1/4) Modèle
relationnel
RESULTAT
Nom,
CodeEpr, Note
NumEtu NumEtu
=
ETUDIANT PASSER
58
[Link]
Bases de données avancées
REQUÊTE (2/4) Modèle
relationnel
ETUDIANT PASSER
NumEtu Nom NumEtu CodeEpr Note
101 E1 101 INFO1 10
102 E2 X 103 INFO1 15
103 E3 103 ECO1 12
59
[Link]
Bases de données avancées
REQUÊTE (3/4) Modèle
relationnel
60
[Link]
Bases de données avancées
REQUÊTE (4/4) Modèle
relationnel
ETUDIANT ▷ ◁ PASSER
[Link] Nom [Link] CodeEpr Note
101 E1 101 INFO1 10
103 E3 103 INFO1 15
103 E3 103 ECO1 12
61
[Link]
Bases de données avancées
S GBD RELATIONNELS
62
[Link]
Bases de données avancées
QUE SQL ?
63
[Link]
Bases de données avancées
PRINCIPAUX LDD
64
[Link]
Bases de données avancées
D’INTÉGRITÉ LDD
Clé primaire :
PRIMARY KEY (clé)
Clé étrangère :
FOREIGN KEY (clé) REF EREN C ES table(attribut)
Contrainte de domaine :
CHECK (condition)
65
[Link]
Bases de données avancées
DÉFINITION DES LDD
DONNÉES (1/2)
ex.
66
Bases de données avancées
DÉFINITION DES LDD
DONNÉES
ex. (2/2)
CREATE TABLE Passer ( NumEtu NUMBER(8),
CodeEpr VARCHAR(10),
Note NUMBER(5, 2),
67
[Link]
Bases de données avancées
(1/2) LDD
Ajout d’attributs
ALTER TABLE nom_table A D D (attribut TYPE, … )
ex. ALTER TABLE Etudiant A D D (tel NUMBER(8))
Modifications d’attributs
ALTER TABLE nom_table MODIFY (attribut TYPE, … )
ex. ALTER TABLE Etudiant MODIFY (tel NUMBER(10))
Suppression d'attributs
ALTER TABLE nom_table DROP COLUMN attribut, ...
ex. ALTER TABLE Etudiant DROP COLUMN tel
68
Bases de données avancées
(2/2) LDD
Ajout de contrainte
ALTER TABLE nom_table
A D D CONSTRAINT nom_contrainte définition_contrainte
ex. ALTER TABLE Epreuve
A D D CONSTRAINT LieuValide CHECK (Lieu IN (‘Say’, ‘Aubrac’))
Suppression de contrainte
ALTER TABLE nom_table DROP CONSTRAINT nom_contrainte
ex. ALTER TABLE Epreuve
D R O P CONSTRAINT LieuValide
69
Bases de données avancées
EX LDD
70
Bases de données avancées
ES LDD
71
Bases de données avancées
VUES (1/2) LDD
72
Bases de données avancées
VUES (2/2) LDD
73
Bases de données avancées
VIA UNE VUE LDD
74
Bases de données avancées
S LDD
ALL_TABLES (OWNER, TABLE_NAME, … )
ALL_VIEWS (OWNER, VIEW_NAME, … )
ALL_CONSTRAINTS (OWNER, TABLE_NAME, CONSTRAINT_NAME,
CONSTRAINT_TYPE, SEARCH_CONDITION, ...)
ALL_CONS_COLUMNS (OWNER, TABLE_NAME, CONSTRAINT_NAME,
COLUMN_NAME, ...)
USER_CATALOG (TABLE_NAME, TABLE_TYPE)
USER_TAB_COLUMNS (TABLE_NAME, COLUMN_NAME, … )
75
[Link]
Bases de données avancées
DES VUES SYSTÈMES LDD
76
[Link]
Bases de données avancées
DES DONNÉES LMD
Suppression de n-uplets
ex. DELETE F R O M Etudiant
WH E RE Ville = ‘Lyon’
ex. DELETE F R O M Epreuve
77
Bases de données avancées
DES DONNÉES LMD
78
Bases de données avancées
CHAMP CALCULÉ LMD
Tri du résultat
ex. Par ordre alphabétique [inverse] de nom
SELECT * F R O M Etudiant
O R D E R BY N o m [DESC]
Champs calculés
ex. Transformation de notes sur 2 0 en notes sur 1 0
S ELEC T N ote / 2 FR O M Pas s er
79
[Link]
Bases de données avancées
RESTRICTION LMD
Projection
ex. N o m s et Prénoms des étudiant·es, uniquement (pas
les autres attributs)
SELECT Nom, Prénom F R O M Etudiant
Suppression des doublons
ex. SELECT DISTINCT N o m F R O M Etudiant
Restriction
ex.Étudiant·es qui habitent à Lyon
SELECT * F R O M Etudiant
W H E R E Ville = ‘Lyon’
80
[Link]
Bases de données avancées
RESTRICTION (1/3) LMD
81
Bases de données avancées
RESTRICTION (2/3) LMD
82
Bases de données avancées
RESTRICTION (3/3) LMD
83
Bases de données avancées
S LOGIQUES LMD
84
Bases de données avancées
D’AGRÉGAT LMD
85
Bases de données avancées
OPÉRATEUR DISTINCT LMD
86
[Link]
Bases de données avancées
COUNT/DISTINCT LMD
Table PASSER
COUNT(NumEtu) ⇒ Résultat = 3
87
Bases de données avancées
RE (1/3) LMD
NumEtu NumEtu
=
ETUDIANT PASSER
88
Bases de données avancées
RE (2/3) LMD
89
Bases de données avancées
RE (3/3) LMD
WHERE CodeEpr IN (
Sous-
SELECT CodeEpr FROM Epreuve requête
WHERE DateEpr = ‘23-09-2016’ )
90
Bases de données avancées
D’EXISTENCE LMD
Prédicats E X IS TS / N O T E X IS TS
ex. Étudiant·es qui ont passé au moins une épreuve
[n’ont passé aucune épreuve]
91
Bases de données avancées
DÉNOMBREMENT LMD
92
Bases de données avancées
NT (1/2) LMD
93
Bases de données avancées
NT (2/2) LMD
94
Bases de données avancées
SION LMD
! Deux stratégies :
– Étudiant·es tels qu'il n'existe pas d’épreuve tel qu'il n'existe pas
de « passage » pour cet étudiant·e et cette épreuve.
95
Bases de données avancées
LOGIQUE LMD
SELECT NumEtu
FROM Etudiant Et
WHERE NOT EXISTS (
SELECT *
FROM Epreuve Ep
WHERE NOT EXISTS (
SELECT *
FROM Passer P
WHERE [Link] = [Link]
AND [Link] = [Link] ) )
96
Bases de données avancées
COMPTAGE LMD
97
Bases de données avancées
ENSEMBLISTES LMD
98
Bases de données avancées
(1/5) LMD
Relation associée :
ELEMENT (No_Elt, Dési, Parent#) Pneu Rayons
1 Vélo NULL
2 Cadre 0
3 Roue1 0 6 Rayon11 2
4 Roue2 0 7 Rayon12 2
5 Pneu1 2 8 Rayon13 2
6 Pneu2 3 9 Rayon21 3
99
Bases de données avancées
(2/5) LMD
100
Bases de données avancées
(3/5) LMD
101
Bases de données avancées
(4/5) LMD
102
Bases de données avancées
(5/5) LMD
103
Bases de données avancées
FONCTIONS SQL (1/2)
– ABS(n) : Valeur absolue de n – LOWER(ch) : c en minuscules
– CEIL(n) : Plus petit entier ≥ n – UPPER(ch) : c en majuscules
– FLOOR(n) : Plus grand entier ≤ n – LTRIM(ch, n) : Troncature à gauche
– MOD(m, n) : Reste de m/n – RTRIM(ch, n) : Troncature à droite
– REPLACE(ch, car) : Remplacement de caractère
– POWER(m, n) : mn
– SUBSTR(ch, pos, lg) : Extraction de chaîne
– SIGN(n) : Signe de n
– SOUNDEX(ch) : Représentation phonétique de ch
– SQRT(n) : Racine carrée de n – LPAD(ch, lg, car) : Compléter à gauche
– ROUND(n, m) : Arrondi à 10-m – RPAD(ch, lg, car) : Compléter à droite
– TRUNC(n, m) : Troncature à 10-m
– CHR(n) : Caractère ASCII n° n
– INITCAP(ch) : 1re lettre en maj.
104
Bases de données avancées
SQL (2/2) LMD
105
Bases de données avancées
FONCTIONS LMD
106
Bases de données avancées
TRANSACTIONS LCD
107
Bases de données avancées
TRANSACTIONS LCD
108
Bases de données avancées
S LCD
Création
– ex. CREATE U S E R moi_meme
IDENTIFIED BY mon_mot_de_passe
Suppression
– ex. DROP U S E R moi_meme C A S C A D E
Modification
– ex. ALTER U S E R moi_meme IDENTIFIED BY aaaaa
109
Bases de données avancées
GLOBAUX LCD
110
Bases de données avancées
LES OBJETS B D LCD
111
Bases de données avancées
S LCD
Rôles prédéfinis
– CONNECT : droit de création de tables, vues, synonymes, etc.
– RESOURC E : droit de création de procédures stockées,
déclencheurs, etc.
– D B A : administrateur de la B D
112
Bases de données avancées
DE PRIVILÈGES LCD
Transmission de privilèges
GRANT privilège O N table|vue
TO user|PUBLIC [WITH GRANT OPTION]
113
Bases de données avancées
DE PRIVILÈGES LCD
Suppression de privilèges
REVOKE privilège O N table|vue F ROM user|PUBLIC
114
Bases de données avancées
EL SQL
Pour approfondir SQL en ligne…
115
Bases de données avancées
Partie 4
Programmation
de bases de données
116
B ase s de données avancées
UN PROGRAMME
SQL encapsulé : Requêtes SQL incorporées dans le code source C
(PL/SQL, T-SQL, PL/pgSQL, Pro*C…)
U
API : Requêtes SQL via des fonctions du langage R
(Java Persistence API, PHP Data Objects…)
S
Interfaces de niveau appel : intergiciel entre le langage et le S G B D
(ODBC, JDBC, A D O … )
E
U
Procédures stockées : Fonctions SQL stockées dans la base de
données et exécutées par le S G B D R
(écrites en PL/SQL, T-SQL, PL/pgSQL) S
117
Bases de données avancées
LANGAGE PL/SQL (1/2)
Langage de 4 e génération (L4G = L3G + syntaxe type SQL)
Conçu comme une extension de SQ L
118
Bases de données avancées
LANGAGE PL/SQL (2/2)
S Q L dynamique (construction de requêtes à la volée)
Programmation orientée objet
119
Bases de données avancées
RE D’ORACLE
Génie
Réseau
log iciel
S QL
S Q L Developer
S erveur
Oracle
PL/ S QL
Logiciels
Administration
tiers
120
Bases de données avancées
ORACLE
121
Bases de données avancées
BLOCS
Bloc anonyme
– Stocké dans un fichier
– Compilé et exécuté à la volée
BA
Procédure stockée
– Compilée a priori
– Stockée dans la base de données D éc
BD
D éclencheur PS
– Procédure stockée associée à une table
– Exécution automatique à la suite d’un événement
122
Bases de données avancées
D’UN BLOC
[DECLARE
-- Types, constantes et variables]
BEGIN
-- Instructions PL/SQL
[EXCEPTION
-- Gestion des erreurs]
END;
123
Bases de données avancées
CONSTANTES
Déclaration dans la section DECL AR E d’un bloc PL/SQL
Variables
ex. date_naissance DATE;
compteur INTEGER : = 0; -- Initialisation
compteur2 INTEGER DEFAULT 0;-- Valeur par
défaut
id CHAR(5) NOT NULL : = ‘AP001’;
Constantes
ex. taux_tva CONSTANT REAL : = 0.2;
124
Bases de données avancées
DONNÉES
125
Bases de données avancées
TYPE EXISTANT
126
Bases de données avancées
DE VARIABLE
Affectation simple
ex. n : = 0;
n : = n + 1;
127
Bases de données avancées
LOGIQUES
Opérateurs arithmétiques + - / * **
O pérateur de concaténation ||
128
Bases de données avancées
(1/2)
IF-THEN, IF-THEN-ELSE ou IF-THEN-ELSIF
IF condition1 THEN
-- Statements
[ELSIF condition2 THEN
-- Instructions PL/SQL]
[ELSE
-- Instructions PL/SQL]
END IF;
129
Bases de données avancées
(2/2)
CASE
CASE variable
WHEN val1 THEN -- Instruction PL/SQL
WHEN val2 THEN -- Instruction PL/SQL
WHEN val3 THEN -- Instruction PL/SQL
[ELSE -- Instruction par défaut]
END CASE;
130
Bases de données avancées
S
Pour
FOR iterateur IN [REVERSE] min..max LOOP
-- Instructions PL/SQL
E N D LOOP;
Tant que
WHILE condition LOOP
-- Instructions PL/SQL
E N D LOOP;
Répéter
LOOP
-- Instructions PL/SQL
EXIT W H E N condition;
E N D LOOP;
131
Bases de données avancées
E ÉCRAN
DBMS_OUTPUT.PUT('chaîne'); /* Pas de retour à la ligne */
DBMS_OUTPUT.PUT_LINE('chaîne'); /* Retour à la ligne */
DBMS_OUTPUT.PUT('Hello world !');
DBMS_OUTPUT.PUT_LINE('nom = ' || nom);
DBMS_OUTPUT.PUT_LINE('n = ' || TO_CHAR(n));
DBMS_OUTPUT.PUT_LINE('n = ' || n);
132
Bases de données avancées
BLOC ANONYME
-- Calcul de prix TTC
DECLARE
taux_tva CONSTANT REAL := 0.2;
prix product.prod_price%TYPE;
BEGIN
-- Affectation du prix
SELECT prod_price INTO prix FROM product
WHERE prod_code = 'Pr345blue';
-- Ajout de la TVA
prix := prix * (1 + taux_tva);
-- Affichage écran
DBMS_OUTPUT.PUT_LINE(prix || ' euros');
END;
133
Bases de données avancées
S
Définition : Ensemble ordonné d’éléments de m ê m e type. Chaque
élément est indexé par s a position dans la collection.
De ux types de collections
– Tableau (VARRAY) : taille bornée, dense
– Liste (TABLE) : taille extensible, non-dense
134
Bases de données avancées
DE COLLECTION
1. Déclarer un type collection
ex. TYPE Liste_Chaines IS TABLE OF VARCHAR(20);
TYPE Tableau_Entiers IS VARRAY(10) OF INTEGER;
135
Bases de données avancées
DE COLLECTION
Collection entière
ex. D EC LAR E TYPE T1 IS TABLE OF INT;
TYPE T2 IS TABLE OF INT;
et11 T1 : = T1(1, 2, 3, 4);
et12 T1 : = T1(5, 6);
et2 T2 : = T2();
BEGIN et12 : = et11; -- Légal
et2 : = et11; -- Illégal
…
136
Bases de données avancées
COLLECTION (1/2)
Ensemble de méthodes ( ≈ procédures)
Usage: nom_collection.nom_methode[(paramètres)]
EXISTS(i) renvoie TRUE si le ie élément existe dans la collection.
137
Bases de données avancées
COLLECTION (2/2)
138
N B : FIRST = 1 et LAST = COUNT dans un tableau.
Bases de données avancées
COLLECTION
DECLARE
TYPE ListeEntiers IS TABLE OF INTEGER;
pile ListeEntiers := ListeEntiers();
element INTEGER;
BEGIN
-- On empile les valeurs 1 et 11
[Link];
pile([Link]) := 1;
[Link];
pile([Link]) := 11;
-- On dépile
element := pile([Link]); -- element = 11
[Link]; -- Suppression en haut de pile
139
Bases de données avancées
REMENTS
Définition : Ensemble de données liées stockées dans
des champs.
2. Déclarer un enregistrement
ex. un_etudiant Edutiant;
140
Bases de données avancées
NT
Référence directe
ex. un_etudiant.numetu : = 12212478;
un_etudiant.nom : = 'Toto';
un_etudiant.age : = 6;
Résultat de requête
ex. SELECT student_number, student_name, student_age
INTO un_etudiant
F ROM student
W H E R E student_number = 12212478;
141
Bases de données avancées
DURES
142
Bases de données avancées
TIONS
143
Bases de données avancées
DÉCLARATION/PARAMÉTRAGE DE
SOUS-PROGRAMMES
144
Bases de données avancées
PROCÉDURE
BEGIN
prix_EUR := prix_USD * taux;
END;
145
Bases de données avancées
(RÉCURSIVE)
-- Calcul de n!
BEGIN
IF n = 1 THEN -- Condition d’arrêt
RETURN 1;
ELSE
RETURN n * facto(n - 1); -- Appel récursif
END IF;
END;
146
Bases de données avancées
PROGRAMMES
-- Exemple
DEC L A RE
hundredBucks CONSTANT REAL : = 100;
resEuro REAL;
fact10 INTEGER;
BEGIN
Conversion_USD_EUR(hundredBucks, resEuro);
fact10 : = facto(10);
END;
147
Bases de données avancées
CURSEUR
148
Bases de données avancées
IMPLICITE
-- Parcours complet du curseur
DECLARE
CURSOR calc_TVA IS
SELECT prod_num, price * 1.2 AS prix_TTC
FROM product;
nuplet calc_TVA%ROWTYPE;
BEGIN
FOR nuplet IN calc_TVA LOOP
DBMS_OUTPUT.PUT_LINE(
nuplet.prod_num
|| ' : ' ||
nuplet.prix_TTC);
149
END LOOP;
Bases de données avancées
EXPLICITE
-- Parcours ad hoc du curseur
DECLARE
-- Comme précédemment
BEGIN
OPEN calc_TVA;
FETCH calc_TVA INTO nuplet; -- 1re ligne
WHILE calc_TVA%FOUND LOOP
-- Instructions PL/SQL
FETCH calc_TVA INTO nuplet; -- Ligne suivante
END LOOP;
CLOSE calc_TVA;
END;
150
Bases de données avancées
CURSEURS
151
Bases de données avancées
PARAMÉTRÉ
DECLARE
CURSOR c(s number) IS SELECT ename, sal FROM emp WHERE sal >= s;
nuplet c%ROWTYPE;
BEGIN
OPEN c(2500);
FETCH c INTO nuplet;
WHILE c%FOUND LOOP
DBMS_OUTPUT.PUT_LINE([Link] || ' : ' || [Link]);
FETCH c INTO nuplet;
END LOOP;
CLOSE c;
END;
152
Bases de données avancées
TIONS
153
Bases de données avancées
SYSTÈMES
Libellé erreur Code erreur SQLCODE
154
[Link]
Bases de données avancées
S
Déclaration (section DECLARE)
nom_e xception EXCEPTION;
155
Bases de données avancées
D’EXCEPTION
DECLARE
c INTEGER;
personne EXCEPTION;
BEGIN
SELECT COUNT(*) INTO c FROM emp;
IF c = 0 THEN
RAISE personne;
END IF;
EXCEPTION
WHEN personne THEN
RAISE_APPLICATION_ERROR(-20501, 'Table vide !');
END; -- Code d’erreur compris entre –20999 et -20001
156
Bases de données avancées
GESTION D’EXCEPTIONS IMPRÉVUES
DECLARE
i INTEGER := &saisie;
e1 EXCEPTION;
e2 EXCEPTION;
BEGIN
IF i = 1 THEN
RAISE e1;
ELSIF i = 2 THEN
RAISE e2;
ELSE
i := i / 0;
END IF;
EXCEPTION
WHEN e1 THEN RAISE_APPLICATION_ERROR(-20001, 'Exception 1');
WHEN e2 THEN RAISE_APPLICATION_ERROR(-20002, 'Exception 2');
WHEN OTHERS THEN RAISE_APPLICATION_ERROR(-20999, SQLERRM);
157
END;
Bases de données avancées
PROCÉDURES STOCKÉES
158
Bases de données avancées
PAQ U E TA G E S
Oracle 8 documentation
(Fig. 8-1)
159
Bases de données avancées
DÉFINITION D’UN PAQUETAGE
-- Définition de la spécification
CREATE [OR REPLACE] PACKAGE nom_paquetage AS
[-- Définition de types publics]
[-- Déclaration de curseurs publics]
[-- Déclaration de variables globales publiques (à éviter !)]
[-- Déclaration de sous-programmes publics]
END;
-- Définition du corps (optionnelle)
CREATE [OR REPLACE] PACKAGE BODY nom_paquetage AS
[-- Définition de types privés]
[-- Spécification de curseurs publics et privés]
[-- Déclaration de variables globales privées (à éviter !)]
[-- Spécification de sous-programmes publics et privés]
END;
160
Bases de données avancées
PAQUETAGE
CREATE OR REPLACE PACKAGE Employes AS
TYPE nuplet IS RECORD (ename [Link]%TYPE,
salary [Link]%TYPE);
CURSOR salaire_dec RETURN nuplet;
PROCEDURE embaucher (
numemp NUMBER,
nom VARCHAR,
job VARCHAR,
mgr NUMBER,
sal NUMBER,
comm NUMBER,
numdep NUMBER);
PROCEDURE licencier (emp_id NUMBER);
END;
161
Bases de données avancées
DE PAQUETAGE
CREATE OR REPLACE PACKAGE BODY Employes AS
CURSOR salaire_dec RETURN nuplet IS
SELECT empno, sal FROM emp ORDER BY sal DESC;
PROCEDURE embaucher (numemp NUMBER,
nom VARCHAR, job VARCHAR,
mgr NUMBER, sal NUMBER,
comm NUMBER, numdep NUMBER) IS
BEGIN
INSERT INTO emp VALUES (numemp, nom, job,
mgr, SYSDATE, sal, comm, numdep);
END;
PROCEDURE licencier (emp_id NUMBER) IS
BEGIN
DELETE FROM emp WHERE empno = emp_id;
END;
END;
162
Bases de données avancées
DÉCLENCHEURS
163
Bases de données avancées
DE DÉCLENCHEURS
Before 1 2 3
After 4 5 6
164
Bases de données avancées
DÉCLENCHEUR
165
Bases de données avancées
VARIABLES SPÉCIFIQUES AU X DÉCLENCHEURS
166
Bases de données avancées
EXEMPLE DE DÉCLENCHEUR (1/2)
-- Emulation de clé primaire sur la table client
CREATE OR REPLACE TRIGGER client_pk
BEFORE INSERT OR UPDATE ON client
FOR EACH ROW
DECLARE
n INTEGER;
cle_existante EXCEPTION;
cle_nulle EXCEPTION;
BEGIN
-- La clé est-elle vide ?
IF :[Link] IS NULL THEN
RAISE cle_nulle;
167
END IF;
Bases de données avancées
EXEMPLE DE DÉCLENCHEUR (2/2)
-- La clé existe-t-elle déjà ?
SELECT COUNT(NumCli) INTO n FROM client
WHERE NumCli = :[Link];
IF n > 0 THEN
RAISE cle_existante;
END IF;
EXCEPTION
WHEN cle_existante THEN
RAISE_APPLICATION_ERROR(-20501,
'Clé primaire déjà utilisée !');
WHEN cle_nulle THEN
RAISE_APPLICATION_ERROR(-20502,
'Une clé primaire doit avoir une valeur !');
168
END;
Bases de données avancées
S Q L STATIQUE VS. S Q L DYNAMIQUE
Exemples
– Procédure stockée qui met la table EMP à jour
* SQL statique (la requête est connue à la compilation)
– Procédure stockée qui met à jour une table dont le n om est un
paramètre
* SQL dynamique (la requête complète n’est pas connue à la
compilation)
Définition du S Q L dynamique :
Construction d’une requête SQ L à la volée dans un bloc PL/SQL
169
Bases de données avancées
DYNAMIQUES
Exécution : EXECUTE IMMEDIATE requete -- requete est une chaîne
[INTO res1, res2…];
Note :
– Requêtes paramétrées : valeurs de la base de données (statiques).
– Si l’on veut paramétrer des objets (tables, vues, attributs...) : requête
dynamique.
170
Bases de données avancées
DYNAMIQUES
DECLARE
requete VARCHAR(250);
nom_table CHAR(4) := 'dept';
numdep [Link]%TYPE := 50;
n INTEGER;
BEGIN
-- Construction de requête par concatenation
requete := 'DELETE FROM '||nom_table||' WHERE deptno = '||numdep;
EXECUTE IMMEDIATE requete;
-- Récupération d'un résultat de requête dynamique
requete := 'SELECT COUNT(*) FROM ' || nom_table;
EXECUTE IMMEDIATE requete INTO n;
END;
171
Bases de données avancées
DYNAMIQUES
DECLARE -- Exemple
TYPE CursDyn IS REF CURSOR; -- Pointeur vers un curseur
emp_cv CursDyn; -- Curseur dynamique
nom [Link]%TYPE;
salaire [Link]%TYPE := 10000;
BEGIN
OPEN emp_cv FOR -- Le curseur est forcément explicite
'SELECT ename, sal FROM emp
WHERE sal > ' || salaire;
FETCH emp_cv INTO nom, salaire;
WHILE emp_cv%FOUND LOOP
-- Instructions PL/SQL
FETCH emp_cv INTO nom, salaire;
END LOOP;
CLOSE emp_cv;
172
END;
Bases de données avancées
FIN
173
B ase s de données avancées