zoukankan      html  css  js  c++  java
  • 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')。

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

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

  • 相关阅读:
    interview
    lvs简介
    编译参数说明
    nginx-arch
    network
    linux 密码修改方法
    ps命令详解
    sed 命令+正则表达式
    LINUX SCP 命令详解
    linux下mysql的root密码忘记解决方
  • 原文地址:https://www.cnblogs.com/Alex-Zeng/p/9295003.html
Copyright © 2011-2022 走看看