IBM DB2 SQLException 并显示“DB2 SQL 错误:SQLCODE=-420、SQLSTATE=22018、SQLERRMC=DECFLOAT、DRIVER=3.66.46”

问题描述 投票:0回答:2

我正在使用 iReport 5.6 和 IBM DB2 作为数据源来编写 Jasper 报告。我将一个字符串列表作为参数传递给报告,这就是问题出现的地方。查询如下;

SELECT customers.mobile_number, 
    COALESCE(Count(DISTINCT transaction_entries.transaction_id), 0) AS 
    number_of_transactions, 
    COALESCE(Sum(Abs(transaction_entries.amount)) / 100, 0)         AS 
    volume_of_transactions 
FROM   transaction_entries 
    JOIN customers 
      ON customers.id = transaction_entries.customer_id 
WHERE  transaction_entries.transaction_type = 'Seasonal' 
    AND transaction_entries.notification_text <> 'Notification' 
    AND customers.mobile_number IN ( $p ! {listOfMobileNumbers} ) 
GROUP  BY customers.mobile_number 

当我尝试生成报告时,出现错误 Caused by: com.ibm.db2.jcc.am.SqlDataException: DB2 SQL Error: SQLCODE=-420, SQLSTATE=22018, SQLERRMC=DECFLOAT, DRIVER=3.66.46。

知道为什么吗?以及可能的解决方案?

db2 jasper-reports
2个回答
2
投票

我首先验证通过注释掉 WHERE 子句的最后一个谓词是否可以避免错误;即,编辑失败的语句,以便引用 Jasper 变量作为输入的 IN 谓词不再是查询的一部分。
然后,从以下查询的输出中确定变量替换的定义:

select  '$p ! {listOfMobileNumbers}' from sysibm.sysdummy1

如果上述查询的效果(用于显示该 list 中的数据)呈现类似
'1234,567,890'
的内容,那么我建议修改定义该 list 的数据以反映
'1234','567','890'
1234, 567, 890 
相反。

FWiW:IMO 对于读者来说,实际的 DDL [对于列或表]比仅仅建议更清晰:

mobile_number 字段以字符串形式从数据库返回,而不是 DECIMAL


0
投票

尝试更换

COALESCE(Count(DISTINCT transaction_entries.transaction_id), 0)

COALESCE(Count(DISTINCT transaction_entries.transaction_id), '0')

问题是您正在尝试将小数/浮点值转换为字符串列(char、varchar、text 等)。这对于 ISNULL 和 CONCAT 等其他语句很常见。每当语句返回字符串列的小数/浮点值时,就会发生 SqlDataException DECFLOAT。

© www.soinside.com 2019 - 2024. All rights reserved.