Introduction À l'ETL Et Application Avec Oracle: Data Warehouse
Introduction À l'ETL Et Application Avec Oracle: Data Warehouse
Introduction À l'ETL Et Application Avec Oracle: Data Warehouse
l'ETL et application
avec Oracle
Data warehouse
http://dwh.crzt.fr
Stéphane Crozat
1 septembre 2016
Table des
matières
Objectifs 5
Introduction 6
II -
incrémental
10
4. Exemple de chargement de données depuis un CSV par une table externe .................. 20
22
VI -
25
VII -
31
IX -
37
38
XI - Rappels 39
XII - Compléments 54
Abréviations 62
Bibliographie 63
Webographie 64
Objectifs
Savoir implémenter un data warehouse avec un SGBD relationnel
Savoir implémenter un processus ETL vers un data warehouse
5
Stéphane Crozat
Introduction
- Volume de cours : 4h
- Volume d'exercice : 12h (hors compléments)
6
Stéphane Crozat
Principes généraux d'un processus ETL
Principes généraux
d'un processus ETL I
1. Principe de l'ETL
Définition : Processus "Extraction, Transformation, Load"
L'ETL * 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.
Fondamental
Selon Kimball (2004, p.xxi) * * 70% de l'effort consacré à un projet de BI est dépensé dans l'ETL.
- développé ex nihilo pour un projet directement dans un langage bas niveau (Java, SQL,
PL/SQL...) ;
- ou s'appuyer sur un outil d'ETL (Talend Open Studio, Pentaho Data Integration, Informatica
PowerCenter, ...).
7
ETL en mode batch ou en mode flux
Fondamental
ETL Tool versus Hand Coding (Buy a Tool Suite or Roll Your Own?)
XML * ...)
*
- ...
Un ETL alimente en général un data warehouse par des processus batch périodiques.
8
ETL incrémental
Il existe néanmoins des applications nécessitant des data warehouses alimentés en temps réel en
mode flux (qui ne sont pas abordés dans le cadre de ce cours).
4. ETL incrémental
Définition : ETL non incrémental
Classiquement les faits s'accumulent dans le data warehouse, il n'y a jamais ni suppression ni mise à
jour (croissance monotone).
Lorsqu'une dimension est mise à jour, l'ETL doit garder la mémoire des anciennes valeurs afin que
les anciens faits restent bien reliés aux anciennes valeurs.
Ils existent plusieurs stratégies pour gérer l'historique des valeurs des dimensions dans le DW :
- associer des dates aux dimensions et aux faits afin de savoir quelle valeur de dimension est
valide pour quel fait ;
- créer de nouvelles entrées dans les dimensions (ne pas faire de mise à jour au sens
d'UPDATE) ;
- ...
- Rafraîchissement périodique
- Rafraîchissement manuel
- Rafraîchissement événementiel
- ...
9
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 :
Nous proposons une architecture d'ETL organisée avec trois zones composées chacune d'une base de
données distincte :
- Zone d'extraction
Une base de données destinée à unifier les sources de données et offrir un point d'accès
unique.
- Zone de transformation
Une base de données destinée à traiter les sources et offrir une interface d'accès aux données
transformées (API * ).
*
- Zone d'exploitation
Une base de données destinée à implémenter le data warehouse et les data marts.
10
Conseils méthodologiques
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).
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
11
Carte des données
Processus ETL
La carte des données (logical data map) est un inventaire et une mise en correspondance des
données présentes dans chaque zone.
12
Carte des données
Exemple
Complément
13
Projet Fantastic : Rappel
Projet Fantastic :
Rappel III
Cet exercice est la suite du projet Fantastic commencé dans le module Introduction à la
modélisation dimensionnelle.
Rappel : Problème
14
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 RO * * (version 9i ou postérieure).
La BDE * est une BD * relationnelle destinée à implémenter la zone d'extraction d'un ETL, pour
* *
- 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.
Il faudra automatiser le processus de copie des fichiers si les données sont susceptibles d'être mises à
jour.
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.
15
Sources de données
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.
Dans le second cas, il faudra automatiser la transformation si le fichier est susceptible de mises à
jour.
- 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).
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
Si le fichier n'est pas accessible directement depuis le serveur Oracle, procéder à une copie
(automatisée par script).
Pour les données ne demandant aucune mise à jour, ou des mises à jour très ponctuelles :
16
Tables externes sous Oracle
Une table externe sous Oracle est une méthode d'accès sans copie à des fichiers CSV dynamiques
exactement comme s'il s'agissait d'une table de la BD.
Le répertoire de la source et le fichier source doivent être accessibles en lecture pour le processus
Oracle.
Le répertoire des fichiers de log doit être accessible en lecture et écriture pour le processus Oracle.
17
Tables externes sous 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
« One important point to remember is that comments must be placed before any access parameters.
If you include comments in the access parameter sections, Oracle will throw an error when you
query the external table but not when you are creating it. »
https://oracleappsnotes.wordpress.com/2012/02/10/oracle-external-tables-a-few-examples/
Exemple
18
Tables externes sous Oracle
13 BADFILE monRepertoireLog:'import.bad'
14 LOGFILE monRepertoireLog:'import.log'
15 FIELDS TERMINATED BY ';'
16 OPTIONALLY ENCLOSED BY '"'
17 )
18 LOCATION ('sources.csv'))
19 REJECT LIMIT UNLIMITED;
1 DESCRIBE Timport;
2 SELECT TABLE_NAME, TYPE_NAME, DEFAULT_DIRECTORY_NAME FROM
USER_EXTERNAL_TABLES;
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.
Si les volumes de donnée sont importants (s'il y a beaucoup de lignes), privilégiez l'usage de la
clause ROWNUM pour éviter de faire transiter des méga-octets de données entre le serveur et le
client. Les délais de réaction en seront améliorés.
Vous pouvez aussi utiliser des SUM, MIN, MAX, etc. pour être sûr que toutes les lignes et colonnes
sont correctement lues.
19
Exemple de chargement de données depuis un CSV par une table externe
Une fois la procédure terminée effectuer un count(*) pour déterminer si l'import a bien traité
toutes les lignes du fichier source.
Remarque : NUMBER(X)
Pour spécifier des entiers dans les tables externes, utiliser NUMBER(X), avec le (X) obligatoire.
RECORDS DELIMITED BY newline signifie que le caractère standard du système est utilisé
comme caractère de fin de ligne.
Or :
Donc, si un fichier CSV est encodé sous un système et lu sous un autre, il y aura un problème. Par
exemple si le fichier est encodé sous Windows il aura "\r\n" à la fin de chaque ligne, et s'il est lu
sous Linux, Oracle cherchera uniquement un "\n", d'où un "\r" résiduel sera considéré comme
faisant partie du dernier champ.
Conseil
Penser à gérer les fichiers de rejet et de log. Le plus simple est de les supprimer après une exécution
incorrecte.
- Les fichiers de rejet ne sont pas créés si l'exécution est correcte (et donc un éventuel fichier
existant n'est pas modifiée par une exécution correcte)
- Les fichiers de log grossissent à chaque exécution
Il est possible d'utiliser les tables externes pour charger des données issues d'un fichier CSV dans
une table existante.
Exemple
20
Insertion CSV manuelle avec SQL Developer
Effectuer un clic droit sur le dossier tables à gauche dans SQL Developer et choisir Import data
pour accéder à un assistant de chargement manuel.
21
Exercice : 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 :
Question 1
Indices :
- Créez un fichier f_bde.sql qui va appeler toutes vos instructions de création d'objets
dans la BDE.
Sa première ligne est donc : @f_bde_catalogue.sql
- On pourra éventuellement créer un fichier f.sql qui appellera les scripts f_bde.sql,
f_bdt.sql et f_dw.sql
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
Exercice : Projet Fantastic : Mise en place de la zone d'extraction
Question 2
Créez une table externe pour chacun des fichiers marketing.ods et departementsInsee2003.
txt.
Indices :
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).
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.
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
Exercice : Projet Fantastic : Mise en place de la zone d'extraction
Question 3
Indices :
Attention le fichier data.csv est très volumineux, aussi ne faites pas de SELECT * dessus,
sous peine d'attendre longtemps la fin de l'exécution (le serveur devant renvoyer plusieurs Mo
de données).
Faites des SELECT partiels avec la clause ROWNUM pour limiter les données à rapatrier et des
select avec opérations de regroupement (min ou max typiquement).
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.
ls -l ~/tmp/import.log
Pour tester toutes les lignes : SELECT count(*), min(...), max(...), max(...) ...
24
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 RO * * (version 9i ou postérieure).
L'API de la BDT est un ensemble de fonctions - ou méthodes si l'on dispose d'un SGBDRO * * 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.
- 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.
25
Zone T : Transformation
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".
Les transformations simples, typiquement qui ne nécessitent qu'un seul enregistrement en entrée,
seront effectuées directement et dynamiquement par les fonctions de l'API (ou des fonctions appelées
par celles-ci).
Les transformations plus complexes devront être réalisées par des procédures exécutées en batch
après le chargement de la BDT.
Méthode : Vues
Les vues doivent être utilisées pour unifier (UNION) ou joindre (JOIN) les différentes tables
physiques qui représentent une même donnée logique.
Les vue matérialisées peuvent être utilisées et rafraîchies à chaque mise à jour de la zone T.
Les contraintes de la zone T doivent être compatibles avec les données sources afin de :
- laisser passer 100% des données depuis la zone E (sans contrainte) vers la zone T (avec
contrainte) ;
- s'assurer le maximum d'information sur la nature de données
Si les contraintes sont trop relâchées, il faudra faire des vérifications inutiles pour contrôler des
données, qui en fait avaient déjà les propriétés souhaitées.
26
Implémentation de la zone T en RO
Si les contraintes sont trop fortes, toutes les données ne passeront pas.
Complément
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.
Pour les méthodes simples ne portant que sur un enregistrement à la fois, la méthode est attachée à
la table correspondante.
Pour les transformations complexes nécessitant un script préalable, la méthode est associée à la table
où est stockée le résultat de ce script.
Des vues peuvent être créées pour unifier l'accès aux tables.
Rappel : Contraintes
Pour chaque hypothèse de "propreté" des données sources on pose une contrainte associée.
- Par exemple si une donnée doit être une clé primaire et que l'on pense que les sources sont
correctes de ce point de vue, on ajoute la clause PRIMARY KEY.
- Par contre il ne faut pas ajouter les contraintes lorsque l'on sait que les données sources sont
"sales", sans quoi ces données seront refusées au chargement et ne pourront jamais être
nettoyées.
- Dans le doute, il est parfois utile de donner des tailles de champs plus grandes que celle
attendues (par exemple une chaîne de 50 caractères au lieu de 20) ou bien des types plus
permissifs (une chaîne au lieu d'une date) afin de ne pas bloquer ou tronquer d'enregistrement.
Le relâchement des contraintes demandera un travail plus important d'implémentation des méthodes.
- Lorsque les données sources sont "propres" et qu'elles sont copiées telle qu'elle dans la cible, la
méthode associée se contente d'un return de l'attribut correspondant.
- Lorsqu'un traitement est nécessaire, il est implémenté au sein de la méthode.
27
Désactivation et réactivation de contraintes
Fondamental
Pour être "propre" une donnée doit déjà respecter les contraintes souhaitées dans la zone T
(condition nécessaire, non suffisante).
Dans tous les autres cas, la méthode doit effectuer des vérifications et traitements.
Pensez également à rafraîchir les vues matérialisées, puis à exécuter les collectes de statistiques sur
ces vues.
Complément
Le chargement dans la base dimensionnelle, si les méthodes de transformation ont été correctement
écrites, ne comporte que des données valides. De plus ce chargement va impliquer un nombre très
important de données. Il est donc souhaitable de désactiver les contraintes sur le modèle
dimensionnel pendant le temps de chargement, afin d'accélérer cette procédure.
- à chaque ajout d'une ligne le moteur de la base va devoir vérifier que cette ligne respecte les
contraintes ;
- de plus si les données ne sont pas chargées exactement dans le bon ordre, des contraintes de
type intégrité référentielle peuvent être temporairement non validées.
Précisons enfin qu'une fois le chargement terminé les contraintes seront réactivées afin de vérifier
que les méthodes de transformation ont fait correctement leur travail et que les données respectent
effectivement les contraintes du modèle dimensionnel. Si les nouvelles données ne respectent pas les
contraintes, ces dernières ne pourront être réactivées tant que les erreurs n'auront pas été corrigées.
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));
28
Processus de chargement BDE->BDT
On notera qu'il est important pour pouvoir aisément désactiver les contraintes de les avoir
explicitement nommées lors de la création des tables.
Si les contraintes ne peuvent être réactivées du fait que certaines données ne sont plus conformes, les
enregistrements en cause seront référencés (par leur rowid) dans la table exceptions créée par le
script utlexcpt.sql. Pour retrouver ces enregistrements, exécuter une requête de sélection dans
cette table.
Une fois les erreurs corrigées, l'opération de réactivation des contraintes peut être renouvelée.
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é.
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.
8.
29
Processus de chargement BDE->BDT
Le passage d'une zone à l'autre doit toujours laisser passer toutes les données.
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.
30
Exercice : 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 :
Question 1
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 :
Pensez à déclarer les contraintes et index explicitement pour pouvoir les désactiver plus tard,
avant les chargements massifs.
31
Exercice : Projet Fantastic : Mise en place de la zone de traitement
Question 2
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 :
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
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
Question 5
Écrivez la procédure d'import BDE->BDT en suivant bien les étapes du processus de chargement.
Indices :
32
Exercice : Projet Fantastic : Mise en place de la zone de traitement
Question 6
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.
33
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 RO * * (version 9i ou postérieure).
La zone de chargement est en fait la BD en étoile ou en flocon qui implémente le data warehouse et
les data marts.
Elle reçoit une copie des données sous leur forme transformée (depuis la zone T) disponible pour
l'exploitation.
Rappel
L'implémentation d'un modèle dimensionnel en base relationnelle ne diffère pas dans sa première
phase de celle d'un modèle transactionnel.
34
Processus de chargement BDT->DW
On utilisera typiquement la syntaxe ci-après pour déclarer une relation dotée d'une clé primaire dont
on connaît le nom et pour laquelle on connaît l'index sur lequel elle se base. Notons qu'une
déclaration classique de clé primaire aurait conduit à créer un index automatiquement, donc plus
difficile à gérer (avec un nom généré par Oracle).
Modèle dimensionnel
35
Processus de chargement BDT->DW
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.
Le passage d'une zone à l'autre doit toujours laisser passer toutes les données.
36
Exercice : 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
Question 2
Question 3
Documentez votre processus ETL complet en effectuant une carte des données.
37
Exercice : Projet Fantastic : Implémentation des transformations
Exercice : Projet
Fantastic : X
Implémentation des
transformations
Afin de finaliser l'ETL, il est à présent nécessaire de terminer l'implémentation des méthodes pour
renvoyer les valeurs recherchées.
Question 1
Indice :
Question 2
Implémentez les méthodes effectuant un simple return pour la dimension "magasin" (aucun
traitement).
Question 3
Indice :
- 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
Question 4
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
38
Rappels
Rappels
XI
1. Rappels Oracle pour l'ETL
1.1. Création de vues
Définition : 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.
Syntaxe
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
La vue Employe est ici une projection de la relation Personne sur les attributs N°SS et Nom,
renommés respectivement Id et Nom.
Une vue est toujours disponible en lecture, à condition que l'utilisateur ait les droits spécifiés grâce
au LCD * . 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).
39
Structure d'un bloc PL/SQL
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.
Les vues sont particulièrement utiles pour restituer les relations d'héritage perdues lors de la
transformation MCD * * vers MLD * .
*
Syntaxe
1 DECLARE ou IS
2 Variables, curseurs, etc.
3 BEGIN
4 Instructions SQL et PL/SQL
5 EXCEPTION
6 Gestion d'erreur.
7 END;
8/
Attention : /
Un bloc PL/SQL est terminé par un ; comme une instruction SQL.
Par ailleurs, dans les environnements d'exécution Oracle (comme 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 blocs PL/SQL par des "/".
Complément
http://stackoverflow.com/questions/3024418/two-plsql-statements-with-begin-and-end-run-fine-
seperately-but-not-together
Syntaxe : Procédure
40
Blocs PL/SQL : Procédure, fonction, bloc anonyme
Exemple : Procédure
Syntaxe : Fonction
Exemple : Fonction
Attention
- 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 ;
41
Exécution de fichiers SQL
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
Exemple : script.sql
1 @file1.sql
2 @file2.sql
3 @file3.sql
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.
Exemple
- Traitement de chaîne
- Traitement de date
42
Fonctions SQL
- Traitement numérique
- ROUND, TRUNC
- FLOOR, CEIL
- MOD
- Conversion
- Conversion implicite
- Conversion explicite : TO_DATE, TO_NUMBER, TO_CHAR
- Générales
Méthode
Complément
- Fonctions SQL
- Vous pouvez consulter Oracle : SQL * * , page 9 à 12, pour avoir une description plus détaillée
des fonctions disponibles sous Oracle.
43
Insertion de dates avec TO_DATE
7 FROM tCours
1 COURS TYPE_LABEL
2 ----- -----------------
3 1 Cours
4 2 Travaux dirigés
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.
Exemple
Complément
- TO_DATE(char) (oracle.com)
- TO_DATE(char) (techonthenet.com)
Syntaxe
1 SET SERVEROUTPUT ON
44
Transactions en SQL
1 BEGIN
2 DBMS_OUTPUT.PUT_LINE ('Hello World');
3 END;
Introduction
Cette syntaxe est optionnelle (voire inconnue de certains SGBD * ), une transaction étant débutée de
*
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.
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
Définition : 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.
45
Prédicats d'événement au sein des triggers
- 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.
Types de triggers
Syntaxe : Trigger
En général les triggers sont de type "before", en particulier pour les triggers sur ligne, c'est à dire
qu'ils s'exécutent avant que l'action considérée soit exécutée, ce qui permet d'infléchir le résultat de
cette action. Alors qu'un trigger "after" ne pourra plus modifier le tuple considéré et agira seulement
sur d'autres tuples.
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.
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).
46
Prédicats d'événement au sein des triggers
- INSERTING
- DELETING
- UPDATING
- UPDATING(nom_colonne)
Prédicats pour savoir dans quel contexte d'appel du trigger on est, ce qui permet dans un même
trigger de s'adapter aux différents cas de déclenchement.
1 PKNOM PRENOM
2 -------------------- --------------------
3 CROZAT Stéphane
4 JOUGLET Antoine
5 VINCENT Antoine
1 PKNOM PRENOM
2 -------------------- --------------------
3 JOUGLET Antoine
4 VINCENT Antoine
47
Manipulation des anciennes et nouvelles valeurs dans les triggers (:old et :new)
2.3. Manipulation des anciennes et nouvelles valeurs dans les triggers (:old et :new)
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
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".
Pour les trigger "after", il n'est plus possible de modifier les colonnes ":new".
Pour les triggers "on insert" les colonnes ":old" ont la valeur NULL.
Pour les triggers "on delete" les colonnes ":new" ont la valeur NULL.
Attention
Il ne faut pas modifier de données dans les colonnes des "primary key", "foreign key", ou "unique
key" d'une table.
48
Quelques règles à respecter pour les triggers
9 :new.debut:=null;
10 DBMS_OUTPUT.PUT_LINE('Inconsistency between debut and pkannee, debut set to null');
11 END IF;
12 END;
13 /
14
15 SET SERVEROUTPUT ON;
16
17 INSERT INTO tCours (pkannee, pknum, titre, type, fkIntervenant, debut)
18 VALUES ('2001', 3, 'SQL', 'C', 'CROZAT', TO_DATE('15-01-2001','DD-MM-YYYY'));
19
20 UPDATE tCours
21 SET debut=TO_DATE('15-01-2002','DD-MM-YYYY')
22 WHERE pknum=3;
23
24 SELECT pkannee, pknum, debut FROM tCours;
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
3.1. Création de type en SQL3 sous Oracle (extension au LDD)
49
Création de table objet (modèles et LDD)
1 CREATE TABLE t (
2 ...
3 nom_attribut nom_type,
4 ...
5)
Complément
Définition
Une table peut être définie en référençant un type de données plutôt que par des instructions LDD * *
1 nom_type : <...>
2 nom_table de nom_type (#attributs_clés) autres contraintes
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
50
Méthodes de table d'objets
Complément : Méthodes
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
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...).
Attention
51
Méthodes et SELF
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 /
Exemple
http://docs.oracle.com/cd/B13789_01/server.101/b10759/statements_5009.htm
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.
Syntaxe : SELF
1 self.nom_attribut
2 self.nom_méthode(...)
52
Méthodes et SELF
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é.
53
Compléments
Compléments
XII
1. Script de remise à zéro d'un schéma Oracle
1 Begin
2 for c in (select type_name from user_types) loop
3 execute immediate ('drop type ' || c.type_name || ' force');
4 end loop;
5 End;
6/
7 Begin
8 for c in (select object_name from user_objects where object_type='TABLE') loop
9 execute immediate ('drop table ' || c.object_name || ' cascade constraints');
10 end loop;
11 End;
12 /
13 Begin
14 for c in (select object_name from user_objects where object_type='VIEW') loop
15 execute immediate ('drop view ' || c.object_name || ' cascade constraints');
16 end loop;
17 End;
18 /
19
54
Gestion des erreurs
Complément
Remarque
Méthode : Rejeter
- 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
Méthode
- générer une clé artificielle dans pk (à l'aide d'une séquence par exemple)
55
Éléments pour l'ETL incrémental
Exemple
Attention
Pour cela :
Attention : Optimisation
Rappel
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
56
Éléments pour l'ETL incrémental
Ajout de faits
- La source des faits est remplacée à chaque incrément (les nouveaux faits remplacent les
anciens)
- il faut ajouter les nouveaux faits au fur et à mesure en relançant l'ETL, typiquement :
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
De la même façon :
57
Intégration des dimensions multi-sources
Utiliser des triggers pour auditer les données et ainsi affiner les méthodes, trouver des erreurs...
Méthode
Méthode
Il est possible de substituer cette architecture à 3 niveaux par une architecture à 2 niveaux
seulement.
Pour chaque type d'erreur créer une nouvelle entrée dans les dimensions correspondantes.
58
Exercice : Surveillance des données
- Les dates
- Les magasins
- Typologie des erreurs
- ...
59
Solutions des exercices
Solutions des
exercices
Exemple d'extraits des tables du DW avec des valeurs de dimensions ajoutées pour gérées les erreurs
(et l'usage de clés artificielles).
12 18 32
12 41 -1
-2 55 21
PK Mag ...
-2 "Inconnu" null
-1 "Null" null
12 "M145" ...
13 "M22" ...
60
Stéphane Crozat
Solutions des exercices
61
Stéphane Crozat
Signification des abréviations
Abréviations
API : Application Program Interface
BD : Base de Données
DM : Data Mart
DW : Data Warehouse
RO : Relationnel-Objet
62
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.
63
Stéphane Crozat
Webographie
Webographie
Roegel Denis, Oracle : SQL, http://www.loria.fr/~roegel/cours/iut/oracle-sql.pdf, 1999.
64
Stéphane Crozat