3. 定制数据源文件模板(Data.csv)
为了让SQL*Loader程序准确上载外部文件中的数据,我们需要将外部文件的数据应与SQL*Loader文件中的字段一一对应。

4. 开发主机并发程序(ARIMPORT.prog)
主机并发程序使用操作系统的 Script 程序进行编写。主要目的是用来调用“数据导入程序”。“数据导入程序”的目的是将外部数据源数据(如:csv文档、txt文档)自动导入的接口表(RA_INTERFACE_LINES_ALL)中。

图4 Oracle中的主机程序
//主机程序代码 ################################################################################### # Filename : ARIMPORT.prog ################################################################################### PROGRAM_NAME=`basename $0` PROGRAM_NAME=`basename $PROGRAM_NAME .prog` START_TIME=`date +%d-%b-%Y" "%H:%M` echo $PROGRAM_NAME " begin .... " $START_TIME DATENOW=`date +%Y%m%d` USER_PASSWD=$1 VAR_USER_ID=$2 VAR_USER_NAME=$3 VAR_REQUEST_ID=$4 OUT_FILE=`echo $APPLCSF/$APPLOUT/o$VAR_REQUEST_ID.out` LOCAL_PATH=$AR_TOP/data CTL_FILE_NAME=`echo $LOCAL_PATH/"arcontrol.ctl"` DATA_FILE_NAME=`echo $LOCAL_PATH/"data.csv"` CTL_FILE_LOG=`echo $LOCAL_PATH"/"data"$DATENOW".log"` #echo $CTL_FILE_NAME #echo $DATA_FILE_NAME #echo $CTL_FILE_LOG ##########sqlldr########## cd $LOCAL_PATH #$ORACLE_HOME/bin/sqlldr $USER_PASSWD control=$CTL_FILE_NAME log=$CTL_FILE_LOG $ORACLE_HOME/bin/sqlldr $USER_PASSWD control=arcontrol.ctl log=$CTL_FILE_LOG cat $CTL_FILE_LOG >> $OUT_FILE ##########update interface data########## sqlplus -s $USER_PASSWD @$AR_TOP/sql/ARIMPORT_UPD.sql { printf("hello, world\n"); }
5. 开发SQL*Loader程序(ARCONTROL.ctl)
开发数据导入程序的目的是,通过被主机程序调用,从而自动将外部数据(如:txt文件、CSV文件)导入至Oracle AR模块的接口表。
//SQL*Loader程序 LOAD DATA INFILE 'data.csv' REPLACE INTO TABLE AR.RA_INTERFACE_LINES_ALL FIELDS TERMINATED BY ',' optionally enclosed by '"' ( TRX_NUMBER CHAR(20) "trim(:TRX_NUMBER)", TRX_DATE DATE 'YYYY-MM-DD' , CURRENCY_CODE CHAR(15) "trim(:CURRENCY_CODE)", CUST_TRX_TYPE_NAME CHAR(20) "trim(:CUST_TRX_TYPE_NAME)", GL_DATE DATE 'YYYY-MM-DD', ORIG_SYSTEM_BILL_CUSTOMER_REF CHAR(240) "trim(:ORIG_SYSTEM_BILL_CUSTOMER_REF)", TERM_NAME CHAR(15) "trim(:TERM_NAME)", LINE_NUMBER , DESCRIPTION CHAR(240), QUANTITY , UNIT_SELLING_PRICE , BATCH_SOURCE_NAME CHAR(50), SET_OF_BOOKS_ID , LINE_TYPE CHAR(20) "trim(:LINE_TYPE)", CONVERSION_TYPE CHAR(30) "trim(:CONVERSION_TYPE)" )
6. 开发SQL脚本(ARIMPORT_UPD.sql)
为了让用户更方便地使用模板文件,我们在主机程序中,嵌入了一段SQL脚本,此段SQL的脚本目的是,通过用户输入的一些信息,自动从Oracle数据库中找到想对应的信息。比如在模块文件中,用户要输入“客户名称”,而在Oracle系统的接口表中要求填入客户的标示(orig_system_bill_customer_ref)。而对于用户来说,客户标示是透明的,故开发此段程序,以使得用户模板更加友好。
//SQL脚本 declare begin update ra_interface_lines_all iall set iall.conversion_type = substr(iall.conversion_type,1,9); commit; update ra_interface_lines_all iall set iall.orig_system_bill_customer_ref = (select a.customer_id from ar_customers_v a where a.customer_name = iall.orig_system_bill_customer_ref ), iall.orig_system_bill_address_ref = (select b.address_id from ar_customers_v a ,ar_addresses_v b where a.customer_name = iall.orig_system_bill_customer_ref and a.customer_id = b.customer_id ); update ra_interface_lines_all t set t.interface_line_context = '外部导入', t.interface_line_attribute1 = 'INTERFACE', t.interface_line_attribute2 = t.trx_number, t.interface_line_attribute3 = t.line_number, t.amount = t.quantity * t.unit_selling_price, t.memo_line_name = t.description, t.conversion_date = gl_date, t.org_id = 81; update ra_interface_lines_all uila set uila.conversion_type = 'User', uila.conversion_date = uila.gl_date, uila.conversion_rate = 1 where uila.currency_code = 'CNY'; commit; exception when others then rollback; end; / exit;