我正在使用 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。
知道为什么吗?以及可能的解决方案?
我首先验证通过注释掉 WHERE 子句的最后一个谓词是否可以避免错误;即,编辑失败的语句,以便引用 Jasper 变量作为输入的 IN 谓词不再是查询的一部分。
然后,从以下查询的输出中确定变量替换的定义:
select '$p ! {listOfMobileNumbers}' from sysibm.sysdummy1
'1234,567,890'
的内容,那么我建议修改定义该 list 的数据以反映 '1234','567','890'
或 1234, 567, 890
相反。
FWiW:IMO 对于读者来说,实际的 DDL [对于列或表]比仅仅建议更清晰:
mobile_number 字段以字符串形式从数据库返回,而不是 DECIMAL
尝试更换
COALESCE(Count(DISTINCT transaction_entries.transaction_id), 0)
与
COALESCE(Count(DISTINCT transaction_entries.transaction_id), '0')
问题是您正在尝试将小数/浮点值转换为字符串列(char、varchar、text 等)。这对于 ISNULL 和 CONCAT 等其他语句很常见。每当语句返回字符串列的小数/浮点值时,就会发生 SqlDataException DECFLOAT。