《论将数据从数据库导出为dat格式》由会员分享,可在线阅读,更多相关《论将数据从数据库导出为dat格式(11页珍藏版)》请在金锄头文库上搜索。
1、论将数据库中的数据导出为dat格式一、写作目的:在生产过程中,往往需要将数据库中的某个表或者视图中的数据导出为某固定格式的文 本文件,如txt、d就或xls等格式。本文以导出dat文件为例,详述在EBS环境中,如 何根据客户需求将数据库中满足条件的的数据导出为dat文件。二、客户需求:财务系统每日向ODS系统提供债券模块信息表XXBOCQ_BND_BOOK_B全量数据,保 留原格式,不做任何筛选转换调整。1、文件命名和格式:格式:dat文件、ok文件和tar文件。命名:XXBOCQ_BND_BOOK_B.dat 和 finish.日期.ok (如:finish_20160525.ok)和 fi
2、n_ 日期.tar (如:fin_20160525.tar);注:dat文件为全量数据文件,每个字段之间以T隔开,并且每行数据结尾以T结尾。 ok文件为生成dat文件后生成的就绪文件。tar文件为将dat文件打包后的文件,20160525 为数据库当前日期。2、文件存放路径:应用服务器6/ebsap/appl/outpathfile路径下,如果没有ODSFile目录,则创建ODSFile目 录,每日在ODS冋e目录下,创建以当曰日期为名称的目录,存放dat文件,ok文件以及 tar文件。3、文件字符集:传输文件采用GBK字符集编码。三、实现思路:整体思路:先通过提交EBS请求来生成dat文件和
3、ok文件,然后再通过一个请求将生成的 dat文件打包并在固定的路径下生成目标目录,并将2文件移动到目标路径。第一步:先生成dat文件。有两种生成dat文件方式:1 :通过oracle的spool命令,生成dat文件。2 :通过oracle的utl_file包生成dat文件。下面两种方法都做一介绍。第二步:生成tar文件,并移动至目标路径。通过shell编程,将文件tar包并移动。四、实现方法:As通过spool命令生成dat文件。lx spool简介:通过spool命令,可以将select数据库的内容写到文件中,通过在sqlplus 设置一些参数,使得按指定方式写到文件中。spool命令的语法
4、如下:spool file_name create|replace|append off|out其中file.name指定一个操作系统文件create将创建一个指定的file_name文件replace如果指定的文件已经存在,则替换该文件append将内容附加到一个已经存在的文件中显示脚本中的命令的执行结果,缺省为onoff停止将sql*plus中的输出结果复制到filename文件中,并关闭该文件。 out启动该功能,将sqbplus中的输出结构复制到file.name中。2,spool常用的设置set colsep set echo off;域输出分隔符显示start启动的脚本中的每个sq
5、l命令,缺省为onset feedback off:回显本次sql命令处理的记录条数,缺省为onset heading off: set pagesize 0;输出域标题,缺省为on输出每页行数,缺省为24,为了避免分页,可设定为0set termout off;set trimout on;去除标准输出每行的拖尾空格,缺省为offset trimspool on; 去除重定向(spool)输出每行的拖尾空格,缺省为off输出文本数据的建议格式:SQL*PLUS环境设置SETNEWPAGE NONESET HEADING OFFSET SPACE 0SET PAG ESIZE 0SET TRI
6、MOUT ONSET TRIMSPOOL ONSET LINESIZE 2500此值根据具体数据情况设定,太小易被截断太大会隆低导出的速度。3、编写shell脚本生成dat文件。脚本文件为XXBOCQ.prog文件,将其挂一个EBS请求, 通过EBS请求来执行其中的内容,主要生成XXBOCQ_BND_BOOK_B.dat文件。XXBOCQ.prog脚本如下:LOGIN 二 $1FND=$5YJH 二 $6DATE 二 $7echo Mlogin:$LOGINMecho ,filename:$FNDecho okname:$YJHecho date:$DATEexport NLS_3NG二Ame
7、rican_AmeicaZHS16GBKcd /ebsap/appl/outfilepathsqlplus -s $LOGIN /dev/null END SETNEWPAGE NONESET LINESIZE 2000SET PAG ESIZE 0SET ECHO OFFSET FEEDBACK OFFSET VERIFY O阡SET HEADING OFFSETTERMOUTOFFSET TRIMSPOOL ONSET WRAP O阡SET SERVEROUTPUT OFFSPOOL $FNDSELECT BN.BONDD |门 |BN.TRANSACTION_ID | | BN.ACTI
8、VITY_CODE | | to_ch3r(BN.AS_OF_DATE,yyyymmdd) | II BN.INITIALCOSTHI II BN.INVEST_GAIN | | BN.RECEIVABLEJNT | |BNJNT_ADJUST|r| IIBN.MKT_VALUE_CHANGE | II BN.ACCOUNTABLEJNT | BN.MKT_VALUE|rr | BN.AMORTIZED_COST| | BNNTERESTJNCOME | | | BN.REPRICED | II BN.SORT_SEQ | | BN.MKT_VALUE_CHG_GAlN | II BN.CAP
9、.ACCUMULATION | | BN.TRANS_FEE|r | BN.OTHER_PAYABLE | | BN.DEVALUE_RESERVE | T | BN.DEVALUE_LOST|r |BNSSUE_FEE | TFROM xxbocq_bnd_book_b BNWHERE 1 = 1;SPOOL OFF;ENDif -f$FND; thentouch $YJH;if ! -d /ebsap/appl/outfilepath/ODS_DataFile/$DATE ; then mkdir -p /ebsap/appl/outfilepath/ODS_DataFile/$DATEf
10、imv $FND /ebsap/appl/outfilepath/ODS_Data File/$DATE mv $YJH /ebsap/appl/outfilepath/ODS_DataFile/$DATE ccl /ebsap/appl/outfilepath/$DATE tar cvf SDATE.fin.tar *.datelseecho NO FILE OUTPUT;exit 1;fiecho “FTP OK”exit 0通过以上脚本可以生成dat文件和ok文件,并且将dat文件打包,并且将文件和ok文 件移动到目标路径/ebsap/appl/outfilepath/ODS_Data
11、File/$DATE下。其中FND二$5是由请求传进来的参数,是dat文件的名称:XXBOCQ_BND_BOOK_B dat1YH二$6是请求传进来的参数,是ok文件的名finish_fin.ok,;DATE二$7是请求传进来的参数,日结日期。通过 export NLS_LyNG=American_America.ZHS16GBK 这一命令将 dat 文件的字符集设置 为 GBKo在EBS中将以上脚本可以创建为一个并发请求,可执行为:XX BOCQ。如何通过另一个请求调用xxbocq请求:在 PL/SQL 中建一个包 cux_xxbocq_bnd_pkg ,写一个存储过程 xxbocq.bnd
12、.book, 通过fnd_request-submitequest函数提交并发请求xxbocq,执行以上代码,直接在应用服 务器上输出目标文件。cux_xxbocq_bnd_pkg 包代召马如下:create or replace package cux_xxbocq_bnd_pkg isprocedure xxbocq_bnd_book(errbuf OUT VARCHAR2,retcode OUT VARCHAR2);end cux_xxbocq_bnd_pkg;create or replace package body cux_xxbocq_bnd_pkg isprocedure xx
13、bocq_bnd_book(errbuf OUT VARCHAR2,retcode OUT VARCHAR2) isv_datevarchar2(10);v_filenamevarchar2(100);v_ok namevarchar2(100);v_request_idv resualtnumber; boolea n;x.phasex statusx_dev_phasex dev statusmessageokfilevarchar2(20);VARCHAR2(20);VARCHAR2(20);VARCHAR2(20);VARCHAR2(20); utl_file.file_type;be
14、gi nselect to.char.trx.date/yyyymmdd1) INTO v_date from cux.transaction_d3te_t t where t.status in (P,S);v.filename :二XXBOCQ_BND_BOOK_B.dat;v_ok name:= finishji n.ok;FND_FILE.PUT_UNE(FND_FILE.OUTPUT,数据生成完成| v_filename);v_request_id 二 fnd_request.submit_requestCCUX -application,XXBOCQ:- -description, -start_time:FALSE, -sub.request, v_filename, v_ok name,v_date,chr(O),:一每行6个参数J;commit;FND_FILE.PUT.LINE(fnd_fiIe.OUTPUT,数请求ID: | v_request_id);V.RESUALT := fnd _co ncurren 匸 wait_for_request(v_request_id,1,0,x.phase, x_status, x_dev_phase,x_dev_status,x_message);commit;exceptio nwhen