Debugging 无法识别错误的来源-假设:十进制格式冲突

Debugging 无法识别错误的来源-假设:十进制格式冲突,debugging,plsql,db2,Debugging,Plsql,Db2,在执行DB2(V8)存储过程时,出现以下错误: SQL0304N无法将值分配给主机变量,因为该值为 不在宿主变量数据类型的范围内。SQLSTATE=22003 我没有设置任何类型的跟踪或特定的错误处理,因为错误只发生在我们客户的验证环境中,我不允许使用这些环境,所以我没有很多选择,只能再次分析我的代码 这是我目前分析的结果。谷歌帮不了什么忙 我的“10页”过程在一组数据上创建一个光标,遍历它并计算要插入到表中的每个元素的值 我已经检查了(希望是)所有变量类型与用于填充它们的数据类型以及目标表的数

在执行DB2(V8)存储过程时,出现以下错误:

SQL0304N无法将值分配给主机变量,因为该值为 不在宿主变量数据类型的范围内。SQLSTATE=22003

我没有设置任何类型的跟踪或特定的错误处理,因为错误只发生在我们客户的验证环境中,我不允许使用这些环境,所以我没有很多选择,只能再次分析我的代码

这是我目前分析的结果。谷歌帮不了什么忙

我的“10页”过程在一组数据上创建一个光标,遍历它并计算要插入到表中的每个元素的值

我已经检查了(希望是)所有变量类型与用于填充它们的数据类型以及目标表的数据类型,并且没有发现任何冲突

由于存在大量十进制数、乘法和加法,我唯一的假设是,对于定义的变量,计算值变得太大。有人能确认这是“正确的错误”吗?如果计算生成的小数点后的位数大于目标变量类型所允许的位数(如十进制(6,2)中的100000.123),它是否也适用

我还试图找到一种通过客户机调试DB2PLSQL的方法,但没有找到任何解决方案。如果你有什么建议

非常感谢您提供任何线索:)

我回答自己

首先,我的最后一个问题=>我没有找到任何方法通过客户机调试DB2PLSQL(至少使用DB2V8)

在我被授权处理我们的集成客户机环境之后,我可以确认我的假设是正确的。接收乘法的变量格式有时对于计算结果来说太小(十进制(10,2))

采用的解决方案是将变量格式更改为十进制(15,2),由于根据客户要求,插入的最终值仍必须为十进制(10,2),因此我们与客户确认了以下内容:

1-检查变量值:

if (myval > 9999999,99)
then 
  set myval = 9999999,99;
end if; 
=>“返回十进制(10,2)要求”

2-在插入时返回到十进制(10,2): 这最后一位代码还解决了小数点后数字过多的问题。这在插入时也会导致错误

insert into mytable values (
... ,
CAST(myval AS DECIMAL( 12 , 2 )),
...
)
我回答我自己

首先,我的最后一个问题=>我没有找到任何方法通过客户机调试DB2PLSQL(至少使用DB2V8)

在我被授权处理我们的集成客户机环境之后,我可以确认我的假设是正确的。接收乘法的变量格式有时对于计算结果来说太小(十进制(10,2))

采用的解决方案是将变量格式更改为十进制(15,2),由于根据客户要求,插入的最终值仍必须为十进制(10,2),因此我们与客户确认了以下内容:

1-检查变量值:

if (myval > 9999999,99)
then 
  set myval = 9999999,99;
end if; 
=>“返回十进制(10,2)要求”

2-在插入时返回到十进制(10,2): 这最后一位代码还解决了小数点后数字过多的问题。这在插入时也会导致错误

insert into mytable values (
... ,
CAST(myval AS DECIMAL( 12 , 2 )),
...
)

根据执行SQL所处的上下文,这可能会为您提供相关的行,这可能会显示您感兴趣的数据。这将是一个严格的数据类型不匹配-我们需要看看你在做什么,以找出在哪里。然而,是的,这可能是您正在执行的计算的结果。此外,在插入/更新/删除数据时,游标几乎从来都不是正确的选择(出于事务大小原因需要批处理时保存);可以重新写入常规的
INSERT
语句(可能运行得更快)。第一种是使用某种日志记录。提倡“编写代码工具”的人甚至建议,每隔一行代码都应该是已经发生或将要发生的事情的输出。我的第二个建议是将“10页”程序模块化。如果一段代码需要滚动才能显示全部内容,我往往会丢失概述。第三个建议是验证你的假设。当计算东西时,你假设你的变量满足任何标准。最好事先确定,这些值确实有用。并记录验证结果。@X-Zero和Juergen Hartelt-感谢您的评论和对我调查的帮助!根据执行SQL所处的上下文,这可能会为您提供相关的行,这可能会显示您感兴趣的数据。这将是一个严格的数据类型不匹配-我们需要看看你在做什么,以找出在哪里。然而,是的,这可能是您正在执行的计算的结果。此外,在插入/更新/删除数据时,游标几乎从来都不是正确的选择(出于事务大小原因需要批处理时保存);可以重新写入常规的
INSERT
语句(可能运行得更快)。第一种是使用某种日志记录。提倡“编写代码工具”的人甚至建议,每隔一行代码都应该是已经发生或将要发生的事情的输出。我的第二个建议是将“10页”程序模块化。如果一段代码需要滚动才能显示全部内容,我往往会丢失概述。第三个建议是验证你的假设。当计算东西时,你假设你的变量满足任何标准。最好事先确定,这些值确实有用。并记录验证结果。@X-Zero和Juergen Hartelt-感谢您的评论和对我调查的帮助!