• 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')。

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

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

  • 相关阅读:
    iOS,Android,WP, .NET通用AES加密算法
    iOS开发笔记-图标和图片大小官方最新标准
    因为对 Docker 不熟悉建了 N 多个 Nginx
    Docker 学习笔记 2019-05-27
    Linux Mint 19.1 安装 Docker 过程笔记
    W600 一块新的 KiCad PCB
    KiCad Mark 点名称
    一次乙型流感记录(2019-05-24)
    为什么不喜欢在 QQ 群里回答问题?
    Git 的两种忽略文件方式 gitignore 和 exclude
  • 原文地址:https://www.cnblogs.com/Alex-Zeng/p/9295003.html
Copyright © 2020-2023  润新知