db2 存储过程参数传递--字段类型转换产生的问题

修改以前的脚本spa

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 的命令行执行code

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';

此时能够返回正确的结果。blog

这个时候就开始纳闷儿了,第一个想到的是参数没有传递进去,或者参数的数据类型不对?class

在脚本中写入日志表,查看将参数写入日志表,没有问题呀?select

第二个想到的是,难道存储过程当中执行SQL与命令行中有差别?搜索

  DB2的资料自己很少,搜索了好一阵以后,并无发现,有这个方面的问题,请教了一下同事,也没有遇到相似的问题。数据类型

后来转念一想,是否是有可能字段类型转换的时候出问题了?数据

后来验证了一下,确实是 (left(replace(VARCHAR(A.APY_DT),'-',''),6) 在作类型转换的时候会有差别。

后来证明是根据连接环境的不一样转换后的格式会有差别。

解决方案是 给定一个固定的转换格式 to_char(A.APY_DT,'yyyymm')。

问题总算解决了,如今想来,主要是解决问题的思路,和快速反馈,从而快速的定位问题所在。

面对压力的时候,少些抱怨,多集中精力在解决问题的思考上,这样才能比较快的找到问题。

相关文章
相关标签/搜索