我使用 JDBC 连接到具有 blu 加速的 db2 luw 11.x db2 luw 没有 blu 加速也有同样的问题。
conn.createStatement(
ResultSet.TYPE_SCROLL_INSENSITIVE,
ResultSet.CONCUR_READ_ONLY,
ResultSet.HOLD_CURSORS_OVER_COMMIT)
ResultSet rs = stmt.executeQuery(sql);
我们应用程序中一个可能的查询是(简化(,其中 myNumericColumn 是一个数字数据类型:
SELECT * FROM myTable WHERE
myNumericColumn = 123 OR 'ALL' IN (123)
123
可以更改为另一个值。准备好的字符串是可能的,如 'ALL'
.在本例中,查询如下所示:
SELECT * FROM myTable WHERE
myNumericColumn = 'ALL' OR 'ALL' IN ('ALL')
右手将是真的,所以左手不会被评估。如果我移除右手(或将条件更改为 false(,我们会出现数字溢出异常(将数字与字符串进行比较(。
com.ibm.db2.jcc.am.SqlDataException: Overflow occurred during numeric data type conversion.. SQLCODE=-413, SQLSTATE=22003, DRIVER=4.23.42
如果我将 createStatement 更改为以下命令或删除所有 ResultSet 属性(ResultSet.TYPE_FORWARD_ONLY
将用作默认值(,则没有例外。
conn.createStatement(
ResultSet.TYPE_FORWARD_ONLY,
ResultSet.CONCUR_READ_ONLY,
ResultSet.HOLD_CURSORS_OVER_COMMIT)
为什么强制 JDBC/JDBC 驱动程序/数据库使用按位或更改结果集的类型?如何改变这种行为?
感谢和最诚挚的问候
答案很简单:不要做这样的事情。
谓词描述中有一条语句:
- 谓词中指定的所有值必须兼容
如果确实评估了搜索条件的谓词以及在某些特定情况下的顺序,则无法保证。