修改以前的腳本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')。
問題總算解決了,如今想來,主要是解決問題的思路,和快速反饋,從而快速的定位問題所在。
面對壓力的時候,少些抱怨,多集中精力在解決問題的思考上,這樣才能比較快的找到問題。