Académique Documents
Professionnel Documents
Culture Documents
Cours 3 : Introduction
à l'ETL et application
avec Oracle (Partie 3)
Riadh ZAAFRANI
Mars 2021
Plan
◼ Principes généraux d'un processus ETL
◼ Proposition d'architecture simplifiée pour un ETL ex nihilo, batch, non
incrémental
◼ Implémentation simplifiée d'une zone d'extraction avec Oracle
◼ Exercice : Projet Fantastic : Mise en place de la zone d'extraction
◼ Implémentation simplifiée d'une zone de transformation avec Oracle
◼ Exercice : Projet Fantastic : Mise en place de la zone de traitement
◼ Implémentation simplifiée d'un data warehouse avec Oracle
◼ Exercice : Projet Fantastic : Mise en place de la zone d'exploitation
◼ Exercice : Projet Fantastic : Implémentation des transformations
◼ Rappels
◼ Compléments
2
1
Introduction
Zone L : Loading
2
Zone L : Loading
3
Implémentation du data warehouse en R
Exemple
CREATE TABLE t_produit (
pk_num number,
a_designation varchar(50),
a_type char(3)
);
CREATE UNIQUE INDEX
idx_produit_num
ON t_produit (pk_num);
ALTER TABLE t_produit
ADD CONSTRAINT
cstr_produit_num PRIMARY KEY
(pk_num)
ADD CONSTRAINT
cstr_produit_type CHECK
(a_type in ('CD', 'DVD'));
...
Modèle dimensionnel 8
4
Processus de chargement BDT->DW
Chargement BDT->DW
1. Désactivation des contraintes du DW et des DM
2. Suppression des index du DW et des DM
3. Chargement chaque dimension du data warehouse via
l'API de la zone T
4. Chargement la table des faits du data warehouse via
l'API de la zone T
5. Recréation des index du DW
6. Réactivation des contraintes du DW
7. Vérification que la réactivation des contraintes n'a pas
rejeté de données (100% des données sont passées de
la BDT au DW) 9
10
10
5
Processus de chargement BDT->DW
Performance du chargement
Afin d'améliorer les performances au chargement
dans une zone, on désactive les contraintes et on
supprime les index préalablement au chargement, et
on les réactive et recrée postérieurement.
Passage obligé
Le passage d'une zone à l'autre doit toujours laisser
passer toutes les données.
11
11
Plan
◼ Principes généraux d'un processus ETL
◼ Proposition d'architecture simplifiée pour un ETL ex nihilo, batch, non
incrémental
◼ Implémentation simplifiée d'une zone d'extraction avec Oracle
◼ Exercice : Projet Fantastic : Mise en place de la zone d'extraction
◼ Implémentation simplifiée d'une zone de transformation avec Oracle
◼ Exercice : Projet Fantastic : Mise en place de la zone de traitement
◼ Implémentation simplifiée d'un data warehouse avec Oracle
◼ Exercice : Projet Fantastic : Mise en place de la zone d'exploitation
◼ Exercice : Projet Fantastic : Implémentation des transformations
◼ Rappels
◼ Compléments
12
12
6
Projet Fantastic : Mise en place de la
zone d’exploitation
L'objectif est à présent de créer le DW
en R. Les noms des tables et vues
seront préfixés :
• f_ dans le schéma dw (f pour projet
Fantastique) ;
• ou f_dw_ si vous ne disposez que d'un
seul schéma pour toutes vos BD.
13
13
14
14
7
Plan
◼ Principes généraux d'un processus ETL
◼ Proposition d'architecture simplifiée pour un ETL ex nihilo, batch, non
incrémental
◼ Implémentation simplifiée d'une zone d'extraction avec Oracle
◼ Exercice : Projet Fantastic : Mise en place de la zone d'extraction
◼ Implémentation simplifiée d'une zone de transformation avec Oracle
◼ Exercice : Projet Fantastic : Mise en place de la zone de traitement
◼ Implémentation simplifiée d'un data warehouse avec Oracle
◼ Exercice : Projet Fantastic : Mise en place de la zone d'exploitation
◼ Exercice : Projet Fantastic : Implémentation des transformations
◼ Rappels
◼ Compléments
15
15
16
16
8
Projet Fantastic : Implémentation des
transformations
2) Implémentez les méthodes effectuant un simple
return pour la dimension "magasin" (aucun
traitement).
3) Implémentez les méthodes de la dimension
"date".
*) Utilisez la fonction TO_DATE pour obtenir une
valeur de type date pour la méthode date()
*) Puis utilisez la fonction TO_CHAR sur cette
méthode pour obtenir les autres attributs
17
17
18
18
9
Plan
◼ Principes généraux d'un processus ETL
◼ Proposition d'architecture simplifiée pour un ETL ex nihilo, batch, non
incrémental
◼ Implémentation simplifiée d'une zone d'extraction avec Oracle
◼ Exercice : Projet Fantastic : Mise en place de la zone d'extraction
◼ Implémentation simplifiée d'une zone de transformation avec Oracle
◼ Exercice : Projet Fantastic : Mise en place de la zone de traitement
◼ Implémentation simplifiée d'un data warehouse avec Oracle
◼ Exercice : Projet Fantastic : Mise en place de la zone d'exploitation
◼ Exercice : Projet Fantastic : Implémentation des transformations
◼ Rappels
◼ Compléments
19
19
Rappels
◼ Rappels Oracle
▪ Création de vues
◼ Structure d'un bloc PL/SQL
◼ Blocs PL/SQL
◼ Fichiers SQL
◼ Fonctions SQL
◼ Affichage à l'écran
◼ Transactions en SQL
◼ Rappels triggers
◼ Rappels Oracle RO 20
20
10
Création de vues
Vue
Une vue est une définition logique d'une relation, sans
stockage de données, obtenue par interrogation d'une
ou plusieurs tables de la BD.
Une vue peut donc être perçue comme une fenêtre
dynamique sur les données, ou encore une requête
stockée (mais dont seule la définition est stockée, pas le
résultat, qui reste calculé dynamiquement).
Une vue permet d'implémenter le concept de schéma
externe d'un modèle conceptuel.
Synonymes : Relation dérivée, Table virtuelle calculée
21
21
Création de vues
CREATE VIEW <nom de vue> <nom des colonnes>
AS <spécification de question>
Le nombre de colonnes nommées doit être égal au nombre
de colonnes renvoyées par la question spécifiée.
Le nom des colonnes est optionnel, s'il n'est pas spécifié,
c'est le nom des colonnes telle qu'elles sont renvoyées par la
question, qui sera utilisé.
CREATE VIEW Employe (Id, Nom) AS
SELECT N°SS, Nom FROM Personne
La vue Employe est ici une projection de la relation Personne sur
les attributs N°SS et Nom, renommés respectivement Id et Nom.
22
22
11
Création de vues
Vue sur une vue
Une vue peut avoir comme source une autre
vue.
Vues et héritage
Les vues sont particulièrement utiles pour
restituer les relations d'héritage perdues lors
de la transformation MCD vers MLD
23
23
Rappels
◼ Rappels Oracle
◼ Création de vues
▪ Structure d'un bloc PL/SQL
◼ Blocs PL/SQL
◼ Fichiers SQL
◼ Fonctions SQL
◼ Affichage à l'écran
◼ Transactions en SQL
◼ Rappels triggers
◼ Rappels Oracle RO 24
24
12
Structure d'un bloc PL/SQL
[Declare]
Variables, curseurs, etc.
Begin
Instructions SQL et PL/SQL
[Exception]
Gestion d'erreur.
End ;
/
25
25
/
• Un bloc PL/SQL est terminé par un ; comme une
instruction SQL.
• Par ailleurs, dans les environnements d'exécution
Oracle (comme SQL*Plus, SQL Developer...), il est
nécessaire de séparer les blocs par un "/" (sur
une nouvelle ligne).
• Une bonne habitude est donc de terminer les bloc
PL/SQL par des "/".
26
26
13
Rappels
◼ Rappels Oracle
◼ Création de vues
◼ Structure d'un bloc PL/SQL
▪ Blocs PL/SQL
◼ Fichiers SQL
◼ Fonctions SQL
◼ Affichage à l'écran
◼ Transactions en SQL
◼ Rappels triggers
◼ Rappels Oracle RO 27
27
28
28
14
Blocs PL/SQL : Procédure, fonction,
bloc anonyme
Fonction
CREATE OR REPLACE FUNCTION
fDateDuJour RETURN date
IS
vDate date;
BEGIN
SELECT SYSDATE INTO vDate FROM DUAL;
RETURN vDate;
END;
/
29
29
30
30
15
Rappels
◼ Rappels Oracle
◼ Création de vues
◼ Structure d'un bloc PL/SQL
◼ Blocs PL/SQL
▪ Fichiers SQL
◼ Fonctions SQL
◼ Affichage à l'écran
◼ Transactions en SQL
◼ Rappels triggers
◼ Rappels Oracle RO 31
31
32
16
Rappels
◼ Rappels Oracle
◼ Création de vues
◼ Structure d'un bloc PL/SQL
◼ Blocs PL/SQL
◼ Fichiers SQL
▪ Fonctions SQL
◼ Insertion de dates avec TO_DATE
◼ Affichage à l'écran
◼ Transactions en SQL
◼ Rappels triggers
◼ Rappels Oracle RO 33
33
▪ Traitement de date
• months_between, add_months, next_day,
last_day,
• SELECT sysdate FROM dual
• Opérations mathématiques sur les dates :
SELECT sysdate + 10 FROM dual 34
34
17
Fonctions SQL à connaître
▪ Traitement numérique
• Round, Trunc
• Floor, Ceil
• Mod
SELECT ROUND(nom_colonne, 2) FROM `table`
-- permet d’obtenir le résultat avec 2 chiffres de décimal
TRUNC(15.3)=15 (Partie entière)
TRUNC( TO_DATE('15-12-20 12:00:00','DD-MM-YY HH:MI:SS'))
='15-DEC-20'
TRUNC(TO_DATE('01-JUL-21'),'Y')='01-JAN-21’
FLOOR(31.5)=31 FLOOR(-31.5)=-32
-- Plus grand entier relatif inférieur ou égal
CEIL(31.5)=32 CEIL(-31.5)=-31
-- Plus petit entier relatif égal ou supérieur
MOD(35,4)=3 -- Reste de la division de m par n 35
35
36
18
Fonctions SQL à connaître
Select avec CASE :
SELECT pknum,
CASE
WHEN type='C’ THEN 'Cours'
WHEN type='TD' THEN 'Travaux dirigés'
END AS type_label,
debut
FROM tCours
37
Rappels
◼ Rappels Oracle
◼ Création de vues
◼ Structure d'un bloc PL/SQL
◼ Blocs PL/SQL
◼ Fichiers SQL
◼ Fonctions SQL
◼ Transactions en SQL
◼ Rappels triggers
◼ Rappels Oracle RO 38
38
19
Fonctions de traitement des dates
Gestion des dates avec TO_DATE
La gestion des dates peut poser des problèmes
selon les formats paramétrés sur le serveur Oracle
(en général par défaut le format est DD-MON-YY).
La solution la plus rigoureuse consiste à utiliser la
fonction de conversion TO_DATE.
TO_DATE(‘20201130','YYYYMMDD') équivaut à 30-NOV-2020.
Insertion de date dans Oracle
INSERT INTO Project (Num, Name, Begin, End)
VALUES (1, 'Walking on the moon',
TO_DATE(‘20200401','YYYYMMDD'),
TO_DATE(‘20210401','YYYYMMDD'); 39
39
40
40
20
Fonctions de traitement des dates
Select avec date
PKNUM TO_CHAR(DEBUT,'FMDAY')
----- ----------------------
1 monday
2 tuesday
41
41
DEBUT
---------
21-JAN-01
22-JAN-01 42
28-JAN-21
42
21
Rappels
◼ Rappels Oracle
◼ Création de vues
◼ Structure d'un bloc PL/SQL
◼ Blocs PL/SQL
◼ Fichiers SQL
◼ Fonctions SQL
▪ Affichage à l'écran
◼ Transactions en SQL
◼ Rappels triggers
◼ Rappels Oracle RO 43
43
Affichage à l'écran
SET SERVEROUTPUT ON
BEGIN
DBMS_OUTPUT.PUT_LINE ('Hello World');
END;
44
44
22
Rappels
◼ Rappels Oracle
◼ Création de vues
◼ Structure d'un bloc PL/SQL
◼ Blocs PL/SQL
◼ Fichiers SQL
◼ Fonctions SQL
◼ Affichage à l'écran
▪ Transactions en SQL
◼ Rappels triggers
◼ Rappels Oracle RO 45
45
46
23
Rappels
◼Rappels Oracle
◼ Rappels triggers
▪ TRIGGER
◼ Prédicats d'événement
◼ :old et :new
triggers
◼ Rappels Oracle RO
47
47
Trigger
Un trigger (ou déclencheur) est un bloc
PL/SQL associé à une table permettant de
déclencher une action avant ou après un
INSERT, UPDATE ou DELETE sur cette table.
Les triggers sont stockés dans la base.
48
48
24
Principes des triggers
49
Types de triggers
Il existe deux types de triggers :
• Trigger sur ligne
le trigger est exécuté pour chaque ligne
concernée par l'instruction insert, update ou
delete (option "for each row").
• Trigger sur instruction
le trigger est exécuté une seule fois pour
l'instruction insert, update ou delete, même si elle
traite plusieurs lignes d'un coup.
50
50
25
Principes des triggers
Trigger
CREATE [OR REPLACE] TRIGGER nom_trigger
{BEFORE|AFTER}
[INSERT OR][UPDATE [OF nom_colonne]
OR][DELETE]
ON nom_Table
[FOR EACH ROW [WHEN (condition)] ]
DECLARE
[variable declarations]
BEGIN
instructions
END;
51
51
Triggers multiples
Une même table peut avoir plusieurs triggers, mais
cela est à éviter en général, pour des raisons de
facilité de maintenance et de performance.
Exception
Si l'exécution du trigger échoue, l'action (insert,
update ou delete dans la table) est annulée (et
retourne une exception Oracle).
52
52
26
Rappels
◼Rappels Oracle
◼ Rappels triggers
◼ TRIGGER
▪ Prédicats d'événement
◼ :old et :new
triggers
◼ Rappels Oracle RO
53
53
54
27
Prédicats d'événement au sein des triggers
55
Rappels
◼Rappels Oracle
◼ Rappels triggers
◼ TRIGGER
◼ Prédicats d'événement
▪ :old et :new
◼ Quelques règles à respecter pour les
triggers
◼ Rappels Oracle RO
56
56
28
Manipulation des anciennes et
nouvelles valeurs dans les triggers
Pour les triggers de type "for each row", les
colonnes de la ligne courante doivent être
référencées spécifiquement selon que l'on veut
l'ancienne ou la nouvelle valeur :
• :old.nom_colonne
• :new.nom_colonne
Il ne faut pas lire des données d'une table en cours
de modification autrement que par les accès ":old" et
":new".
57
57
58
29
Manipulation des anciennes et nouvelles
valeurs dans les triggers
Trigger de calcul de valeur dérivée
CREATE OR REPLACE TRIGGER trCours
BEFORE INSERT OR UPDATE OF debut ON tCours
FOR EACH ROW
BEGIN
:new.fin := :new.debut+5;
END;
/
UPDATE tCours
SET debut=TO_DATE('15-01-2021','DD-MM-YYYY')
WHERE pknum=3;
INSERT INTO tCours (pkannee, pknum, titre, type, fkIntervenant,
debut)
VALUES (‘2021', tCoursSeq.NEXTVAL, ‘IBD', 'C', ‘ZAAFRANI',
TO_DATE('22-01-2021','DD-MM-YYYY')); 59
59
60
60
30
Rappels
◼Rappels Oracle
◼ Rappels triggers
◼ TRIGGER
◼ Prédicats d'événement
◼ :old et :new
61
61
62
62
31
Rappels
◼Rappels Oracle
◼ Rappels triggers
◼ Rappels Oracle RO
▪ CREATE TYPE
◼ Création de table objet (modèles et LDD)
◼ Méthodes et SELF
63
63
64
32
Déclaration des types utilisateurs en
SQL3 (extension au LDD)
Héritage de type
CREATE TYPE sous_type UNDER sur_type (
Déclarations spécifiques ou surcharges
);
NOT FINAL
Pour être héritable, un type doit être déclaré avec la
clause optionnelle NOT FINAL.
Type retourné par une méthode
« The datatype cannot specify a length, precision, or scale. »
http://docs.oracle.com/cd/B13789_01/server.101/b10759/stat
ements_5009.htm 65
65
Rappels
◼ Rappels Oracle
◼ Rappels triggers
◼ Rappels Oracle RO
◼ CREATE TYPE
◼ Méthodes et SELF
66
66
33
Définition de tables objets (modèles et LDD)
67
67
LDD SQL3
CREATE TABLE nom_table OF nom_type (
PRIMARY KEY(attribut1),
attribut2 NOT NULL,
UNIQUE (attribut3)
FOREIGN KEY (attribut4) REFERENCES ...
);
Il est possible, sur une table ainsi définie, de spécifier les
mêmes contraintes que pour une table créée avec une clause
CREATE TABLE (contraintes de table). Ces contraintes doivent
être spécifiées au moment de la création de la table, et non au
moment de la création du type (bien que la définition de type
permet de spécifier certaines contraintes, comme NOT NULL).68
68
34
Définition de tables objets (modèles et LDD)
OID
Les enregistrements d'une table-objet peuvent être identifiés
par un OID
Méthodes
Des méthodes peuvent être associées à une table-objet.
Héritage
Cette modalité de définition de schéma permet de profiter de
l'héritage de type pour permettre l'héritage de schéma de
table.
69
69
70
70
35
Rappels
◼ Rappels Oracle
◼ Rappels triggers
◼ Rappels Oracle RO
◼ CREATE TYPE
71
71
Méthodes de table
Si le type sur lequel s'appuie la création de la table
définit des méthodes, alors les méthodes seront
associées à la table (méthodes de table).
Il sera possible d'accéder à ces méthodes de la
même façon que l'on accède aux attributs
(projection, sélection...).
Accès aux méthodes d'une table objet
SELECT t.m1(), t.m2() ...
FROM table t
72
...
72
36
Méthodes de table objet
73
Rappels
◼Rappels Oracle
◼ Rappels triggers
◼ Rappels Oracle RO
◼ CREATE TYPE
▪ Méthodes et SELF
74
74
37
Méthodes et SELF
SELF
Lorsque l'on écrit une méthode on a généralement
besoin d'utiliser les attributs propres (voire d'ailleurs
les autres méthodes), de l'objet particulier que l'on
est en train de manipuler.
On utilise pour cela la syntaxe SELF qui permet de
faire référence à l'objet en cours.
SELF
self.nom_attribut
self.nom_méthode(...) 75
75
Méthodes et SELF
76
76
38
Méthodes et SELF
SELF implicite
Dans certains cas simples, lorsqu'il n'y a aucune
confusion possible, SELF peut être ignoré et le nom de
l'attribut ou de la méthode directement utilisé.
Il est toutefois plus systématique et plus clair de mettre
explicitement le self.
Exemple de SELF implicite
MEMBER FUNCTION adresse RETURN varchar2
IS
BEGIN
RETURN num || rue || ville; 77
END;
77
Plan
◼ Principes généraux d'un processus ETL
◼ Proposition d'architecture simplifiée pour un ETL ex nihilo, batch, non
incrémental
◼ Implémentation simplifiée d'une zone d'extraction avec Oracle
◼ Exercice : Projet Fantastic : Mise en place de la zone d'extraction
◼ Implémentation simplifiée d'une zone de transformation avec Oracle
◼ Exercice : Projet Fantastic : Mise en place de la zone de traitement
◼ Implémentation simplifiée d'un data warehouse avec Oracle
◼ Exercice : Projet Fantastic : Mise en place de la zone d'exploitation
◼ Exercice : Projet Fantastic : Implémentation des transformations
◼ Rappels
◼ Compléments
78
78
39
Compléments
◼ Script de remise à zéro d'un schéma
Oracle
◼ ETL avancé
◼ Exercice : Cas Fantastic : Gestion des
erreurs
◼ Exercice : Cas Fantastic : Surveillance
des données
79
79
Begin
for c in (select type_name from user_types) loop
execute immediate ('drop type ' || c.type_name || ' force');
end loop;
End;
/
Begin
for c in (select object_name from user_objects where object_type='TABLE') loop
execute immediate ('drop table ' || c.object_name || ' cascade constraints');
end loop;
End;
/
Begin
for c in (select object_name from user_objects where object_type='VIEW') loop
execute immediate ('drop view ' || c.object_name || ' cascade constraints');
end loop;
End;
/ 80
80
40