Université Paris XIII Institut Galilée Master 2-EID BENSI Ahmed CHARIFOU Evelyne Devoir Data WareHouse Optimisation, Transformation et Mise à jour utilisées par un ETL Mr R. NEFOUSSI Année 2007-2008
FICHE A Objectifs : Le Data WareHouse gère des données volumineuses Exercice 1 : Préparation de l environnement 1. Le script correspondant à la création et à l alimentation des tables est disponible à l adresse suivante : http:abensi.free.frdwhfiche_a.sql 2. Ajout pour chacune des tables au moins une ligne. INSERT INTO CLIENT (CD_PAYS, ID_APPLI, ID_FINANC, ID_CLT,CD_STATUT, DER_NUM_CTL, ID_DER_DEMAND, NOTE_CLIENT, POURCENT_PERTE) VALUES ('DE','01','fin1','ctl1','C', ' ','1',60,10); INSERT INTO CLIENT (CD_PAYS, ID_APPLI, ID_FINANC, ID_CLT,CD_STATUT, DER_NUM_CTL, ID_DER_DEMAND, NOTE_CLIENT, POURCENT_PERTE) VALUES ('DE','01','fin1','ctl1','C', ' ','1',63,15); INSERT INTO CLIENT (CD_PAYS, ID_APPLI, ID_FINANC, ID_CLT,CD_STATUT, DER_NUM_CTL, ID_DER_DEMAND, NOTE_CLIENT, POURCENT_PERTE) VALUES ('FR','01','fin2','ctl1','C', ' ','1',50,20); INSERT INTO FINANCEMENT (CD_PAYS, ID_APPLI, ID_FINANC, ID_DEMANDE, ID_ACCEPTATION, DT_DEBUT_PRELEV, DT_COMPTABLE, MNT_TOTAL_FINANC, ID_RESP_SAISIE_CTR, DTD_PRELEV_PREVUE, DT_CREAT_FINANC) VALUES ('DE','01','fin1','dem1','accep1','27122002','sysdate',20000,'id2000',TO_DATE('10052007 00:00:00', 'MMDDYYYY HH24:MI:SS'), TO_DATE('04032007 00:00:00', 'MMDDYYYY HH24:MI:SS')); INSERT INTO DETAIL_FINANC (CD_PAYS, ID_APPLI, ID_FINANC, ID_CAR, ID_PROMO, TX_PROMO, MNT_TOTAL_FINANC, NBRE_MOIS, TY_PAIEMENT, MNT_MOIS, CD_PRELEV, DT_CREAT) VALUES ('DE', '01', 'fin1', 'car1', 'pr2', 12, 20000, 36, 'P', 555.55, 'P', TO_DATE('09042006 00:00:00', 'MMDDYYYY HH24:MI:SS')); COMMIT; 3. Liste des financements des Clients dont le CD_PA= DE ordonnée par CD_PAYS, ID_APPLI, ID_FINANC. SELECT * FROM CLIENT C, FINANCEMENT F, DETAIL_FINANC D WHERE F.ID_FINANC=C.ID_FINANC AND D.ID_FINANC=C.ID_FINANC AND C.CD_PAYS='DE' ORDER BY C.CD_PAYS, C.ID_APPLI, F.ID_FINANC; M2EID TP_DWH : Fiche A 14
Exercice 2 : Gestion des doublons dans la table «CLIENT» 1. Génération des doublons DECLARE ind NUMBER; begin for ind in 1..5 loop INSERT INTO CLIENT (CD_PAYS, ID_APPLI, ID_FINANC, ID_CLT,CD_STATUT, DER_NUM_CTL, ID_DER_DEMAND, NOTE_CLIENT, POURCENT_PERTE) VALUES ('FR','01','fin1','ctl1','C', ' ','1',50,20); INSERT INTO CLIENT (CD_PAYS, ID_APPLI, ID_FINANC, ID_CLT,CD_STATUT, DER_NUM_CTL, ID_DER_DEMAND, NOTE_CLIENT, POURCENT_PERTE) VALUES ('FR','01','fin2','ctl1','C', ' ','2',52,15); INSERT INTO CLIENT (CD_PAYS, ID_APPLI, ID_FINANC, ID_CLT,CD_STATUT, DER_NUM_CTL, ID_DER_DEMAND, NOTE_CLIENT, POURCENT_PERTE) VALUES ('DE','01','fin1','ctl1','C', ' ','1',60,10); end loop; end; commit; 2. Suppression de tous les doublons : * pour CD_PAYS='FR' * delete from client where (CD_PAYS, ID_APPLI, ID_FINANC, ID_CLT,CD_STATUT, DER_NUM_CTL, ID_DER_DEMAND, NOTE_CLIENT, POURCENT_PERTE) IN( select CD_PAYS, ID_APPLI, ID_FINANC, ID_CLT,CD_STATUT, DER_NUM_CTL, ID_DER_DEMAND, NOTE_CLIENT, POURCENT_PERTE from client where CD_PAYS = 'FR' group by CD_PAYS, ID_APPLI, ID_FINANC, ID_CLT,CD_STATUT, DER_NUM_CTL, ID_DER_DEMAND, NOTE_CLIENT, POURCENT_PERTE having count(*)>1); M2EID TP_DWH : Fiche A 24
* Garder 1 des doublons pour CD_PAYS='DE' * delete from client where ROWID not in(select maxi from( select max(rowid) maxi, CD_PAYS, ID_APPLI, ID_FINANC, ID_CLT,CD_STATUT, DER_NUM_CTL, ID_DER_DEMAND, NOTE_CLIENT, POURCENT_PERTE from client tabrne where CD_PAYS='DE' and (CD_PAYS, ID_APPLI, ID_FINANC, ID_CLT,CD_STATUT, DER_NUM_CTL, ID_DER_DEMAND, NOTE_CLIENT, POURCENT_PERTE) in( select CD_PAYS, ID_APPLI, ID_FINANC, ID_CLT,CD_STATUT, DER_NUM_CTL, ID_DER_DEMAND, NOTE_CLIENT, POURCENT_PERTE from client where (CD_PAYS, ID_APPLI, ID_FINANC, ID_CLT,CD_STATUT, DER_NUM_CTL, ID_DER_DEMAND, NOTE_CLIENT, POURCENT_PERTE) in( select CD_PAYS, ID_APPLI, ID_FINANC, ID_CLT,CD_STATUT, DER_NUM_CTL, ID_DER_DEMAND, NOTE_CLIENT, POURCENT_PERTE from ( select CD_PAYS, ID_APPLI, ID_FINANC, ID_CLT,CD_STATUT, DER_NUM_CTL, ID_DER_DEMAND, NOTE_CLIENT, POURCENT_PERTE, count(*) from client where CD_PAYS = 'DE' group by CD_PAYS, ID_APPLI, ID_FINANC, ID_CLT,CD_STATUT, DER_NUM_CTL, ID_DER_DEMAND, NOTE_CLIENT, POURCENT_PERTE having count(*)>1) res) ) group by CD_PAYS, ID_APPLI, ID_FINANC, ID_CLT,CD_STATUT, DER_NUM_CTL, ID_DER_DEMAND, NOTE_CLIENT, POURCENT_PERTE ) ) AND (CD_PAYS, ID_APPLI, ID_FINANC, ID_CLT,CD_STATUT, DER_NUM_CTL, ID_DER_DEMAND, NOTE_CLIENT, POURCENT_PERTE) IN (select CD_PAYS, ID_APPLI, ID_FINANC, ID_CLT,CD_STATUT, DER_NUM_CTL, ID_DER_DEMAND, NOTE_CLIENT, POURCENT_PERTE from client where CD_PAYS = 'DE' group by CD_PAYS, ID_APPLI, ID_FINANC, ID_CLT,CD_STATUT, DER_NUM_CTL, ID_DER_DEMAND, NOTE_CLIENT, POURCENT_PERTE having count(*)>1); M2EID TP_DWH : Fiche A 34
Exercice 3 : Gestion des dattes nulle dans la table «FINANCEMENT» 1. Insertion de plusieurs lignes dont 'DT_COMPTABLE' à nulle. select CD_PAYS,ID_APPLI,ID_FINANC from FINANCEMENT where DT_COMPTABLE is null order by CD_PAYS,ID_APPLI,ID_FINANC ; 2. Lignes dont la 'DT_COMPTABLE' est nulle ordonner par CD_PAYS,ID_APPLI, ID_FINANC. select CD_PAYS,ID_APPLI,ID_FINANC from FINANCEMENT where DT_COMPTABLE is null order by CD_PAYS,ID_APPLI,ID_FINANC ; 3. Remplacer la date 'DT_COMPTABLE' par la date du jour est nulle ordonné par CD_PAYS,ID_APPLI,ID_FINANC. select CD_PAYS, ID_APPLI, ID_FINANC, ID_DEMANDE, ID_ACCEPTATION, DT_DEBUT_PRELEV,decode(DT_COMPTABLE,null,sysdate),MNT_TOTAL_FINANC, ID_RESP_SAISIE_CTR,DTD_PRELEV_PREVUE, DT_CREAT_FINANC from FINANCEMENT where DT_COMPTABLE is null order by CD_PAYS,ID_APPLI,ID_FINANC ; M2EID TP_DWH : Fiche A 44
FICHE B Objectifs : Extraction des données pour un chargement dans un DWH Exercice 1 : Schéma relationnel de la BD Ecole Le script correspondant à la création et à l alimentation des tables est disponible à l adresse suivante : http:abensi.free.frdwhbd_ecole.sql Exercice 2 : Utilisation de l utilitaire EXP Exportation de toutes les tables d un schéma : exp M2EID08_07evelyne file=tables.txt Vérification, juste un aperçu : Prêt à exporter les objets M2EID08_07.... export des liens de base de données (DATABASE LINKS). export des numéros de séquence. export des définitions de cluster. Prêt à exporter les tables M2EID08_07... via le chemin classique..... export de la table ACTIVITES 7 lignes exportées <.. export de la table ACTIVITES_PRATIQUEES 22 lignes exportées <.. export de la table AGGLOMERATION 5 lignes exportées <.. export de la table ARTICLES 10000 lignes exportées <.. export de la table CHARGE 13 lignes exportées <.. export de la table CLIENT 5000 lignes exportées < EXP-00091: Export de statistiques constestables... export de la table CLIENT_BYLIST.. export de la partition NORD 1999 lignes exportées <.. export de la partition SUD 2001 lignes exportées <.. export de la partition REST 1000 lignes exportées < EXP-00091: Export de statistiques constestables. EXP-00091: Export de statistiques constestables... export de la table CLIENTS 100 lignes exportées <.. export de la table COMMANDES 1000 lignes exportées <.. export de la table COURS 5 lignes exportées <.. export de la table DETAILCOM 2552 lignes exportées <.. export de la table DW_COURS 0 lignes exportées <.. export de la table DW_ELEVES 0 lignes exportées <.. export de la table DWH_COURS 0 lignes exportées <.. export de la table DWH_ELEVES 0 lignes exportées <.. export de la table DWH_PROFESSEURS 0 lignes exportées <.. export de la table DW_PROFESSEURS 0 lignes exportées <.. export de la table ELEVES 10 lignes exportées <.. export de la table EST_CHARGE_DE 0 lignes exportées <.. export de la table ETUDIE_A 0 lignes exportées < M2EID TP_DWH : Fiche B 13
Exportation des tables ELEVES, PROFESSEURS, ACTIVITES : exp M2EID08_07evelyne file=tables.dmp tables=eleves,professeurs,activites Vérification : Connecté à : Oracle Database 10g Enterprise Edition Release 10.1.0.2.0 - Production With the Partitioning, OLAP and Data Mining options Export fait dans le jeu de car WE8ISO8859P15 et jeu de car NCHAR AL16UTF16 le serveur utilise le jeu de caractères WE8ISO8859P1 (conversion possible) Prêt à exporter les tables spécifiées... via le chemin classique..... export de la table ELEVES 10 lignes exportées <.. export de la table PROFESSEURS 8 lignes exportées <.. export de la table ACTIVITES 7 lignes exportées < Procédure d'export terminée avec succès sans avertissements. Exercice 3 : Utilisation du spooler Extraction des données des tables COURS, RESULTATS, CHARGES : spool tables.txt select num_cours ';' nom ';' nbheures ';' annee from cours; select num_eleve ';' num_cours ';' points from resultats; select num_prof ';' num_cours from charge; column num_cours format A10 column nom format A20 spool off Vérification en consultant le fichier tables.txt : NUM_COURS ';' NOM ';' NBHEURES ';' ANNEE --------------------------------------------------------------------- 1;Réseau;15;1 2;Sgbd;30;1 3;Programmation;15;1 4;Sgbd;30;2 5;Analyse;60;2 Exercice 4 : Utilisation de PLSQL Extraction des données de la table PROFESSEURS, qui enseignent sql : M2EID TP_DWH : Fiche B 23
set serveroutput on size 450000 set feedback off set termout off spool professeurs_sql.txt DECLARE CURSOR C1 IS SELECT * from PROFESSEURS where specialite='sql'; enreg_c1 c1%rowtype; BEGIN DBMS_OUTPUT.put_line('NUM_PROF NOM SPECIALITE DATE_ENTREE DER_PROM SALAIRE_BASE SALAIRE_ACTUEL'); OPEN C1; LOOP FETCH C1 into enreg_c1; exit when c1%notfound; DBMS_OUTPUT.put_line(enreg_c1.num_prof ';' enreg_c1.nom ';' enreg_c1.specialite ';' enreg_c1.date_entree ';' enreg_c1.der_prom ';' enreg_c1.salaire_base ';' enreg_c1.salaire_actuel); END LOOP; CLOSE C1; exception when others then null; END; Exit spool off Vérification en consultant le fichier professeurs_sql.txt : NUM_PROF NOM SPECIALITE DATE_ENTREE DER_PROM SALAIRE_BASE SALAIRE_ACTUEL 4;Pastecnov;sql;011075;;2500000;2500000 5;Selector;sql;151082;011088;1900000;1900000 8;Pucette;sql;061288;290296;2000000;2500000 M2EID TP_DWH : Fiche B 33
FICHE C Objectifs : Curseur pour extraction et transformations des données Exercice 1 : schéma relationnel de la BD Ecole Le script correspondant à la création et à l alimentation des tables est disponible à l adresse suivante : http:abensi.free.frdwhbd_ecole.sql Exercice 2 : Création des tables Copie de la structure des tables Professeurs, Cours et Eleves : create table dwh_professeurs as select * from professeurs where 1=2; create table dwh_eleves as select * from eleves where 1=2; create table dwh_cours as select * from cours where 1=2; Modification des colonnes des tables dw_* de type date : alter table dwh_professeurs modify date_entree varchar2(8); alter table dwh_professeurs modify der_prom varchar2(8); alter table dwh_eleves modify date_naissance varchar2(8); Vérification : SQL> desc dwh_eleves Nom NULL? Type ----------------------------------------- -------- ---------------------------- NUM_ELEVE NOT NULL NUMBER(4) NOM NOT NULL VARCHAR2(25) PRENOM NOT NULL VARCHAR2(25) DATE_NAISSANCE VARCHAR2(8) POIDS NUMBER ANNEE NUMBER Exercice 3 : Utilisation de PLSQL pour l extraction et la transformation des données M2EID TP_DWH : Fiche C 13
Il faut remplacer 'yyyymmaa' par yyyymmdd pour le format de la date. Procédure pour alimenter la table dwh_professeurs : CREATE OR REPLACE PROCEDURE proc_alimprof IS CURSOR cur_1 IS SELECT * from PROFESSEURS; enreg_cur_1 cur_1%rowtype; BEGIN OPEN cur_1; LOOP FETCH cur_1 into enreg_cur_1; exit when cur_1%notfound; insert into DWH_PROFESSEURS ( num_prof, nom, specialite, date_entree, der_prom, salaire_base, salaire_actuel ) values ( enreg_cur_1.num_prof, enreg_cur_1.nom, enreg_cur_1.specialite, to_char ( enreg_cur_1.date_entree, yyyymmdd ), to_char ( enreg_cur_1.der_prom, yyyymmdd ), enreg_cur_1.salaire_base, enreg_cur_1.salaire_actuel ); END LOOP; CLOSE cur_1; exception when others then null; END; Procédure pour alimenter la table dwh_eleves CREATE OR REPLACE PROCEDURE proc_alimeleves IS CURSOR cur_2 IS SELECT * from ELEVES; enreg_cur_2 cur_2%rowtype; BEGIN OPEN cur_2; LOOP FETCH cur_2 into enreg_cur_2; exit when cur_2%notfound; insert into DWH_ELEVES ( num_eleve, nom, prenom, date_naissance, poids, annee ) values ( enreg_cur_2.num_eleve, enreg_cur_2.nom, enreg_cur_2.prenom, to_char (enreg_cur_2.date_naissance, yyyymmdd ), enreg_cur_2.poids, enreg_cur_2.annee ); END LOOP; CLOSE cur_2; exception when others then null; END; Procédure pour alimenter la table dwh_cours : CREATE OR REPLACE PROCEDURE proc_alimcours IS CURSOR cur_3 IS SELECT * from COURS; enreg_cur_3 cur_3%rowtype; BEGIN OPEN cur_3; LOOP M2EID TP_DWH : Fiche C 23
FETCH cur_3 into enreg_cur_3; exit when cur_3%notfound; insert into DWH_COURS ( num_cours, nom, nbheures, annee ) values ( enreg_cur_3.num_cours, enreg_cur_3.nom, enreg_cur_3.nbheures, enreg_cur_3.annee ); END LOOP; CLOSE cur_3; exception when others then null; END; Exécution des procédures et validation : SQL> Exec proc_alimprof ; Procédure PLSQL terminée avec succès. SQL> Exec proc_alimeleves ; Procédure PLSQL terminée avec succès. SQL> Exec proc_alimcours ; Procédure PLSQL terminée avec succès. SQL> Commit ; Validation effectuée. M2EID TP_DWH : Fiche C 33
FICHE D Objectifs : Chargement des données d un DWH Exercice 1 : schéma relationnel de la BD Ecole Le script correspondant à la création et à l alimentation des tables est disponible à l adresse suivante : http:abensi.free.frdwhbd_ecole.sql Exercice 2 : Utilisation de la sqlldr pour le chargement des tables Exportation des tables: exp M2EID08_07tiger TABLES=(ELEVES,PROFESSEURS,COURS) FILE = tp_etl_fiche_d.dmp LOG = tp_etl_fiche_d.log exp : commande d export nomlogin TABLES : tables a exporter FILE : fichier de sortie (qui contient les tables) LOG : trace de la transaction Vérification : SQL> select count(*) from professeurs; COUNT(*) ---------- 8 SQL> select count(*) from cours; COUNT(*) ---------- 5 SQL> select count(*) from eleves; COUNT(*) ---------- 10 Fichier tp_etl_fiche_d.log : Connecté à : Oracle Database 10g Enterprise Edition Release 10.1.0.2.0 - Production With the Partitioning, OLAP and Data Mining options Export fait dans le jeu de car WE8ISO8859P15 et jeu de car NCHAR AL16UTF16 le serveur utilise le jeu de caractères WE8ISO8859P1 (conversion possible) Prêt à exporter les tables spécifiées... via le chemin classique..... export de la table ELEVES 10 lignes exportées <.. export de la table PROFESSEURS 8 lignes exportées <.. export de la table COURS 5 lignes exportées < Procédure d'export terminée avec succès sans avertissements. M2EID TP_DWH : Fiche D 14
Effacement des tables: Delete from PROFESSEURS ; Delete from COURS ; Delete from ELEVES ; Chargement des tables : sqlldr CONTROL=etl1.clt, LOG=tp_etl.log, USERID=M2EID08_07evelyne, ERRORS=999, LOAD=2000, DISCARDMAX=5 CONTROL: nom fichier de contrôle LOG : Fichier d'informations sur le chargement. USERID : nom utilisateur + passwd. ERRORS : Nombre d'erreurs d'insertion. LOAD : Nombre maximum d'enregistrements. DISCARDMAX : Maximum de lignes rejetable Fichier etl1.ctl : LOAD DATA INFILE 'tp_etl_fiche_d.txt' TRUNCATE INTO TABLE ELEVES FIELDS TERMINATED BY ';' ( ) NUM_ELEVE, NOM, PRENOM, DATE_NAISSANCE, POIDS, ANNEE INTO TABLE COURS FIELDS TERMINATED BY ';' ( NUM_COURS, NOM, NBHEURES, ANNEE ) INTO TABLE PROFESSEURS FIELDS TERMINATED BY ';' ( NUM_PROF, NOM, SPECIALITE, DATE_ENTREE, DER_PROM, SALAIRE_BASE, SALAIRE_ACTUEL ) M2EID TP_DWH : Fiche D 24
EXERCICE 3 : Utilisation de l utilitaire IMP pour charger les tables Suppression des tables : Drop table PROFESSEURS ; Drop table COURS ; Drop table ELEVES ; Le fichier tp_etl_fiche_d.txt contient également la structure des tables. Chargement des tables avec l utilitaire IMP imp M2EID08_07evelyne file=tp_etl_fiche_d.txt tables=(eleves,professeurs,cours) Vérification: Fichier d'export créé par EXPORT:V10.01.00 via le chemin classique import effectué dans le jeu de caractères WE8ISO8859P15 et le jeu NCHAR AL16UTF16 le serveur d'import utilise le jeu de caractères WE8ISO8859P1 (conversion possible). Import d'objets M2EID08_07 dans M2EID08_07.. Import de la table "ELEVES" 10 lignes importées <.. Import de la table "PROFESSEURS" 8 lignes importées <.. Import de la table "COURS" 5 lignes importées < Fin de l'import réussie avec avertissements. EXERCICE 4 : Utilisation de PLSQL pour charger les tables Creation des tables : create table dw_professeurs as select * from professeurs ; create table dw_eleves as select * from eleves ; create table dw_cours as select * from cours ; Effacement des tables : delete from PROFESSEURS ; delete from COURS ; delete from ELEVES ; Chargement des tables à l aide de 3 procédures : CREATE OR REPLACE PROCEDURE proc_alimprof IS CURSOR cur_1 IS SELECT * from DW_PROFESSEURS; enreg_cur_1 cur_1%rowtype; BEGIN OPEN cur_1; LOOP FETCH cur_1 into enreg_cur_1; exit when cur_1%notfound; insert into PROFESSEURS ( num_prof, nom, specialite, date_entree, der_prom, salaire_base, salaire_actuel ) values ( enreg_cur_1.num_prof, enreg_cur_1.nom, enreg_cur_1.specialite, enreg_cur_1.date_entree, enreg_cur_1.der_prom, enreg_cur_1.salaire_base, enreg_cur_1.salaire_actuel); END LOOP; CLOSE cur_1; exception when others then null; END; CREATE OR REPLACE PROCEDURE proc_alimeleves IS CURSOR cur_2 IS SELECT * from DW_ELEVES; M2EID TP_DWH : Fiche D 34
enreg_cur_2 cur_2%rowtype; BEGIN OPEN cur_2; LOOP FETCH cur_2 into enreg_cur_2; exit when cur_2%notfound; insert into ELEVES ( num_eleve, nom, prenom, date_naissance, poids, annee ) values ( enreg_cur_2.num_eleve, enreg_cur_2.nom, enreg_cur_2.prenom, enreg_cur_2.date_naissance, enreg_cur_2.poids, enreg_cur_2.annee); END LOOP; CLOSE cur_2; exception when others then null; END; CREATE OR REPLACE PROCEDURE proc_alimcours IS DECLARE CURSOR cur_3 IS SELECT * from DW_COURS; enreg_cur_3 cur_3%rowtype; BEGIN OPEN cur_3; LOOP FETCH cur_3 into enreg_cur_3; exit when cur_3%notfound; insert into COURS ( num_cours, nom, nbheures, annee ) values ( enreg_cur_3.num_cours, enreg_cur_3.nom, enreg_cur_3.nbheures, enreg_cur_3.annee ); END LOOP; CLOSE cur_3; exception when others then null; END; Exécution des procédures et validation : SQL> Exec proc_alimprof ; Procédure PLSQL terminée avec succès. SQL> Exec proc_alimeleves ; Procédure PLSQL terminée avec succès. SQL> Exec proc_alimcours ; Procédure PLSQL terminée avec succès. SQL> Commit ; Validation effectuée. M2EID TP_DWH : Fiche D 44