在Oracle中,以下查询:
select
json_arrayagg(
json_array(
(select json_arrayagg(json_array(1) format json) from dual) format json,
2
)
format json
)
from dual
字符串
生成以下JSON文档:
[[[[1]],2]]
型
当我尝试从JDBC运行这个带有绑定变量的查询时,如下所示:
try (PreparedStatement s = connection.prepareStatement(
"""
select
json_arrayagg(
json_array(
(select json_arrayagg(json_array(?) format json) from dual) format json,
?
)
format json
)
from dual
"""
)) {
s.setInt(1, 1);
s.setInt(2, 2); // This fails
try (ResultSet rs = s.executeQuery()) {
while (rs.next())
System.out.println(rs.getString(1));
}
}
型
然后我得到:
Exception in thread "main" java.sql.SQLException: Invalid column index
at oracle.jdbc.driver.OraclePreparedStatement.setIntInternal(OraclePreparedStatement.java:4956)
at oracle.jdbc.driver.OraclePreparedStatement.setInt(OraclePreparedStatement.java:4947)
at oracle.jdbc.driver.OraclePreparedStatementWrapper.setInt(OraclePreparedStatementWrapper.java:202)
at org.jooq.testscripts.JDBC.main(JDBC.java:50)
型
我使用这些版本:
- 数据库:Oracle Database 21 c Express Edition 21.0.0.0.0版-生产
- ojdbc:com.oracle.database.jdbc:ojdbc11:21.5.0.0
这是一个bug吗?可以解决吗?
1条答案
按热度按时间rta7y2nd1#
在我看来,它曾经是ojdbc中的一个bug。它不再出现在
23.3.0.23.09
版本中。老版本的ojdbc驱动程序的解决方法包括:强制转换bind变量
字符串
删除bind参数标记前的
FORMAT JSON
指令型
在bind变量周围使用伪表达式
型
交叉使用
null
值,然后再次使用absent on null
删除型