需求
项目组接到一个需求,需要将COBOL语句写的东西,和公司的数据字典对比,然后形成一个标准SQL语句,然后和我们项目组的数据表结构来做对比,找出差异。
1.COBOL语句
******************************************************************
* COBOL DECLARATION FOR TABLE CLTGOGA2 *
******************************************************************
01 CLR:GOGA2:.
03 :GOGA2:_KEY.
05 :GOGA2:_COLL_NO DIC(GTEE_NO, P).
03 :GOGA2:_R_TYPE DIC(TYP).
88 :GOGA2:_R_N VALUE 'N'.
88 :GOGA2:_R_D VALUE 'D'.
03 :GOGA2:_GUAR_CI_NO DIC(CI_NO).
03 :GOGA2:_GUAR_ENG_NAME DIC(CI_ENM).
03 :GOGA2:_REF_NO DIC(DESC_30).
03 :GOGA2:_CAN_DATE DIC(DT, P).
03 :GOGA2:_GOVER_GUAR_PCT DIC(PCT, P).
03 :GOGA2:_EFF_DATE DIC(DT, P).
03 :GOGA2:_EXP_DATE DIC(DT, P).
03 :GOGA2:_GUAR_TYP DIC(PRDMO_CD).
03 :GOGA2:_PREM_TYP DIC(FLG).
03 :GOGA2:_CRT_DATE DIC(DT, P).
03 :GOGA2:_CRT_TLR DIC(TLR_NO).
03 :GOGA2:_UPDTBL_DATE DIC(DT, P).
03 :GOGA2:_UPDTBL_TLR DIC(TLR_NO).
03 :GOGA2:_TS PIC X(26).
*@*CHECKSUM _2115642531
2 数据字典
ABBR_CD,X,2,0AC,X,25,0
AC-NAME,M,61,0
AC_ARR,X,990,0
AC_EXP,X,2,0
AC_MODEL,X,6,0
3 转化的结果
DROP TABLE ODS.CITGID;
CREATE TABLE ODS.CITGID (
GRP_ID CHAR(10) DEFAULT ' ' NOT NULL,
CI_NO CHAR(12) DEFAULT ' ' NOT NULL,
FLG CHAR(1) DEFAULT ' ' NOT NULL,
GRP_NAME CHAR(140) DEFAULT ' ' NOT NULL,
CREATE_UNIT DECIMAL(6,0) DEFAULT 0 NOT NULL,
CREATE_TLR CHAR(8) DEFAULT ' ' NOT NULL,
CREATE_DATE DECIMAL(8,0) DEFAULT 0 NOT NULL,
CREATE_TIME DECIMAL(6,0) DEFAULT 0 NOT NULL,
CHK_STATUS CHAR(1) DEFAULT ' ' NOT NULL,
LAST_UPD_DATE DECIMAL(8,0) DEFAULT 0 NOT NULL,
UPDTBL_DATE DECIMAL(8,0) DEFAULT 0 NOT NULL,
TS CHAR(26) DEFAULT ' ' NOT NULL,
PRIMARY KEY(GRP_ID, CI_NO)
)
IN TBS_REPORT_DATA INDEX IN TBS_REPORT_INDEX COMPRESS YES;
分析
语言使用java,里面大概涉及到文件流的处理,怎么读文件,怎么写文件,怎么将文件和数据字典对比,之后将形成的整个文件拆分,形成一个个独立的表文件。我的处理是这样的,首先将COBOL语句转化为一个临时文件,每一行的字符串用切割符分开,之后和数据字典对比,然后形成一个大文件,最后用shell脚本将大文件切割一个个表结构。#代码1.ConverSqlToTxt.java 将COBOL语句转为用 ! 切割的字符串
/**
* @param lineChar 处理03和05开头的字符串
* @return 符合规范的字符串
*/
private String checkSqlTabFiled(String lineChar) {
String str = "";
String[] splited = lineChar.split("\\s+");
if (splited[1].contains(":")) {
splited[1] = splited[1].replace(":", "").trim();
}
//去掉第二个数开头的表名
if (splited[1].contains("_")) {
String tabName = splited[1];
//得到tabName截掉前三位的字符串
tabName = tabName.split("\\_{1}")[0];
splited[1] = splited[1].replaceFirst(tabName + "_", "").trim();
}
if (splited.length == 4) {
if (splited[2].contains(",") && splited[2].contains("(") && splited[3].contains(")")) {
splited[2] = splited[2] + splited[3];
List
list = new ArrayList
(); for (int i = 0; i < splited.length; i++) { list.add(splited[i]); } //去掉第四位的数组 list.remove(3); splited = list.toArray(new String[1]); } } if (splited.length == 3) { str = splited[0] + "!" + splited[1] + "!" + splited[2]; } else if (splited.length == 4) { str = splited[0] + "!" + splited[1] + "!" + splited[2] + "!" + splited[3]; } else if (splited.length == 6 && splited[1].equals(sevenNumber)) { str = splited[0] + "!" + splited[1] + "!" + splited[3] + "!" + splited[4] + "!" + splited[5]; } re