db2 存储过程参数传递--字段类型转换产生的问题
修改之前的脚本
select count(*) from dbdk.dtdkg010 A left join DBDK.DTDKG070 D ON D.PAY_NO = A.PAY_NO LEFT JOIN CXLFM.DTFMA000_UNIT F ON F.DIV_NO = D.PLN_DIV1 AND F.DIV_NO2=D.PLN_DIV2 LEFT JOIN DBDK.DTDKH900 E ON E.COST_CD = D.COST_CD LEFT JOIN DBDK.DTDKG071 G ON D.PAY_NO=G.PAY_NO AND D.SER_NO=G.SER_NO LEFT JOIN CXLCM.DTCM0011 H ON H.TABLE_CODE='DBDK.DTDKG071' AND H.COL_CODE='ACC_TPYE' AND H.OPTION=G.ACC_TPYE WHERE ((left(replace(VARCHAR(A.APY_DT),'-',''),6)=in_month AND A.PAY_KD IN('1','2','3','4','5','6','7','8','A','B','C','D','E','X') )) AND A.PCS_STS='9' AND value(A.TRD_UNION_ACT,'') <> '1';
修改之后的脚本
select count(*) from dbdk.dtdkg010 A left join DBDK.DTDKG070 D ON D.PAY_NO = A.PAY_NO LEFT JOIN CXLFM.DTFMA000_UNIT F ON F.DIV_NO = D.PLN_DIV1 AND F.DIV_NO2=D.PLN_DIV2 LEFT JOIN DBDK.DTDKH900 E ON E.COST_CD = D.COST_CD LEFT JOIN DBDK.DTDKG071 G ON D.PAY_NO=G.PAY_NO AND D.SER_NO=G.SER_NO LEFT JOIN CXLCM.DTCM0011 H ON H.TABLE_CODE='DBDK.DTDKG071' AND H.COL_CODE='ACC_TPYE' AND H.OPTION=G.ACC_TPYE WHERE to_char(A.APY_DT,'yyyymm')=in_month AND A.PAY_KD IN('1','2','3','4','5','6','7','8','A','B','C','D','E','X') AND A.PCS_STS='9' AND value(A.TRD_UNION_ACT,'') <> '1';
传入的参数是 in_month : 201807 这样
查找这个问题的时候,首先上来就是直接替换参数在 dbvi 的命令行执行
select count(*) from dbdk.dtdkg010 A left join DBDK.DTDKG070 D ON D.PAY_NO = A.PAY_NO LEFT JOIN CXLFM.DTFMA000_UNIT F ON F.DIV_NO = D.PLN_DIV1 AND F.DIV_NO2=D.PLN_DIV2 LEFT JOIN DBDK.DTDKH900 E ON E.COST_CD = D.COST_CD LEFT JOIN DBDK.DTDKG071 G ON D.PAY_NO=G.PAY_NO AND D.SER_NO=G.SER_NO LEFT JOIN CXLCM.DTCM0011 H ON H.TABLE_CODE='DBDK.DTDKG071' AND H.COL_CODE='ACC_TPYE' AND H.OPTION=G.ACC_TPYE WHERE ((left(replace(VARCHAR(A.APY_DT),'-',''),6)='201807'AND A.PAY_KD IN('1','2','3','4','5','6','7','8','A','B','C','D','E','X') )) AND A.PCS_STS='9' AND value(A.TRD_UNION_ACT,'') <> '1';
此时可以返回正确的结果。
这个时候就开始纳闷儿了,第一个想到的是参数没有传递进去,或者参数的数据类型不对?
在脚本中写入日志表,查看将参数写入日志表,没有问题呀?
第二个想到的是,难道存储过程中执行SQL与命令行中有差异?
DB2的资料本身不多,搜索了好一阵之后,并没有发现,有这个方面的问题,请教了一下同事,也没有遇到类似的问题。
后来转念一想,是不是有可能字段类型转换的时候出问题了?
后来验证了一下,确实是 (left(replace(VARCHAR(A.APY_DT),'-',''),6) 在做类型转换的时候会有差异。
后来证实是根据链接环境的不同转换后的格式会有差异。
解决方案是 给定一个固定的转换格式 to_char(A.APY_DT,'yyyymm')。
问题总算解决了,现在想来,主要是解决问题的思路,和快速反馈,从而快速的定位问题所在。
面对压力的时候,少些抱怨,多集中精力在解决问题的思考上,这样才能比较快的找到问题。