Introduction À L'etl Et Application Avec Oracle
Introduction À L'etl Et Application Avec Oracle
Introduction À L'etl Et Application Avec Oracle
et application avec
Oracle
Data warehouse
http://dwh.crzt.fr
Stéphane Crozat
Objectifs 5
Introduction 6
incrémental 10
4. Exemple de chargement de données depuis un CSV par une table externe ............................... 19
25
1. Zone T : Transformation ............................................................................................................ 25
30
XI - Rappels 37
XII - Compléments 49
Contenus annexes 53
Abréviations 60
Bibliographie 61
Webographie 62
Objectifs
5
Stéphane Crozat
Introduction
Volume de cours : 4h
Volume d'exercice : 12h
6
Stéphane Crozat
Principes généraux d'un processus ETL
Principes généraux
d'un processus ETL I
Principe de l'ETL 7
ETL ex nihilo ou outil d'ETL 7
ETL en mode batch ou en mode flux 8
ETL incrémental 8
1. Principe de l'ETL
Définition : Processus "Extraction, Transformation, Load"
L'ETLETL- p.60 > est le processus qui permet de charger un data warehouse à partir de données
*
externes généralement issues de bases transactionnelles. Son rôle est de récupérer ces données et de
les traiter pour qu'elles correspondent aux besoins du modèle dimensionnel.
En général les données sources doivent être "nettoyées" et aménagées pour être exploitables par les
outils décisionnels.
Fondamental
You get the data out of its original source location (E), you do something to
it (T), and then you load it (L) into a final set of tables for the users to query.
(Kimball et al., 2008, p369)- p.61 ¨
*
Fondamental
Selon Kimball (2004, p.xxi)(Kimball, Caserta, 2004)- p.61 ¨ 70% de l'effort consacré à un projet de BI est
*
7
Stéphane Crozat
Principes généraux d'un processus ETL
Fondamental
ETL Tool versus Hand Coding (Buy a Tool Suite or Roll Your Own?)
The answer is, “It depends.”
(Kimball, Caserta, 2004, pp10-13)- p.61 ¨
*
...
Méthode : ETL ex nihilo
Les avantages offerts par une approche manuelle sont :
L'homogénéité technologique et la disponibilité interne des compétences : les équipes utilisent
les langages qu'elles maîtrisent sans apprentissage et médiation d'un outil tiers.
La flexibilité : tout est possible.
Le traitement des fichiers plats (hors BDBD- p.60 > ) peut être plus simples et plus performant
*
Un ETL alimente en général un data warehouse par des processus batch périodiques.
4. ETL incrémental
Définition : ETL non incrémental
Un ETL non incrémental est :
soit un ETL qui ne sert qu'une seule fois (one shot) ;
soit un ETL qui refait 100% du processus de migration à chaque fois que l'on souhaite une
mise à jour (le data warehouse est vidé puis rempli à nouveau avec les données actuelles)
On notera qu'un tel ETL ne gère pas d'historisation.
8
Stéphane Crozat
Principes généraux d'un processus ETL
9
Stéphane Crozat
Proposition d'architecture simplifiée pour un ETL ex nihilo, batch, non incrémental
Proposition
d'architecture II
simplifiée pour un
ETL ex nihilo, batch,
non incrémental
Nous proposons un exemple d'architecture simplifiée pour la mise en place d'un ETL ex nihilo, en
mode batch, sans gestion du caractère incrémental.
Cette architecture est assez générale et pourra être une base pour de nombreux cas, mais elle devra :
être adaptée néanmoins en fonctions des spécificités propres à chaque contexte.
être complétée (gestion incrémentale, gestion des rejets, audits...)
Zone d'exploitation
Une base de données destinée à implémenter le data warehouse et les data marts.
10
Stéphane Crozat
Proposition d'architecture simplifiée pour un ETL ex nihilo, batch, non incrémental
Fondamental
2. Conseils méthodologiques
Méthode : ETL multi-schéma
Dans la mesure du possible, utiliser un schéma de base de données pour chaque zone de l'ETL (BDE,
BDT, DW).
Méthode : ETL mono-schéma (contraintes de nommage)
Si tout doit être réalisé au sein d'un seul schéma, utiliser un système de pré-fixage des noms :
bde_table, bdt_table, dw_table.
Rappel
Accès inter-schémas sous Oracle - p.53
*
11
Stéphane Crozat
Proposition d'architecture simplifiée pour un ETL ex nihilo, batch, non incrémental
Processus ETL
12
Stéphane Crozat
Proposition d'architecture simplifiée pour un ETL ex nihilo, batch, non incrémental
Exemple
Complément
(Kimball, Caserta, 2004, p56-59)(Kimball, Caserta, 2004)- p.61 ¨
*
13
Stéphane Crozat
Projet Fantastic : Rappel
Projet Fantastic :
Rappel III
Cet exercice est la suite du projet Fantastic commencé dans le module Introduction à la
modélisation dimensionnelle (http://dwh.crzt.fr/mod).
L'objectif de cet exercice est :
1. d'implémenter le data warehouse précédemment modélisé sous Oracle (serveur
sme-oracle.sme.utc)
2. d'implémenter un processus ETL (ex nihilo, batch, non incrémental) permettant de
l'alimenter avec Oracle et PL/SQL
Rappel : Problème
Projet Fantastique : Problème posé - p.57
*
14
Stéphane Crozat
Implémentation simplifiée d'une zone d'extraction avec Oracle
Implémentation
simplifiée d'une zone IV
d'extraction avec
Oracle
Dans cette partie nous précisons comment implémenter pratiquement la zone E d'un processus ETL
simple, ex nihilo, batch, non incrémental avec une base Oracle RORO- p.60 > (version 9i ou
*
postérieure).
ETL, pour offrir un unique point d'accès à l'ensemble des sources de données.
La BD est composée de :
tables permettant de rapatrier les données à importer depuis des sources externes ;
et de vues pour se connecter à des sources dynamiques situées dans la même BD.
Méthode : Les fichiers CSV
Les données situées dans des fichiers CSV doivent :
1. être rapatriées sur un ou des serveurs accessibles depuis la BDE ;
2. importées dans la BDE : une table pour chaque fichier.
Il faudra automatiser le processus de copie des fichiers si les données sont susceptibles d'être mises à
jour.
Remarque : Tables externes
Certains SGBD, comme Oracle, propose une alternative à l'import, grâce à un concept de table
externe qui permet de lier dynamiquement une définition de table à un fichier CSV.
Méthode : Les autres fichiers : tableurs, XML...
Pour les fichiers autres que CSV, deux solutions sont à étudier :
soit votre BDE offre une API d'accès direct à ces formats ;
soit le fichier est transformé en CSV.
15
Stéphane Crozat
Implémentation simplifiée d'une zone d'extraction avec Oracle
Dans le second cas, il faudra automatiser la transformation si le fichier est susceptible de mises à
jour.
Méthode : Les données stockées en BD
Pour les données stockées en BD, trois solutions sont à étudier :
si la BDE et la BD source sont sur le même SGBD, on créé simplement une vue ;
sinon, lorsque c'est possible on établit un lien dynamique entre la BDE et les tables sources
(propriétaire, ODBC ou JDBC) ;
sinon, on fait un export de la BD source dans un fichier CSV (en gérant l'automatisation de
l'export lorsque la base est vivante).
Méthode : Gestion des contraintes
Les contraintes doivent être relâchées au maximum dans la BDE pour assurer que les données
sources seront toutes correctement accessibles.
On veillera à avoir correctement documenté les contraintes connues, notamment pour les données
provenant de SGBD dans lesquels ces contraintes sont formalisées dans le schéma.
2. Sources de données
Méthode : Données sur le même serveur Oracle
Réaliser des vues pour accéder dynamiquement aux données sources.
Méthode : Données dynamiques en fichier CSV
Créer une table externe Oracle pour accéder dynamiquement à ce fichier.
Si le fichier n'est pas accessible directement depuis le serveur Oracle, procéder à une copie
(automatisée par script).
Méthode : Données statiques
Pour les données ne demandant aucune mise à jour, ou des mises à jour très ponctuelles :
faire un export depuis la source en CSV ;
créer une table Oracle dans la BDEBDE- p.60 > ;
*
16
Stéphane Crozat
Implémentation simplifiée d'une zone d'extraction avec Oracle
Attention
« All directories are created in a single namespace and are not owned by an individual schema »
http://docs.oracle.com/cd/B19306_01/server.102/b14200/statements_5007.htm
17
Stéphane Crozat
Implémentation simplifiée d'une zone d'extraction avec Oracle
Exemple
1 CREATE OR REPLACE DIRECTORY monRepertoireSrc AS '/user1c/nf26/nf26/projet/csv/';
2 CREATE OR REPLACE DIRECTORY monRepertoireLog AS
'/volsme/user1x/uvs/nf26/nf26p099/test/';
3/
18
Stéphane Crozat
Implémentation simplifiée d'une zone d'extraction avec Oracle
Attention : Accès
L'accès à la source externe CSV par Oracle ne se fait en fait qu'à la première interrogation (SELECT
), donc il est nécessaire d'exécuter un appel à la table pour valider cet accès (seule une vérification
syntaxique est faite au moment du CREATE TABLE, le fichier CSV peut même ne pas exister).
En pratique si les données comportent des erreurs, les problèmes se déclareront à ce moment là. On
consultera le fichiers de log et des enregistrements rejetés pour le savoir.
1 SELECT * FROM Timport;
19
Stéphane Crozat
Implémentation simplifiée d'une zone d'extraction avec Oracle
Exemple
Soit la table tTypeDefaut à charger avec un fichier tTypdeDefaut.txt.
1 tTypeDefaut (#pkTypeDefaut:number(4), libelle:varchar(50),
fkFamilleDefaut:char(1)=>tFamilleDefaut)
20
Stéphane Crozat
Implémentation simplifiée d'une zone d'extraction avec Oracle
21
Stéphane Crozat
Projet Fantastic : Mise en place de la zone d'extraction
Exercice : Projet
Fantastic : Mise en V
place de la zone
d'extraction
L'objectif est d'abord de créer la BDE. Les noms des tables et vues seront préfixés :
f_ dans le schéma bde (f pour projet Fantastique) ;
ou f_bde_ si vous ne disposez que d'un seul schéma pour toutes vos BD.
Question 1
[Solution n°1 p 59]
Utiliser l'instruction CREATE OR REPLACE VIEW pour la création de la vue, pour permettre la
recréation de la vue par le script f_bde.sql.
22
Stéphane Crozat
Projet Fantastic : Mise en place de la zone d'extraction
Question 2
[Solution n°2 p 59]
Créez une table externe pour chacun des fichiers marketing.ods et departementsInsee2003.txt.
Indices :
Faites un export CSV du fichier marketing.ods vers le fichier marketing.csv
Copiez le, ainsi que departementsInsee2003.txt, dans un dossier data de votre compte
sur le serveur sme-oracle.sme.utc
Ouvrez l'accès à ce dossier en lecture (chmod 755)
Créez un dossier tmp ouvert en lecture et écriture (chmod 777)
Créez les objets DIRECTORY permettant de pointer sur les répertoires data et tmp.
Créez une table externe pour departementsInsee2003.txt, en envoyant les fichiers de
rejet departementsInsee2003.txt.bad et de log departementsInsee2003.txt.log
dans votre dossier tmp.
Testez votre table externe : SELECT * FROM ...
Vérifiez que tout s'est bien passé en examinant les fichiers de rejet et de log
De la même façon, créez une table externe pour marketing.csv et vérifier l'accès aux
données
Pensez que les objets DIRECTORY sont partagés au niveau de toute l'instance et ne sont pas
spécifiques à un schéma.
Donc si deux users créent un même DIRECTORY nommé tmp, il y aura un conflit (la seconde
création écrasera la première).
Pour accéder à un répertoire d1 situé dans un répertoire d0, d0 doit être accessible en exécution (
chmod 711).
Pour lire les fichiers .log et .bad :
1 more ~/tmp/import.log
2
3 more ~/tmp/import.bad
Vous pouvez vider les fichiers .log régulièrement pour en faciliter la lecture.
1 echo > ~/tmp/import.log
Vous pouvez supprimer les fichiers .bad après avoir traité les causes d'un rejet (si une exécution ne
génère pas de rejet elle ne crée pas de fichier de rejet, et ne modifie donc pas un éventuel fichier
existant).
1 rm ~/tmp/import.bad
23
Stéphane Crozat
Projet Fantastic : Mise en place de la zone d'extraction
Question 3
[Solution n°3 p 59]
Notez qu'en cas d'erreur à l'import portant sur toutes les lignes, le fichier de log risque de devenir très
volumineux, pouvant conduire à la saturation de votre compte. Videz le fichier de log après avoir
généré une telle erreur.
Pour vérifier la taille du log :
ls -l ~/tmp/import.log
Pour tester toutes les lignes : SELECT count(*), min(...), max(...), max(...) ...
24
Stéphane Crozat
Implémentation simplifiée d'une zone de transformation avec Oracle
Implémentation
simplifiée d'une zone VI
de transformation
avec Oracle
Dans cette partie nous précisons comment implémenter pratiquement la zone T d'un processus ETL
simple, ex nihilo, batch, non incrémental avec une base Oracle RORO- p.60 > (version 9i ou
*
postérieure).
qui les autorise - qui permet d'accéder aux données de façon stable (principe
d'encapsulation).
L'API de la BDT permet de rendre le chargement du data warehouse moins dépendant aux
variations dans les sources de données.
Le principe proposé est le suivant :
Créer une fonction pour chaque attribut existant dans la data warehouse.
Appeler ces fonctions lors du chargement du data warehouse, au lieu d'appeler directement les
attributs des tables de la BDT.
Chaque fonction est en charge d'appeler les attributs de la BDT et de faire les traitements
nécessaires pour fournir la valeur souhaitée.
Exemple : Exemple d'appel à l'API de la BDT en RO
1 SELECT t.fpk(), t.fdate(), t.fjds(), t.fmois(), t.ftrimestre()
2 FROM t_date t
25
Stéphane Crozat
Implémentation simplifiée d'une zone de transformation avec Oracle
Attention
On notera que la zone de transformation copie depuis la zone d'extraction les données en l'état, sans
transformation. Donc elle contient des données encore "sales".
En revanche, les données qui sortent de cette zone pour aller vers la zone d'analyse - les données
disponibles via l'API - sont traitées et donc "propres".
2. Implémentation de la zone T en RO
Méthode
On crée une table pour chaque vue, table externe et table classique de la zone d'extraction.
Ces tables sont créées selon la syntaxe SQL3 du modèle relationnel-objet (afin de pouvoir
accepter des méthodes).
On a donc un attribut disponible dans la zone T pour chaque attribut de la zone
E.
On déclare une méthode pour chaque attribut que l'on souhaite exporter dans le modèle
dimensionnel.
Cette méthode permettra de réaliser dynamiquement les transformations et vérifications
adéquates.
On a donc une méthode disponible dans la zone T pour chaque attribut voulu
dans le DW.
26
Stéphane Crozat
Implémentation simplifiée d'une zone de transformation avec Oracle
Complément
Plans d'exécution sous Oracle 9i - p.55
*
27
Stéphane Crozat
Implémentation simplifiée d'une zone de transformation avec Oracle
contraintes, ces dernières ne pourront être réactivées tant que les erreurs n'auront pas été corrigées.
Méthode : Préalable à la réactivation
Oracle fournit un script (utlexcpt.sql) pour la création d'une table qui va servir à récupérer les
éventuelles erreurs détectées suite à la réactivation des contraintes.
1 -- utlexcpt.sql
2 create table exceptions(row_id rowid,
3 owner varchar2(30),
4 table_name varchar2(30),
5 constraint varchar2(30));
Une fois les erreurs corrigées, l'opération de réactivation des contraintes peut être renouvelée.
Complément : Désactivation des contraintes et suppression des index
Un contexte qui nécessite la désactivation des contraintes pour améliorer des performances de
chargement nécessitera également la suppression des index, également gourmands en ressources lors
de la création ou mise à jour des données. Ces index seront recréés une fois le chargement terminé.
28
Stéphane Crozat
Implémentation simplifiée d'une zone de transformation avec Oracle
Lors du passage de la zone d'extraction à la zone de transformation, les contraintes qui bloquent
doivent être levées pour laisser passer les données et lors du passage de la zone de transformation à
la zone d'exploitation, les méthodes doivent gérer tous les cas de figure problématiques.
29
Stéphane Crozat
Projet Fantastic : Mise en place de la zone de traitement
Exercice : Projet
Fantastic : Mise en VII
place de la zone de
traitement
L'objectif est à présent de créer la BDT en RO. Les noms des tables et vues seront
préfixés :
f_ dans le schéma bdt
ou f_bdt_ si vous ne disposez que d'un seul schéma pour toutes vos BD.
Question 1
[Solution n°4 p 59]
Créez une table RO f_bdt_catalogue avec les attributs de la vue catalogue f_bde_catalogue et
une méthode pour chaque attribut de la dimension produit..
Indices :
Les méthodes ne sont pas implémentées pour le moment.
Pensez à déclarer les contraintes et index explicitement pour pouvoir les désactiver plus tard, avant les
chargements massifs.
30
Stéphane Crozat
Projet Fantastic : Mise en place de la zone de traitement
Question 2
[Solution n°5 p 59]
Créez une table RO f_bdt_magasin destinée à recevoir la jointure des tables associées à
marketing.ods et departementsInsee2003.txt.
Indices :
Les départements ne sont pas identifiés exactement de la même façon dans les deux tables
f_bde_dpt et f_bde_marketing, il n'est donc pas possible des les joindre directement.
Une solution consiste à créer deux vues f_bdt_dpt et f_bdt_marketing qui vont permettre
d'ajuster les valeurs avant la jointure. Par exemple :
La vue f_bdt_dpt renvoie directement les valeurs de f_bde_dpt (on peut éventuellement
s'en passer)
La vue f_bdt_marketing renvoie des valeurs corrigées qui peuvent être jointes à
f_bdt_dpt
D'autres solutions auraient été :
De gérer la modification directement dans la requête INSERT vers f_bdt_magasin
De faire l'insertion dans f_bdt_magasin via un script PL/SQL (qui traite les cas
problématiques)
De copier les données de f_bde_marketing dans une table f_bdt_marketing, d'exécuter
un script corrigeant les données, puis de faire le INSERT
...
Pour traiter le problème des numéros de département qui sont de type 1, 2 ... au lieu de 01, 02... on
peut utiliser un CASE dans un SELECT :
1 SELECT
2 CASE WHEN TO_NUMBER(dpt)<10 THEN '0'||TO_NUMBER(dpt) ELSE dpt END AS dpt,
3 ...
4 FROM f_bde_marketing;
Question 3
[Solution n°6 p 59]
Créez une table RO f_bdt_date avec un seul attribut qui recevra les valeurs d'un select distinct
dat ... depuis la table externe permettant d'accéder à data.csv.
Question 4
[Solution n°7 p 59]
Question 5
[Solution n°8 p 59]
Écrivez la procédure d'import BDE->BDT en suivant bien les étapes du processus de chargement.
Indices :
Désactivez vos contraintes et index avant le chargement.
Vérifiez votre import (pas de rejet, vérification du nombre de lignes...)
Penser à valider votre transaction (COMMIT).
Question 6
[Solution n°9 p 59]
Implémentez une première version des méthodes qui ne fera aucun traitement pour le moment : la
méthode retourne soit un attribut sans transformation, soit une constante si ce n'est pas possible.
31
Stéphane Crozat
Implémentation simplifiée d'un data warehouse avec Oracle
Implémentation
simplifiée d'un data VIII
warehouse avec
Oracle
Dans cette partie nous précisons comment implémenter pratiquement la zone L d'un processus ETL
simple, ex nihilo, batch, non incrémental avec une base Oracle RORO- p.60 > (version 9i ou
*
postérieure).
32
Stéphane Crozat
Implémentation simplifiée d'un data warehouse avec Oracle
Modèle dimensionnel
1 CREATE TABLE t_produit (
2 pk_num number,
3 a_designation varchar(50),
4 a_type char(3)
5 );
6
7 CREATE UNIQUE INDEX idx_produit_num
8 ON t_produit (pk_num);
9 ALTER TABLE t_produit
10 ADD CONSTRAINT cstr_produit_num PRIMARY KEY (pk_num)
11 ADD CONSTRAINT cstr_produit_type CHECK (a_type in ('CD', 'DVD'));
12
13 ...
33
Stéphane Crozat
Implémentation simplifiée d'un data warehouse avec Oracle
34
Stéphane Crozat
Projet Fantastic : Mise en place de la zone d'exploitation
Exercice : Projet
Fantastic : Mise en IX
place de la zone
d'exploitation
L'objectif est maintenant de créer le DW en R. Les noms des tables et vues seront
préfixés :
f_ dans le schéma dw
ou f_dw_ si vous ne disposez que d'un seul schéma pour toutes vos BD.
Question 1
[Solution n°10 p 59]
Question 2
[Solution n°11 p 59]
Question 3
[Solution n°12 p 59]
Documentez votre processus ETL complet en effectuant une carte des données.
35
Stéphane Crozat
Projet Fantastic : Implémentation des transformations
Exercice : Projet
Fantastic : X
Implémentation des
transformations
Question 2
[Solution n°14 p 59]
Implémentez les méthodes effectuant un simple return pour la dimension "magasin" (aucun traitement).
Question 3
[Solution n°15 p 59]
Question 4
[Solution n°16 p 59]
Implémentez des méthodes effectuant des tests de vérification de format et lorsque c'est nécessaire un
reformatage pour la dimension "produit".
Question 5
[Solution n°17 p 59]
36
Stéphane Crozat
Rappels
Rappels
XI
Rappels Oracle pour l'ETL 37
Rappels triggers pour l'ETL 42
Rappels Oracle RO 45
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
Syntaxe
1 CREATE VIEW <nom de vue> <nom des colonnes>
2 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é.
Exemple
1 CREATE VIEW Employe (Id, Nom)
2 AS
3 SELECT N°SS, Nom
4 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.
Remarque : Vue en lecture et vue en écriture
Une vue est toujours disponible en lecture, à condition que l'utilisateur ait les droits spécifiés grâce
au LCDLCD- p.60 > . Une vue peut également être disponible en écriture dans certains cas, que l'on peut
*
restreindre aux cas où la question ne porte que sur une seule table (même si dans certains cas, il est
possible de modifier une vue issue de plusieurs tables).
Dans le cas où une vue est destinée à être utilisée pour modifier des données, il est possible d'ajouter
la clause "WITH CHECK OPTION" après la spécification de question, pour préciser que les données
modifiées ou ajoutées doivent effectivement appartenir à la vue.
37
Stéphane Crozat
Rappels
Attention : /
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 "/".
Complément
http://stackoverflow.com/questions/3024418/two-plsql-statements-with-begin-and-end-run-fine-seperately-but-not-together
Exemple : Procédure
1 CREATE OR REPLACE PROCEDURE pHello (who VARCHAR2)
2 IS
3 BEGIN
4 DBMS_OUTPUT.PUT_LINE('Hello ' || who);
5 END;
6/
Syntaxe : Fonction
1 FUNCTION nom_func
2 RETURN type_retourné
3 IS
38
Stéphane Crozat
Rappels
4 ...
5 BEGIN
6 ...
7 RETURN valeur;
8 [EXCEPTION]
9 ...
10 END ;
Exemple : Fonction
1 CREATE OR REPLACE FUNCTION fDateDuJour RETURN date
2 IS
3 vDate date;
4 BEGIN
5 SELECT SYSDATE INTO vDate FROM DUAL;
6 RETURN vDate;
7 END;
8/
Attention
Le type de retourné par une fonction ne doit pas spécifier de taille :
RETURN varchar
et non RETURN varchar(10)
http://docs.oracle.com/cd/B13789_01/server.101/b10759/statements_5009.htm
Syntaxe : Anonyme
1 [DECLARE]
2 ...
3 BEGIN
4 ...
5 [EXCEPTION]
6 ...
7 END ;
39
Stéphane Crozat
Rappels
40
Stéphane Crozat
Rappels
1 PKNUM TO_CHAR(DEBUT,'FMDAY')
2 ----- ----------------------
3 1 monday
4 2 tuesday
1 DEBUT
2 ---------
3 01-JAN-01
4 02-JAN-01
5 08-JAN-01
Complément
TO_CHAR(date) ; TO_CHAR(date)
TO_CHAR(number)
TO_DATE(char) ; TO_DATE(char)
Formatage
41
Stéphane Crozat
Rappels
1 BEGIN
2 DBMS_OUTPUT.PUT_LINE ('Hello World');
3 END;
Le langage SQLSQL- p.60 > fournit trois instructions pour gérer les transactions.
*
Cette syntaxe est optionnelle (voire inconnue de certains SGBDSGBD- p.60 > ), une transaction étant
*
débutée de façon implicite dès qu'instruction est initiée sur la BDBD- p.60 > .
*
Cette instruction SQL signale la fin d'une transaction couronnée de succès. Elle indique donc au
gestionnaire de transaction que l'unité logique de travail s'est terminée dans un état cohérent est que
les données peuvent effectivement être modifiées de façon durable.
Syntaxe : Fin incorrecte d'une transaction
1 ROLLBACK TRANSACTION (ou ROLLBACK) ;
Cette instruction SQL signale la fin d'une transaction pour laquelle quelque chose s'est mal passé.
Elle indique donc au gestionnaire de transaction que l'unité logique de travail s'est terminée dans un
état potentiellement incohérent et donc que les données ne doivent pas être modifiées en annulant les
modifications réalisées au cours de la transaction.
Remarque : Programme
Un programme est généralement une séquence de plusieurs transactions.
Ils permettent de renforcer l'intégrité des données (mais on préférera des contraintes
"check", "unique" ou "foreign key" quand c'est possible).
Ils permettent d'auditer des actions sur une table.
Ils permettent de calculer des valeurs dérivées pour d'autres colonnes de la table.
Ils constituent ainsi une des solutions pour l'implémentation des attributs dérivés.
42
Stéphane Crozat
Rappels
Types de triggers
Syntaxe : Trigger
1 CREATE [OR REPLACE] TRIGGER nom_trigger {BEFORE|AFTER}
2 [INSERT OR][UPDATE [OF nom_colonne] OR][DELETE]
3 ON nom_Table
4 [FOR EACH ROW [WHEN (condition)] ]
5 DECLARE
6 [variable declarations]
7 BEGIN
8 instructions
9 END;
Attention : 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).
43
Stéphane Crozat
Rappels
4 );
5
6 CREATE OR REPLACE TRIGGER trIntervenant
7 BEFORE DELETE OR INSERT ON tIntervenant
8 FOR EACH ROW
9 BEGIN
10 IF DELETING THEN
11 INSERT INTO tIntervenantSav VALUES (:old.pknom, :old.prenom);
12 ELSIF INSERTING THEN
13 DELETE FROM tIntervenantSav WHERE pknom = :new.pknom;
14 END IF;
15 END;
16 /
17
18 DELETE FROM tCours;
19 DELETE FROM tIntervenant;
20 SELECT * FROM tIntervenantSav;
1 PKNOM PRENOM
2 -------------------- --------------------
3 CROZAT Stéphane
4 JOUGLET Antoine
5 VINCENT Antoine
1 PKNOM PRENOM
2 -------------------- --------------------
3 JOUGLET Antoine
4 VINCENT Antoine
Fondamental
Il ne faut pas lire des données d'une table en cours de modification autrement que par les accès
":old" et ":new".
44
Stéphane Crozat
Rappels
Attention
Il ne faut pas modifier de données dans les colonnes des "primary key", "foreign key", ou "unique
key" d'une table.
Attention
Il ne faut pas lire des données d'une table en cours de modification autrement que par les accès :old
et :new.
3. Rappels Oracle RO
45
Stéphane Crozat
Rappels
6 ) [NOT FINAL];
7/
8 CREATE TYPE BODY nom_type
9 IS
10 MEMBER FUNCTION nom_fonction1 (...) RETURN type_fonction1
11 IS
12 BEGIN
13 ...
14 END ;
15 MEMBER FUNCTION nom_fonction2 ...
16 ...
17 END ;
18 END ;
19 /
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).
Fondamental : OID
Les enregistrements d'une table-objet peuvent être identifiés par un OIDOID- p.60 >
*
Fondamental : Méthodes
Des méthodes peuvent être associées à une table-objet.
46
Stéphane Crozat
Rappels
Complément : 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.
Exemple
1 CREATE OR REPLACE TYPE typIntervenant AS OBJECT(
2 pknom varchar2(20),
3 prenom varchar2(20)
4 );
5/
6
7 CREATE TABLE tIntervenant OF typIntervenant (
8 PRIMARY KEY(pknom),
9 prenom NOT NULL
10 );
Attention
L'utilisation d'un alias est obligatoire pour accéder aux méthodes.
Exemple
1 CREATE OR REPLACE TYPE BODY typCours IS
2 MEMBER FUNCTION fin RETURN DATE
3 IS
4 BEGIN
5 RETURN SELF.debut + 5;
6 END;
7 END;
8/
9
10 SELECT c.pkannee, c.pknum, c.fin()
11 FROM tCours c;
Lorsque l'on écrit une méthode on a généralement besoin d'utiliser les attributs propres (voire
d'ailleurs les autres méthode), 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.
47
Stéphane Crozat
Rappels
Syntaxe : SELF
1 self.nom_attribut
2 self.nom_méthode(...)
48
Stéphane Crozat
Compléments
Compléments
XII
Éléments avancés pour l'ETL 49
Complément
(Kimball et al., 2008, p.382-384)(Kimball et al., 2008)- p.61 ¨
*
Remarque
Les approches 2 et 3 ne pose pas de problème si :
les problèmes sont très minoritaires
répartis sur la population des faits
traités au fur et à mesure
Méthode : Rejeter
Créer une copie de la structure du DW pour accueillir les données rejetées
Ajouter un espace de stockage des commentaires (raison du rejet...)
Méthode : Laisser passer
Adopter une approche permettant de laisser systématiquement passer les données (par
exemple en joutant des valeurs d'erreur dans les dimensions)
Logger dans une table ad hoc les cas traités par défaut
49
Stéphane Crozat
Compléments
Attention
Il faut mémoriser la correspondance entre la clé identifiant la dimension dans le système
transactionnel et la clé artificielle dans le data warehouse.
Pour cela :
soit les tables sont persistantes dans la zone T
soit les clés du système transactionnel doivent être conservées dans le DW
Attention : Optimisation
Les jointures à présent nécessaires diminuent les performances de chargement
Une indexation adéquate est requise
Rappel
Les faits n'ont pas besoin d'être identifiés.
Complément : OID
Sous Oracle en RO, il est possible d'utiliser les OID à la place de clés artificielles.
Le problème sera que les OID ne sont connus qu'après insertion dans la DB, ils ne peuvent être créés
dans la BDT puis transféré dans le DW.
Il faut déclarer les tables du DW en mode RO, en conservant les clés d'origine
Puis substituer les clés étrangères par des REF dans la table des faits, en faisant la jointure
entre la table des faits de la BDT avec les dimensions du DW
Ajout de faits
50
Stéphane Crozat
Compléments
ou il faut une méthode qui permette de discriminer les faits déjà intégrés des
nouveaux (et l'on se rapporte au cas précédent)
Méthode
Vider la BDT sera de préférence la dernière étape de l'ETL (assimilant le transfert BDT->DW à un
déplacement)
1. BDE->BDT
2. BDT->DW
3. Vider BDT
Attention
Si la BDT permet de calculer des attributs d'agrégation de faits, il est nécessaire qu'elle conserve
l'ensemble des données pour effectuer ses calculs.
Dans ce cas, plutôt que de vider la BDT on utilisera un attribut de discrimination ( flag) qui
mémorisera les données déjà transférées des nouvelles données.
Ajout de dimensions
51
Stéphane Crozat
Compléments
52
Stéphane Crozat
Ressources annexes
Contenus annexes
Un schéma Oracle correspond au sein d'une base de données (instance Oracle) à un
espace isolé comportant toutes les tables appartenant à d'un utilisateur du SGBD. Ainsi
chaque utilisateur possède un schéma.
Pour simplifier on pourrait plutôt dire qu'une base Oracle est en fait une collection de
BD et qu'un schéma est une BD.
Lorsqu'un utilisateur se connecte il se connecte généralement dans son propre schéma. Il
lui est néanmoins possible de travailler sur les tables d'autres schémas, à condition
d'avoir les droits associés bien entendu.
Méthode
Pour enregistrer un script SQL ou PL/SQL écrit dans Oracle SQL Developer sous la forme
d'un fichier utiliser la fonction file > save as.
Méthode
Pour exécuter un fichier SQL ou PL/SQL utiliser la commande @fichier.sql
Exemple : script.sql
1 @file1.sql
2 @file2.sql
3 @file3.sql
53
Stéphane Crozat
Contenus annexes
Rappel
Par opposition aux fonctions de calcul SQL qui s'appliquent sur toute la table pour réaliser
des agrégats (en ne renvoyant qu'une seule valeur par regroupement), les fonctions
"mono-ligne" sont des fonctions au sens classique, qui s'appliquent à une ou plusieurs valeurs
et renvoient une valeur en retour.
Les fonctions "mono-ligne" :
Manipulent des éléments de données
Acceptent des arguments en entrée et retournent des valeurs en sortie
Agissent sur chaque ligne
Retournent un seul résultat par ligne
Peuvent modifier les types de données
Exemple
Traitement de chaîne
Concat, substr, length, insrt, lpad, trim
Lower, upper, initcap
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
Traitement numérique
Round, Trunc
Floor, Ceil
Mod
Conversion
Conversion implicite
Conversion explicite : TO_DATE, TO_NUMBER, TO_CHAR
Générales
NVL (par exemple NVL(X,0) renvoie 0 si X vaut Null)
CASE WHEN condition1 THEN valeur1 WHEN condition2 THEN valeur2
ELSE valeur3 END
Imbrication de fonctions : F3(F2(F1(col,arg1),arg2),arg3)
Méthode
Les fonctions mono-ligne sont utilisées pour :
Transformer les données
Formater des dates et des nombres pour l'affichage
Convertir des types de données de colonnes
...
Exemple : Extraction de chaîne
La fonction substr(X, A, B) renvoie les B caractères à partir du caractère A dans la
chaîne X.
Complément
Fonctions SQL
Vous pouvez consulter Oracle : SQLw_loria.fr/~roegel(1)- p.62 ¨ , page 9 à 12, pour avoir une
*
54
Stéphane Crozat
Contenus annexes
Une fois les instructions d'activation exécutées toute question SQL se termine par un
affichage du plan d'exécution. On observe ainsi toutes les opérations faites par le moteur
de requête. On notera que la lecture se fait du bas vers le haut : Ainsi dans l'exemple
simple ci-avant le moteur commence par effectuer un balayage complet des tables
t_ventes et t_client, puis la jointure entre ces deux tables, puis il renvoit le résultat
pour la question posée, le SELECT.
On notera les indicateurs suivants pour chaque ligne du plan :
Cost est un indicateur de coût de calcul de la requête à ce stade (exemple : le
coût de l'opération de balayage de la table t_client est de 2). Cet indicateur est
une synthèse estimée des différents coûts (accès disque, CPU, etc.), sans unité qui
ne sert donc qu'à comparer différents plans entre eux.
55
Stéphane Crozat
Contenus annexes
Card est une estimation a priori du nombre de lignes remontées par la requête à
ce stade (exemple : le nombre de lignes remontées par la jointure est de 409).
Bytes est le volume de données concernée par la requête à ce stade (exemple : le
volume global de données pour le SELECT est de 38446 octets).
Attention
Pour que les plans soient correctement évalués a priori - et donc que Oracle fasse les bons
choix d'optimisation - il est nécessaire d'exécuter les instructions ANALYSE.
Les statistiques doivent être recalculées après chaque modification de la structure de la base
ainsi qu'après chaque changement significatif des données.
Une base Oracle contient le catalogue complet de l'entreprise que chaque magasin a à sa
disposition.
Cette base, composée d'une seule table publique catalogue, est disponible sur le
serveur Oracle sme-oracle.sme.utc, sous le schéma nf26.
Un fichier contient une consolidation de l'ensemble des ventes de l'année passée réalisées
dans chaque magasin.
Ces données sont disponibles sous la forme d'un fichier CSV dans un répertoire du
serveur sme-oracle.sme.utc : /home/nf26/data
La structure du fichier est : Numéro de ticket, date de ticket, produit, magasin
Un fichier ODS géré par la direction marketing contient pour chaque magasin
l'organisation des rayonnages : marketing.ods
Le responsable des ventes de chaque département décide de l'organisation des
rayonnages des magasins de son département.
Il existe 3 types de rayonnage : par Auteur (A), par Année (Y), par Éditeur (E)
Le fichier est déposé dans un répertoire du serveur sme-oracle.sme.utc :
/home/nf26/fantastic
Méthode
Inspecter les données pour chaque source :
56
Stéphane Crozat
Contenus annexes
Vous travaillez en tant qu'ingénieur spécialisé dans les systèmes décisionnels au siège de
l'entreprise française "Fantastique".
L'entreprise "Fantastique" vend principalement des ouvrages de divertissement de type
science fiction, thriller, policier... Elle dispose pour cela de plusieurs magasins de vente
dans les centres des grandes villes en France.
La direction de l'entreprise souhaite faire une étude large sur les ventes de l'année passée
afin de prendre des orientations stratégiques nouvelles : ouverture de nouveaux magasins,
fermeture ou transfert de magasins mal implantés, extension territoriale à de nouveaux
départements français, réorganisation des directions, réorientation du marketing,
élargissement ou réduction du catalogue, etc.
Fondamental
La question posée est donc : quels sont les facteurs sur lesquels l'on pourrait jouer
pour augmenter les ventes ?
Elle vous charge dans ce cadre de mettre en place une solution logicielle permettant
d'intégrer les données pertinentes et de pouvoir les interroger efficacement sous des angles
divers.
Notons que bien entendu, la direction éclairée de l'entreprise ne compte pas se fier à ces
seuls facteurs de ventes pour prendre ses décisions, mais bien privilégier les facteurs
sociaux et territoriaux, en dialoguant avec ses salariés et ses clients, pour maintenir sa
mission culturelle et son rôle d'entreprise citoyenne. Votre posture d'ingénieur est bien
entendu de se préoccuper de ces dimensions fondamentales, même si elles seront
largement ignorées dans le cadre de cet exercice à vocation essentiellement technique.
Elle pourront néanmoins être brièvement abordées en marge de vos rapports d'analyse.
Introduction
Oracle 9i propose une extension au LDD SQL pour créer explicitement des vues
matérialisées plutôt que la gestion manuelle classique consistant à créer une table et à
l'alimenter manuellement avec une requête de type INSERT.
Rappel
Une vue matérialisée est un stockage statique (dans une table) d'un résultat de requête. Il
permet donc d'anticiper des requêtes complexes en pré-calculant tout ou partie du résultat.
Vues concrètes - p.58
*
57
Stéphane Crozat
Contenus annexes
Attention
Oracle ne pourra pas toujours inférer automatiquement que des vues matérialisées sont
utilisables à la place des tables originales. Il est donc nécessaire dans ce cas de réécrire
soi-même les requêtes concernées. En pratique c'est souvent le cas si les vues sont complexes.
Remarque
Une vue matérialisée peut être indexée ou partitionnée comme toute table Oracle.
Un moyen de traiter le problème des requêtes dont les temps de calcul sont très longs et
les fréquences de mise à jour faible est l'utilisation de vues concrètes.
58
Stéphane Crozat
Questions de synthèse
59
Stéphane Crozat
Glossaire
Abréviations
60
Stéphane Crozat
Bibliographie
Bibliographie
Kimball R., Ross M., Thornthwaite W., Mundy J., Becker B. (2008, 1998). The Data Warehouse Lifecycle
Toolkit. Wiley Publishing, second edition.
Kimball R., Caserta J. (2004). The Data Warehouse ETL Toolkit. Wiley Publishing.
61
Stéphane Crozat
Webographie
Webographie
62
Stéphane Crozat