GÉNÉRATION D'UN FICHIER PLAT À PARTIR D'ORACLE 2



Documents pareils
Langage propre à Oracle basé sur ADA. Offre une extension procédurale à SQL

Module Administration BD Chapitre 1 : Surcouche procédurale dans les SGBDS

Devoir Data WareHouse

//////////////////////////////////////////////////////////////////// Administration bases de données

TP Contraintes - Triggers

Bases de données avancées

Cours Bases de données 2ème année IUT

Oracle Le langage procédural PL/SQL

Auto-évaluation Oracle: cours de base

A.E.C. GESTION DES APPLICATIONS TECHNOLOGIE DE L'INFORMATION LEA.BW

Les Triggers SQL. Didier DONSEZ. Université de Valenciennes Institut des Sciences et Techniques de Valenciennes

Bases de Données Avancées PL/SQL

Licence de MIDO - 3ème année Spécialités Informatique et Mathématiques Appliquées

Présentation Windows Azure Hadoop Big Data - BI

COMMANDES SQL... 2 COMMANDES DE DEFINITION DE DONNEES... 2

Configurer la supervision pour une base MS SQL Server Viadéis Services

Attaques applicatives

Utilisation de JAVA coté Application serveur couplé avec Oracle Forms Hafed Benteftifa Novembre 2008

Laboratoires de bases de données. Laboratoire n 6. Programmation SQL. par Danièle BAYERS et Louis SWINNEN

Bases de données Oracle Virtual Private Database (VPD) pour la gestion des utilisateurs d applications

Procédures Stockées WAVESOFT ws_sp_getidtable Exemple : ws_sp_getnextsouche Exemple :... 12

Partie I : Créer la base de données. Année universitaire 2008/2009 Master 1 SIIO Projet Introduction au Décisionnel, Oracle

Notes de cours : bases de données distribuées et repliquées

Cours 3. Développement d une application BD. DBA - Maîtrise ASR - Université Evry

Bases de SQL. Hacks 1-6 CHAPITRE UN


Corrigés détaillés des exercices

Bases de Données Réparties

Cours Bases de données 2ème année IUT

Mysql avec EasyPhp. 1 er mars 2006

.NET - Classe de Log

Ora2Pg. Présentation, bonnes pratiques et futur du projet

Gestion de base de données

1. Base de données SQLite

Département Génie Informatique

TP Bases de données réparties

Introduction au PL/SQL Oracle. Alexandre Meslé

ECR_DESCRIPTION CHAR(80), ECR_MONTANT NUMBER(10,2) NOT NULL, ECR_SENS CHAR(1) NOT NULL) ;

PL langage de programmation côté serveur. SQL à la base : types, expressions, requêtes

Mysql. Les requêtes préparées Prepared statements

Importation et exportation de données dans HDFS

Création d'une nouvelle base de données

INSTALLATION DE L APPLICATION DU CONTEXTE ITASTE

Gestion des transactions et accès concurrents dans les bases de données relationnelles

Installation d'un serveur FTP géré par une base de données MySQL

Création d'un site dynamique en PHP avec Dreamweaver et MySQL

Module Com231A - Web et Bases de Données Notion 5 : Formulaires et utilisation des Bases de Données avec PHP

Nuxeo 5.4 : les nouveautés

Vues: définition. Vues: avantages. Vues: inconvénients. Vues: exemple. Vues: syntaxe 08/12/2009

1-Introduction 2. 2-Installation de JBPM 3. 2-JBPM en action.7

1. Installation du Module

Pratique et administration des systèmes

BASES DE DONNEES TP POSTGRESQL

A QUOI SERVENT LES BASES DE DONNÉES?

TP Administration Oracle

Introduction à ORACLE WAREHOUSE BUILDER Cédric du Mouza

Jérôme FESSY. IUT de Paris 5. Base de Données. Cours Introductif. Base de Données

Présentation du PL/SQL

SQL. Oracle. pour. 4 e édition. Christian Soutou Avec la participation d Olivier Teste

I0035 INGÉNIEUR - DÉVELOPPEUR APPLICAT IF / DECISIONNEL CONFIRMÉE SAS - SPSS - INFORMAT ICA. 27 ans - 4 ans d'expérience

La double authentification dans SharePoint 2007

Administration des bases de données

Rootkits sous Oracle

Stockage du fichier dans une table mysql:

Le Langage SQL version Oracle

Les Utilisateurs dans SharePoint

Microsoft OSQL OSQL ou l'outil de base pour gérer SQL Server

Bon ben voilà c est fait!

ORACLE 10G DISTRIBUTION ET REPLICATION. Distribution de données avec Oracle. G. Mopolo-Moké prof. Associé UNSA 2009/ 2010

Raja Bases de données distribuées A Lire - Tutoriel

PHP et les Bases de données - Généralités

FTPS AVEC UNE APPLIANCE FAST360 EN COUPURE. Table des matières

Vulnérabilités et sécurisation des applications Web

Arbres binaires de recherche

Surveillance de Scripts LUA et de réception d EVENT. avec LoriotPro Extended & Broadcast Edition

sshgate Patrick Guiran Chef de projet support

L installation a quelque peu changée depuis les derniers tutos, voici une actualisation.

Modernisation, développement d applications et DB2 sous IBM i Technologies, outils et nouveautés Volubis.fr

Utiliser Access ou Excel pour gérer vos données

Serveur Linux : FTP. Mise en place d un service FTP sous Linux. Bouron Dimitri 20/04/2014

Cours Informatique Master STEP

Quelques aspects du Relationnel-Objet du SGBD Oracle

Secteur Tertiaire Informatique Filière étude - développement. Accueil. Apprentissage. Période en entreprise. Evaluation.

Administration des bases de données. Jean-Yves Antoine

MS SQL Express 2005 Sauvegarde des données

Installation / configuration des applications PreInscription et Inscription Web Ajax

Table des matières PRESENTATION DU LANGAGE DS2 ET DE SES APPLICATIONS. Introduction

Projet Administration Réseaux

CREATION WEB DYNAMIQUE

Le langage procédural PL-PGSQL

SYSTÈMES D INFORMATIONS

Avant-propos. Organisation du livre

Java au cœur de la base de données Oracle

Olivier Mondet

PHP et mysql. Code: php_mysql. Olivier Clavel - Daniel K. Schneider - Patrick Jermann - Vivian Synteta Version: 0.9 (modifié le 13/3/01 par VS)

Le Network File System de Sun (NFS)

Gestion des droits d accès. Quelques exemples de vulnérabilité

Playzilla - Chargement par clé usb

Guide d'installation et de configuration de Pervasive.SQL 7 dans un environnement réseau Microsoft Windows NT

Transcription:

GÉNÉRATION D'UN FICHIER PLAT À PARTIR D'ORACLE 2 1. Introduction 2 2. Contexte 2 3. Package Utl_File 2 3.1 Ouverture du fichier 3 3.2 Ajouter un "header" au fichier 3 3.3 Ecriture des lignes 3 3.4 Ajouter un "footer" au fichier 4 3.5 Fermeture du fichier 4 3.6 Exceptions Utl_File 4 4. Génération 5 1

Génération d'un fichier plat à partir d'oracle 1. Introduction Dans toute application récente, il est de plus en plus important et primordial de savoir transmettre un ensemble d'informations vers d'autres applications qui interagissent avec elle. Ces informations peuvent être transmises de plusieurs façons, entre autres sous forme d'un fichier plat. Oracle, grâce à son package Utl_File, fournit la possibilité de générer un fichier plat à partir d'un package ou d'une procédure PlSql. Je me propose dans ce document d'expliquer très simplement la procédure à suivre pour bien utiliser le package Utl_File et pour arriver très facilement à produire un ensemble d'informations rassemblé en un fichier plat. 2. Contexte Supposons que l'on soit en présence d'une application bancaire de gestion des ordres de bourses à qui il est demandé d'envoyer quotidiennement, sous forme de fichier plat, toutes les transactions boursières exécutées et comptabilisées vers une application extérieure qui peut être par exemple le "Data WareHouse" qui, à son tour, se charge de produire mensuellement des statiques de performance et de rendement sur toutes les applications de la banque. Supposons également que cette application tourne sous une plate forme Oracle. Dans ces conditions l'utilisation du package prédéfini Utl_File s'impose d'elle même. Voyons dans ce qui suit comment ai-je pu arriver à mes fins. 3. Package Utl_File Dans un premier temps on doit tout simplement commencer par créer une procédure ayant pour paramètre input le nom du fichier à générer: Create Or Replace Procedure P_Generate_File (p_file_name varchar2) IS Que fait cette procédure? En gros, elle doit rechercher toutes les transactions exécutées et comptabilisées dans la base de données et remplir le fichier par autant de lignes que de transactions trouvées. Un simple curseur ramènera toutes ces informations en question -- Cursor to get flat file row content CURSOR c_get_cltd IS SELECT * FROM Table_de_transaction Ttra WHERE Ttra.transaction a été exécutée et comptabilisée AND non encore exportée au Data WareHouse Une fois ces informations localisées, il faut les utiliser pour remplir ligne par ligne le fichier à générer. Il est bien évident que chaque ligne remplie doit suivre un layout défini au préalable par l'application destinataire. Avant d'attaquer la génération, quelques déclarations de variables obligatoires et de constantes sont à faire: -- Déclaration des paramètres utl_file l_r_filehandler UTL_FILE.FILE_TYPE; l_s_location CONSTANT VARCHAR2(255) := '/GSP/HOME/orautl'; -- location of the file l_s_open_mode CONSTANT VARCHAR2(1) := 'w'; -- write mode l_bi_max_linesize CONSTANT BINARY_INTEGER := 250; -- lenght of the file record l_s_outputline VARCHAR2(250); -- ligne containing the record l_d_currentdate DATE; -- Utilisée pour remplir le header du fichier On peut alors commencer l'écriture de la procédure proprement dite: 2

3.1 Ouverture du fichier L'ouverture du fichier à générer est la première chose à faire. Cette ouverture se fait tout simplement comme suit: BEGIN l_r_filehandler := UTL_FILE.FOPEN (location => l_s_location,filename => p_file_name,open_mode => l_s_open_mode,max_linesize => l_bi_max_linesize); où tous les paramètres sont définis plus haut. 3.2 Ajouter un "header" au fichier L'étape suivante est d'ajouter un "header" à ce fichier. Le contenu du "header" et du "footer" est généralement précisé dans les spécificités du layout. Supposons ici, que ces deux lignes doivent être remplies par la date du jour sur 12 caractères; dans ce cas on procédera comme suit : SELECT LPAD (TO_CHAR(sysdate,'YYYYMMDD', 12, '0') from dual into l_d_currentdate; que l'on ajoutera comme première ligne du fichier l_s_outputline := l_d_currentdate; UTL_FILE.PUT_LINE (file => l_r_filehandler,buffer => l_s_outputline); 3.3 Ecriture des lignes Le fichier ayant été ouvert et son header inclus, rien ne nous empêche maintenant d'embarquer dans l'écriture des lignes du fichier en faisant une boucle sur toutes les transactions ramenées par le curseur c_get_cltd (voir déclaration plus haut). -- Filling rows of the file FOR c_get_cltd_rec IN c_get_cltd LOOP BEGIN l_s_outputline := LPAD(c_get_cltd_rec.ref_transaction,10,'0') - sur 10 RPAD(c_get_cltd_rec.marche,3,' ') - sur 3 RPAD(c_get_cltd_rec.devise,3,' ') - sur 3 RPAD(c_get_cltd_rec.portfeuille,13, ' ') - sur 13 RPAD(c_get_cltd_rec.sens,3, ' ') - sur 3 LPAD(c_get_cltd_rec.instrument,20,'0') - sur 20 RPAD(c_get_cltd_rec.Isin,12,' ') - sur 12 RPAD(c_get_cltd_rec.Coval,12,'0') - sur 12 RPAD(c_get_cltd_rec.Compte_Cash,19,' ') - sur 19 RPAD(c_get_cltd_rec.devise_compte,3,' ') - sur 3 TO_CHAR(TO_DATE(c_get_cltd_rec.Dat_liquidation),'YYYYMMDD') - sur 8 LPAD(c_get_cltd_rec.ref_fiscal,20,'0') - sur 20 TO_CHAR(c_get_cltd_rec.trade_date,'YYYYMMDD') - sur 8 LPAD(c_get_cltd_rec.Quantité,10,'0'); - sur 10 l_s_outputline représente une ligne du fichier. La longueur de cette ligne est de 144. Enfin, il ne nous reste que l'ajout de cette ligne dans le fichier. Ceci se fait par le biais de la commande suivante: UTL_FILE.PUT_LINE (file => l_r_filehandler, buffer => l_s_outputline); 3

Afin de pouvoir traiter toutes les transactions, il me semble plus judicieux d'inclure une Exception Oracle si bien qu'aucune erreur, qui viendrait à se produire à l'intérieur de la boucle, ne pourra empêcher le traitement des autres transactions. EXCEPTION WHEN OTHERS THEN -- Ici on peut, par exemple, enregistrer le record en problème dans une table dédiée sur -- la base de laquelle on peut faire un écran RAISE ; -- J ai ajouté cette ligne parce que sans elle, se serait un bug caché END; -- Allez à la transaction suivante END LOOP; 3.4 Ajouter un "footer" au fichier Voilà, on arrive bientôt à la fin. On clôturera ce fichier par l'ajout d'un "footer" dans lequel on introduira, pour être simple, la même chose que pour le header SELECT LPAD (TO_CHAR(sysdate,'YYYYMMDD', 12, '0') from dual into l_d_currentdate; l_s_outputline := l_d_currentdate; UTL_FILE.PUT_LINE (file => l_r_filehandler,buffer => l_s_outputline); 3.5 Fermeture du fichier Il suffit maintenant de fermer le fichier p_file_name ouvert au début. UTL_FILE.FFLUSH (l_r_filehandler); UTL_FILE.FCLOSE (l_r_filehandler); 3.6 Exceptions Utl_File Il faut néanmoins inclure les exceptions prédéfinies liées au package Utl_File pour "trapper" toute erreur inhérente au package Utl_File. EXCEPTION WHEN UTL_FILE.INVALID_PATH THEN WHEN UTL_FILE.INVALID_MODE THEN WHEN UTL_FILE.INVALID_MAXLINESIZE THEN WHEN UTL_FILE.INVALID_FILEHANDLE THEN WHEN UTL_FILE.INVALID_OPERATION THEN WHEN UTL_FILE.WRITE_ERROR THEN END Procedure P_Generate_File; 4

4. Génération La procédure étant terminée, il lui faut maintenant un déclencheur pour l'inhiber et pour lui permettre de faire ce qu'on lui demande de faire à savoir : générer ce fameux fichier qui tarde à voir le jour. Pour cela, on peut écrire un script shell sous Unix qui défini le nom d'un fichier vide, appelle la procédure P_Generate_File et transfert le fichier rempli vers l'application destinataire. Ce script peut ressembler à ce qui suit: GenerFile : Génère un fichier plat pour le Data WareHouse Date : 17/09/2002 Author : export OUT_DIR=/GSP/HOME/orautl export EXP_DIR=DWH/data/XFER/OUT Variables initializations yymmddhhmi=`date +%Y%m%d%H%M` yymmdd=`date +%Y%m%d` basename $0 sed 's!\..*$!!' read prgname outputfile= $prgname${yymmdd}.txt Appel de la procédure P_GENERATE_FILE proc="p_generate_file('$outputfile')" ${BATCHPATH}/start_sqlplus.ksh USER ${SQL_DIR}/runproc.sql "$proc" 1 runproc.sql est un script sql qui appelle un paramètre &1 que l'on retrouve ici après "$proc". Ce paramètre représente bien évidemment P_GENERATE_FILE('$outputFile'). start_sqlplus.ksh est un shell qui permet la connexion implicite à sqlplus au user USER retcode=$? if (( retcode!= 0 )) then Erreur dans la procédure de génération exit fi Copying file to output directory (for FAST scan) cp ${OUT_DIR}/$outputFile ${EXP_DIR} exit 0 Ce job Unix peut être programmé par Tivoli par exemple pour tourner tous les jours à une heure donnée. Voilà c'est la fin la vrai fin et pas un mot de plus. 5