有关Oracle Retail 数据转换的一些准备知识
Chapter1: Preface And Overview
在完成数据统一之前,我们需要熟悉Oracle 零售系统自带的工具集。并且需要做如下工作。
准备工作与假设条件
1. 准备工作
在准备做data convention之前,需要按照上述流程图做好外部系统数据的分析、整理、映射、以及生成平面文件。其中最主要的就是和oracle 零售系统的映射工作。也就是后面会讲到的外部系统数据表的定义工作。
2. 假设条件
Oracle 零售系统的工具集的数据转换通常情况下是会假设所有的待转换的数据都是不需要验证的;你对UNIX环境下的SHELL编程熟悉
工具集
数据转换是通过工具集的脚本,以外部系统的为基准,并且通过一个“主程序”脚本,以队列的形式运行的脚本集合。大致分为三类脚本:
1. 主控脚本 DC_LOAD_MAIN.KSH
主控脚本,主要是用来运行其他脚本,也可以把这个脚本看成是一个容器,稍作改动(客户化脚本),就可以用来装米饭,甚至是用来喝汤。当然,主控脚本主要是为下面的段值载入脚本服务,同时,主控脚本还可以运行其他的一些KSH脚本和SQL脚本;另外,我们还可以通过修改脚本,使脚本可以指向任意数量的数据表。
2. 段值载入脚本
段值载入程序通常调用外部数据表创建脚本和数据导入脚本。当然,我们也可以修改段值载入脚本,达到只导入数据,而不创建外部数据表的目的。
3. 外部数据表创建脚本
外部数据表创建脚本通常包含如下要素:外部数据表列定义;目标导入文件(以DAT批处理文件为主);目标导入文件地址以及定义此次导入行为所生成的输出、日志、坏死以及忽略信息;
综上所述,在做数据转换工作中,各脚本的层级关系可以概括如下图A。
功能区域介绍
下面是整个数据转换所涉及到的功能划分:
1. 核心(Core) DC_LOAD_CORE.KSH
2. 商品架构 DC_LOAD_MERCH.KSH
3. 组织架构 DC_LOAD_WH_ORG.KSH
4. 供应商 DC_LOAD_SUPPLIER.KSH
5. 商品 DC_LOAD_FASHION_ITEM.KSH
————————————————————————————————————————–
————————————————————————————————————————–
Chapter 2.Master Script
概述
1抛出异常以及日志文件的生成都是通过调用单独的一个库文件生成,而全局变量、脚本、数据以及其他的目标定义都是被定义在单独的一个配置文件中:DC_LOAD.CFG。
2.所有的脚本程序都可以在后缀名为*.seq的队列文件中定义脚本程序执行的先后顺序。
3.先导入-后验证,验证程序需要自己写进脚本里面,并且在每段验证程序加上注释。
4.主控脚本可以运行如下脚本
a.其他KSH脚本
b.SQL脚本
c.独立或者是关联成链的RMS中的BATCH程序.
配置文件DC_LOAD.CFG
配置文件DC_LOAD.CFG包含了对可执行的KSH脚本、SQL脚本的所有执行路径信息,以及DC_LOAD_MAIN.KSH和段值脚本所产生的日志文件和临时目录的路径信息。
在运行DC_LOAD_MAIN.KSH之前,需要做如下准备工作,才可以成功的运行DC_LOAD_MAIN.KSH
A.建立路径目录
$ chmod 777 Directory_Name
路径 路径名称 路径描述
数据库路径 orclDataDir 用来指定系统数据库路径
数据库日志文件路径 orclLogDir 用来存放外部数据表中生成的日志文件路径
数据文件路径 dataDir 用来存放平面文件的路径
完成数据文件路径 dataCompDir 用来存放已经传输完成的数据的路径
坏死文件路径 badDir 在数据文件传输过程中生成的坏死文件的存放路径
忽略文件路径 dscDir 在数据文件传输过程中生成的忽略文件的存放路径
脚本路径 scriptDir 存放在数据转换过程中所有相关的脚本文件的路径
日志文件路径 logDir 用来存放脚本运行的过程中生成的日志文件
状态文件路径 statusDir 用来存放在整个转换过程完成时生成的.status状态文件。
注意:此路径可以和日志文件路径logDir相同
RMS程序路径 rmsBinDir 存放RMS系统所安装的batch文件
B.定义环境变量
变量名称 描述
connectStr 连接Oracle 数据库的用户名和密码,格式为 username/password
dataExt 文件扩展名定义,默认为 .dat
badExt 文件扩展名定义,默认为 .bad
dscExt 文件扩展名定义,默认为 .dsc
statusExt 文件扩展名定义,默认为 .status
seqExt 文件扩展名定义,默认为 .seq
C.队列文件定义
标签
PGM
KSH以及其他的可执行的脚本文件的文件名;如/$HOME/RETAIL/SCRIPTS/STOREADD.KSH,如果没有路径,则将使用上面配置文件中的路径scriptDir 做为默认可执行脚本的路径
SQL
该标签用来运行SQL脚本;如/$HOME/RETAIL/SCRIPTS/DC_CUSTOMER.SQL,如果没有路径,则将使用上面配置文件中的路径scriptDir 做为默认可执行脚本的路径
RMS
用来执行RMS的BATCH程序。
注意:尽管BATCH程序本身就可以直接运行,但是仍然需要确保BATCH程序是在上面CFG文件中定义的rmsBinDir路径下,除非是调用客户化BATCH程序,那么需要在前面加上客户化程序的完整路径,并且需要加入BATCH程序的控制表:restart_control(prepost情况除外)
>
表示该行客户化定制的信息将显示在屏幕和日志文件中
#
注释掉该行
例子:
[oracle@syfr12 ~]$ vi LOAD_SUPPLIER.seq
#This section will load the supplier information to the RMS tables
>Running LOAD_SUPPLIER.KSH…
PGM load_supplier.ksh
>Loading Supplier Information Completed
#Now Validating Supplier Information
SQL dc_validate_supplier.sql
配置库文件DC_LOAD.LIB
DC_LOAD.LIB包含以下文件的配置如下FUNCTION
1.checkCfg
被导入程序调用,用来检查DC_LOAD.CFG文件是否存在,并且是否所有的配置信息都已经配置以用来完成整个流程。
2.checkError
将被后面的execPgm和execSql 两个Function调用,用来在执行完在队列文件中定义的脚本后,对流程的状态进行检查并且将相关信息写入日志文件
3.checkFile [-e\–x\-r\-s\-x]
检查文件是否符合载入要求
-x 检查是否可执行
-e 检查文件是否存在
-r 检查文件是否可读
-s 检查文件的大小
1)对于平面文件(*.dat)和(*.seq),需要检查文件的是否存在、文件大小、还有是否可读;
2)对于坏死文件(*.bad)、可忽略文件(*.dsc)以及状态文件(*.status),仅仅检查文件是否存在;
4.getAvailThread
从restart_program_status表中取状态为”ready for start”,字段thread_val的最小值
SELECT MIN(T.THREAD_VAL)
FROM RESTART_PROGRAM_STATUS T
WHERE 1=1
AND T.PROGRAM_STATUS = ‘ready for start’
AND T.PROGRAM_NAME = ‘posupld’;
5.refreshThreads
把已经成功完成的流程的状态转换成为”ready for start”;
UPDATE RESTART_PROGRAM_STATUS T
SET T.PROGRAM_STATUS = ‘ready for start’
WHERE 1 = 1
AND T.PROGRAM_STATUS = ‘completed’
AND T.PROGRAM_NAME = ‘posupld’;
6.execPgm
在checkFile函数返回值为0的时候,被队列文件中定义的主控脚本以及其他的可执行脚本来调用,并且将生成日志文件。
7.execSql
在checkFile函数返回值为0的时候,通过定义sqlplus –s执行SQL脚本,并且通过环境变量connectStr来连接数据库。并且生成日志文件。
8.execRms
Restart_control的作用:
DD_RESTART_RECOVERY调用RESTART_CONTROL表,来决定当前的BATCH PROGRAM的driver以及thead 数量。
该函数会首先检查要运行的batch 文件是否存在以及是否可执行,然后会检查该batch文件的类型。
类型可以分为下面三种:
1) Prepost
2) File类型
3) Table类型
如何运行KSH脚本
A.准备工作
创建环境变量
>vi /home/oracle/.bash_profile
PATH=$PATH:$HOME/external/scripts #视具体情况而定
Export PATH
B., 运行脚本
> dc_load_main.ksh –q <sequence-name>
> dc_load_core.ksh
————————————————————————————————————————–
————————————————————————————————————————–
Chapter 4 Example
有关具体细节的开发,参看一下图B。就可以知道大概的流程了。
在做好外部系统的分析、整理、生成DAT文件之后,通过DBC_CREATE_SUPS_TAB.SQL、DBC_CREATEC0SUP_ADDR_TAB.SQL、DBC_CREATE_SUP_IMORT_ATTR_TAB.SQL脚本来创建外部系统数据表DC_SUPS、DC_SUP_ADDR、DC_SUP_IMORT_ATTR。这些表用来存放从DAT文件中抽取出来的外部系统数据。然后再运行dc_load_supplier.ksh这个process,通过前面的准备工作,我们已经可以顺利并且成功运行dc_load_supplier.ksh脚本啦。那么,这样就可以把上面的表中的信息导入到RMS系统中的SUPS、ADDR、SUP_IMPORT_ATTR表中。至此,整个data convention结束。
————————————————————————————————————————–
RMS系统中有很多的BATCH Program,在当前的测试阶段,由于Batch program本身就具有可执行性,但是由于在跑完一个batch只有我们需要手工到后台数据库中去改状态(相当于上面的库函数DC_LOAD.LIB中的refreshThreads以及getAvailThread两个函数的功能)。APPWORX本身就集成了Oracle Retail的相关的batch来做成的chain,其中也都是用shell编程来达到流程控制的目的。我想,之所以用APPWORX,是因为它的窗口化,而不是上面所做的代码化(我们需要在Linux下运行命令脚本)。
————————————————————————————————————————–
关于作者:
昵称:harrodzhang 档案信息: 联系方式:你可以通过harrod.zhang@hand-china.com联系作者 点击查看harrodzhang发表过的所有文章... 本文永久链接: http://blog.retailsolution.cn/archives/538 |
对本文的评价: