《数据仓库编程规范.docx》由会员分享,可在线阅读,更多相关《数据仓库编程规范.docx(24页珍藏版)》请在课桌文档上搜索。
1、数据仓库编程规范文档触号:VI.O文档名称:数据仓库编程规范文档(1.0).doc文档编号:文档修订号:文档建立日期:2022-228电子版文件名:未经允许,不可全部或者部份发表、复制、使用于任何目的文档修订摘要日期修订号描述著者审阅者批准人/日期1引言编写目的编写数据仓库开辟规范(dbsql系统)(1.0)的目的是:dbsql封装了访问db2,oracle,greenplum,SybaseTeradata数据库的方法,形成为了一套访问db2,oracle,greenplum,Sybase和Teradata数据库的统一接口。dbsql不仅提供了对db2oracle,greenplum,Syba
2、se和Teradata访问方法的统一,而且提供了一些方法屏蔽5个数据库之间sql语言的差别。这样对于应用程序,只需要编写一套代码,就可以控制db2,oraclee,greenplum,Sybase和Teradata数据库,对开辟工程师而言,只用熟悉sql92的标准sql和此文档sql函数就本文档供以下相关人员阅览:令参于数据仓库设计评审的专家人员;令参预数据仓库软件开辟的软件部人员;令参预数据分析系统测试人员。1.1 背景介绍令开辟的软件系统的名称:数据仓库编程规范令开辟单位:数据分析部令系统使用单位:令该软件系统是数据仓库底层开辟跨平台异构数据仓库的基础平台1.2 术语定义1.3 参考资料参
3、考资料共包括:令Tclk编程权威指南令ExpertOneonOne:OracIe令(Oracle数据库DBA专题技术精粹2DBsqI环境配置2.1 目录设置2.2 环境变量主要环境变量设置包括: $DBSQL:程序安装点,开辟时设置为个人目录。 Sagentlogdir:SCehdUIeSerVer日志采集目录,通常设置为SDBSQMog $AGENTTRACEDIR:日志及TRACE文件目录。(ScheduleServer集,可用于存放调试信息) STOOLS:存放tcl运行环境包及异构数据库编译的动态包安装目录。用户可以在用户目晏下创建.profile文件,例如:exportH0ME=ho
4、medw/dwexportDBSQL=$HoMEexportAGENTLc)GD工R=$DBSQL/logexportAGENTTRACED工R=$DBSQL/trace2.3 开辟与安装开辟时需要作如下设置: 将dss及_8mmon.tcl复制到$DBSQL/bin下; 将_common.cfg复制至IJ$DBSQL/etc下; 参照dwd_trade_base_ds.tcl开辟各处理程序,有关dwd_trade_base_ds.tcl的详细说明参见具体面子;如需要专用配置文件则在$DBSQUetC下创建Vrootname.cfg文件,专用配置文件中允许覆盖公共配置项,但需要慎用。执行方法(
5、以dwd_trade_base_ds.tcl为例):homedw.profiledss-sdwd_trade_base_ds.tcl-t20220228-u100-v200-o注意:1) $DBSQL在安装时被定义为安装点路径,因此,每一个用户需要在开辟时把该变量定义到自己的开辟目录下。2) dss、_cOmmon.tcl为公用程序,mmon.cfg为公共配置,均不得进行修改。3DBsqI编程规范3.1注释A在每一个td源文件头部都要加之关于本文件的注释,列出:文件名、功能描述、作者、住成FI期、修改日志、版权说明塾建议采用如下格式:# *文件名称:# *功能描述:# *创建者:# *创建日期
6、:# *修改日志:# *修改日期修改人修改内容# *# *# *Copyright(c)Co.,Ltd(# *AllRightsReserved.# *元数据注释信息# #METADATABEG工N# *数据仓库元数据配置信息# 工NPUT_TABLE=ODS_SQL_SAMPLE_(YYYYMMDD)注:如果是月表则TABLE_NAME_YYYYMM,多个表名之间以逗号“,“分割,下同# OUTPUjTABLE=DWD_SQL_SAMPLE_YYYYMMDD# DIM_TABLE=DlM_SQL_SAMPLE# TMP_TABLE=ODS_SQL_TEMP# T_TABLE=向来保留不做删除
7、暂时表# MAIN_JOIN_COLUMN=表表和之间的关联字段,但和维表字段的关联无需填写,多个字段之间以逗号“,“分割# HMETADATA_END*在每一个函数头部都要加之关于本函数的注释,列出:函数名称、功能描述、输入参数、输出参数、返回值等。建议采用如下格式:# *函数名称:# *功能描述:# *输入参数:# *输出参数:# *返回值:注释应考虑程序易读及外观排版的因素,使用的语言若是中、英兼有的,建议多使用中文,除非能用非常流利准确的英文表达。在程序块的结束行下一行加注释标记,以表明某程序块的结束。当代码段较长,特殊是多重嵌套时,这样做可以使代码更清晰,更便于阅读。if#progr
8、amcodewhileindexMAX_INDEX)# programcode)# endofwhile(index若有较长的表达式或者语句,则要进行适应的划分,长表达式要在低优先级操作符处划分新行,操作符放在新行之首。划分出的新行要进行适当的缩进,使排版整齐,语句可读。if$5PoPrGrP=0&$tmp0prID!=0&$tmp0prID!=1&$operself_node=$tmpNodeIDprogramcodeA程序块的分界符(如大括号和)应各独占一行并且位于同一列,同时与引用它们的语句左对齐。在函数体的开始、以及讦、for、while,switch语句中的程序都要采用的缩进方式。对
9、双目操作,需要在操作符先后加空格;对单目操作,则不必加空格。settotal_numexpr$a+$bif$total_num=10if!is_null6注释与所描述内容进行同样的缩排。这样可使程序排版整齐,并方便注释的阅读与理解。procExampleFun(paraval)(# codeonecommentsCodeBlockOne# codetwocommentsCodeBlockTwo)# 7将注释与其上面的代码用空行隔开。# codeonecommentsprogramcodeone# codetwocommentsprogramcodetwo避免在一行代码或者表达式的中间插入注释,
10、否则容易使代码可理解性变差。3.3 表名程序名命名规范令表名命名格式说明:层次主题L表内容分表规则令解释:今层次:数据仓库的分层定义,目前数据库自低到高分为ODS,DWD,DW,DM,ST,表命名时根据表具体所属层次填写,如C)DS_TRD_BYD_BASE_YYYYMMDD,DWD_TRD_BYD_BASE_YYYYMMDD今主题:数据仓库的当前主题主题名英文缩写客户主题CRD交易主体TRD产品主题PRD资金FND收费CHG安全SCR今表内容:在表名总长度不超过30个字符,尽量详尽说明表的具体内容,在所有层次中表内容应保持一致。对于浮现一下关键字单词的按以下规则进行缩写,如果缩写后表名部分出
11、现和主题相同的缩写请去除表名中该缩写(如对表DWD_BEYOND_TRADE_FUND_BILL进行规范划缩写则为DWD_TRD_BYD_TRD_FUND_BILL,h现重复TRD,所以最后缩表名应为DWD_TRD_BYD_FUND_BILL):关键字单词缩写BEYONDBYDACCOUNTACTONLINEOLWITHDRAWWTHDRWUNFNSHUNFHDETAILDTLFREEZEFRZINSTRUCTIONISTRNTRADETRD分表规则:日表YYYYMMDD,月表YYYYMM,日汇总DS,月汇总MS,日累计DT1月累计MT令程序名命名格式说明目标表名(去除分表规则部份)程序类型N
12、cl程序名称一律小写令解释:目标表名(去除分表规则部分):目标表名为程序生成数据的表名,如数据ODS_TRD_BYD_BASE_YYYYMMDD-DWD_TRD_BYD_BASE_YYYYMMDD,那末程序命名成dwd_trd_byd_base_dd.tcl程序类型:类型说明英文缩写每日运行程序,且目标表为日表dd每月运行程序,且目标表为月表mm每日运行程序,且目标表为日汇总ds每月运行程序,且目标表为月汇总ms每日运行程序,且目标表为口累计dt每月运行程序,且目标表为月累计mt3.4 标识符命名规则标识符的命名要清晰、明了,有明确含义,同时使用完整的单词或者大家基本可以理解的缩写,避免使人产
13、生误解。较短的单词可通过去掉“元音”形成缩写;较长的单词可取单词的头几个字母形成缩写;一些单词有大家公认的缩写。例如如下单词的缩写能够被大家基本认可。temp可缩写为tmpmessage可缩写为msgA函数或者过程名建议统一采用匈牙利记法,函数或者过程的名称能够简单体现函数或者过程的功能。GetCustStatusOdsToBaIanceGetNotNuII对于局部变量命名,可以采用全小写加下划线的风格,也可以用单个有具体含义的单词做变量名,但禁止用单个字符(如i、j、k.)做变量名,i、j、k可以做局部循环变量。例如:IogJdtracejdA对于全局变量命名,尽量使用匈牙利记法,首字母小写
14、,与过程名区分。例如:OpTimeCityld3.5 SQL书写规范由于SQL语句在DBSQL系统中是一个非常重要的组成部份,所以对SQL语句的书写规范做单独说明。1、SQL语句的所有表名、字段名全部小写,系统保留字、内置函数名、SQL保留字大写。SELECTemployee-idzemloyee_name,SUM(salary)FROMemployeeGROUPBYemployee_id;连接符or、in、and、以及=、v=、=等先后加之一个空格。卜多表连接时,使用表的别名来引用列。对较为复杂的SQL语句加之注释,说明算法、功能。注释风格:七注释单独成行、放在语句前面。忆应对不易理解的分支
15、条件表达式加注释;七对重要的计算应说明其功能;忆过长的函数实现,应将其语句按实现的功能分段加以概括性说明;七每条SQL语句均应有注释说明(表名、字段名)。七字段别名需要使用AS,如SySdateASNOWJlME七常量及变量注释时,应注释被保存值的含义(必须),合法取值的范围(可选)。SQL语句的缩进风格&一行有多列,超过80个字符时,基于列对齐原则,采用下行缩进;&Where子句书写时,每一个条件占一行,语句令起一行时,以保留字或者者连接符开始,连接符右对齐。wherea.id=$idANDa.payed_status=b.payed_statusANDb.owe_flag=1忆不要采用se
16、lect*的方式查找纪录,必须显示地写出字段名,每一个字段占一行,连接符右对齐。SELECTBUYER_USER_ID,SELLER_L0G工N_EMAIL,BUYER_LOGIN_EMAIL,SELLERJrYPE,BUYER_TYPE,TRADE_FR0M_ID,PARTERNER_ID,OPERAT0R_R。LE,TRADE_STATUS_IDFROMdwd_trade_base_20220228A书写优化性能建议:&避免嵌套连接。例如:A=BandB=CandC=D5曰Where条件中尽量减少使用常量比较,改用主机变量;&尽量避免相同语句由于书写格式的不同,而导致多次语法分析;七尽量使
17、用共享的SQL语句;查询的WHERE过滤原则,应使过滤记录数最多的条件放在最前面;任何对列的操作都将导致表扫描,它包括数据库函数、计算表达式等等,查询时要尽可能将操作移至等号右边。4DBsqI函数说明(二次封装)4.1 DBsqI系统调用函数封装4.1.1 procHelp功能:屏幕输出匡助信息输入:N/A输出(返回值):1)成功:0备注:N/A4.1.2 procGetCurrentTime功能:获取当前系统时间输入:N/A输出(返回值):1)成功:当前系统时间,格式:YYYY-MM-DDHH24:MM:SS”备注:N/A4.1.3 procLogMsgmsgmsg_detaillogd功能
18、:记录日志并输出屏幕信息输入:1) msg:日志信息2) msg_detail:日志详细信息3) logjd:日志文件句柄输出(返回值):1)成功:0备注:使用-0参数时,屏幕输出日志信息,否则仅记入日志文件,不作屏幕输出。4.1.4 procTraceMsgerrerr-detailtrace_fd功能:记录诊断信息输入:1) err:诊断信息2) err_detail:诊断详细信息3) tracejd:trace文件句柄输出(返回值):1)成功:0备注:N/A4.1.5 prLogAgentMsglog_fdcmd_statuslog-ntent功能:记录SChedUleSerVer采集日
19、志输入:1) logjd:日志文件句柄cmd_status:命令执行状态,普通只用到3和4setCmdstatus(REady)osetCmdstatus(Running)1正在运行setCmdstatus(HOLD)2setCMDSTATUS(SCCESSED)3运行成功setCmdstatus(Error)4运行错误setCMDSTATUS(DISPATCHED)5setCmdstatus(Initerr)6setCmdstatus(Agentfull)7setCMDSTATS(STARTERR)8setCmdstatus(NOPID)9setCmdstatus(Noexefile)10本
20、地无文件,远程也无法下载文件2) log_content:当前状态详细说明输出(返回值):1)成功:O2)失败:备注:日志文件(IOgJd)为程序本身的日志句柄,而不是ScheduleServer集的日志文件。4.1.6 procInitizelog-fdtrace_fd)功能:初始化输入:1) logjd:日志文件句柄2) trace_fd:诊断文件句柄输出(返回值):1)成功:02)失败:,4.2 DBsqI数据库调用函数封装4.2.1 procDBConnectdb_namedb_userdb_passwordlog_fdtrace_fd功能:连接数据库输入:1) db_name:数据库
21、名2) db_user:数据库用户名3) dbjDassword:数据库口令4) logjd:日志文件句柄5) trace_fd:trace文件句柄输出(返回值):1)成功:数据库连接句柄2)失败:备注:4.2.2 procDBOpendb-nnlog-fdtra-fd功能:打开数据库连接,产生数据库操作句柄输入:1) db_conn:数据库连接句柄2) logjd:日志文件句柄3) tracejd:trace文件句柄输出(返回值):1)成功:数据库操作句柄2)失败:,h,备注:4.2.3 procDBSqIhandlesql_bufflog_fdtrad功能:执行SQL语句输入:1) han
22、dle:数据库操作句柄,DBOpen返回值2) sqLbuff:SQL语句3) logjd:日志文件句柄4) tracejd:trace文件句柄输出(返回值):1)成功:INSERT、DELETE.UPDATE影响的行数,其他语句返回非空2)失败:备注:进行查询等操作时,影响行数不合用,返回值为-1。4.2.4 procDBFetchhandlelog_fdtrace_fd)功能:获取DBSqI所执行的SELECT结果输入:1) handle:数据库操作句柄,DBOpen返回值2) logjd:日志文件句柄3) tracejd:trace文件句柄输出(返回值):返回一行记录1)成功:返回游标值
23、2)失败:,备注:4.2.5 procDBCommitdb-nn功能:执行SQL语句输入:1) db_conn:数据库连接句柄,DBConnect返回值输出(返回值):2)成功:0备注:N/A4.2.6 prDBCIosehandle功能:执行SQL语句输入:3) handle:数据库操作句柄,DBOpen返I可值输出(返回值):4)成功:0备注:实用DBOPen打开数据操作句柄后,需要调用DBClOSe关闭操作句4.2.7 procDBDisnnectdb-nn功能:断开数据库连接输入:1) db_conn:数据库连接句柄,DBConnect返回值输出(返回值):1)成功:0备注:普通开辟时
24、无需调用,dss_xx程序会执行连接数据库和断开数据库的任务4.2.8 procDBIsTabIeExistsdb_8nntable_namelogdtrace_fd功能:检查目标表是否存在输入:1) db_conn:数据库连接句柄,DBConnect返回值2) table_name:目标表名3) logjd:日志文件句柄4) trace_fd:trace文件句柄输出(返回值):1)目标表存在:12)目标表不存在:03)检查失败:,备注:N/A4.2.9 procDBDisabIeLogdb-conntable-namelog_fdtrace_fd功能:关闭表日志输入:1) db_conn:数
25、据库连接句柄,DBConnect返回值2) table_name:目标表名3) IogJd:日志文件句柄4) trace_fd:trace文件句柄输出(返回值):1)成功:非空2)失败:n备注:N/A4.2.10 procDBTruncateTabIedb-nntable_namelog_fdtrace_fd功能:清空表数据,释放表所占用空间输入:1) db_conn:数据库连接句柄,DBConnect返回值2) table_name:表名3) logjd:日志文件句柄4) tracejd:trace文件句柄输出(返回值):1)成功:非空2)失败:备注:4.2.11 procDBDropTab
26、Iedb-conntable_namelog_fdtrace-fd功能:删除表,但不一定能即将释放表空间输入:1) db_conn:数据库连接句柄,DBConnect返回值2) table_name:表名3) logjd:日志文件句柄4) trace_fd:trace文件句柄输出(返回值):1)成功:非空2)失败:备注:4.2.12 procDBCreateTableByTemplatedb-nntable_nametemplatelog_fdtrace_fd功能:根据template创建表table_name输入:1) db_conn:数据库连接句柄,DBConnect返回值2) table
27、_name:需要建立的表名3) template:模板表名4) IogJd:日志文件句柄5) tracejd:trace文件句柄输出(返回值):1)成功:非空2)失败:备注:4.2.13 procDBCreateTempTabIeAdb-nntable-nametemplate_table_nametable-spaindex-tbspartition_keylog_fdtraced功能:根据templateJablejname创建表table_name输入:1) db_conn:数据库连接句柄,DBConnect返回值2) table_name:需要建立的表名3) template_tabl
28、e_name:模板表名4) table_space:表空间5) index_tbs:索引空间6) Partition_key:散列分布字段7) IogJd:日志文件句柄8) tracejd:trace文件句柄输出(返回值):1)成功:非空2)失败:备注:4.2.14 procDBCreateTempTabIeBdb-nntable_namefieldstable-spainde),tbspartition_keylog_fdtra-fd功能:根据给定字段创建表输入:1) db_conn:数据库连接句柄,DBConnect返回值2) table_name:需要建立的表名3) fields:表字段
29、,格式:field1varchar(100),field2varchar(10)4) table_space:表空间5) index_tbs嗦引空间6) Partition_key:散列分布字段7) IogJd:日志文件句柄8) trace_fd:trace文件句柄输出(返回值):1)成功:非空2)失败:4.2.15procDBRenameTabIe db-nn备注:table_namenewjable-namelog_fdtrace_fd功能:重命名表输入:1. db_conn:数据库连接句柄,DBConnect返回值2. table_name:旧表表名3. new_table_name:新
30、表表名输出(返回值):1 .成功:非空2 .失败:备注:4.2.16procDBCreateSeqdb-nnseq_namelog_fdtrace_fd)功能:创建序列输入:1. db_conn:数据库连接句柄,DBConnect返I可值2. seq_name:序列名输出(返回值):1 .成功:非空2 .失败:射备注:4.2.17prDBDropSeqdb-nnSeCLnamelog_fdtrace_fd)功能:删除序列输入:1. db_conn:数据库连接句柄,DBConnect返回值2. SeeLname:序歹IJ名输出(返回值):1 .成功:非空2 .失败:射备注:4.2.18 proc
31、DBRerdKQIdb_conntable_nameentity-untStart_timeexec_durationlog_fdtra-fd功能:程序运行信息采集函数输入:1) db_conn:数据库连接句柄,DBConnect返回值2) table_name:需要建立的表名3) enMty_c。Llnt:处理记录数,普通为插入、更新记录数据4) StartJime:开始时间5) exejduration:执行时常6) logjd:日志文件句柄7) tracejd:trace文件句柄输出(返回值):1)成功:非空2)失败:”备注:普通在程序最后执行4.2.19 prMonthEnddatej
32、so)功能:判断是否为月末最后一天输入:1) datejso:日期,格式YYYY-MM-DD输出(返回值):2) 0:非月末3) 1:月末最后一天备注:5DBsqI主调程序说明5.1 如何执行运行DBsqI系统的子程序5.2 DBsqI系统主调程序参数说明dss_xxx已被占用的参数如下(XXX表示不同数据库):全局变量名参数数组参数含义ARGSCRIPTarg卜S)本地脚本名ARGOPTIMEarg(-t)帐务日期ARG_TIMESTAMParg(p)批次,已废弃不用,暂时保留占用状态ARG_Uarg(-u)调度号ARG_Varg卜V)任务号ARG_DBSTRarg(-d)数据库连接串,己废弃不用,暂时保留占用状态ARGCarg(c)远程TCL脚本名称ARGQarg(-q)远程SQL脚本名称ARG_VERBOSEarg(-o)exists屏幕输出开关,若打开(1),则在记录日志的同时将日志内容输出到屏幕上;若关闭(0),则仅记录日志文件,不作屏幕输出。可以定义其他参数,均由arg数组保存,格式如下:参数由Y单个字符v空格v参数值”组成;字符不得使用已被占用的参数;参数值可以包含字母、数字及空格,但不得含有减号。参数“6”、宣,、,句”、7为必须定义的参数。