如何在不得到ORA-01460的情况下将大字符串设置为参数:未实现或不合理的转换错误?



使用namedParameterJdbcTemplate的 spring-boot 中(Oracle db version 12 和 odbc8 driver 12.2(

在执行绑定了大于 4000 个字符的参数的SELECT查询时,我收到以下错误,而更新查询工作正常。

ORA-01460:请求未实施或不合理的转换

我正在尝试执行的单元测试;

@Test
public void testSqlSelectQueryLargeStringParameter() {
MapSqlParameterSource params = new MapSqlParameterSource();
params.addValue("param", theLargeStr);
// @formatter:off
String sql =
"SELECT NULL id, NULL text FROM DUAL WHERE 'X' != :param ";
// @formatter:on
namedParameterJdbcTemplate.queryForRowSet(sql, params);
}

有没有办法通过MapSqlParameterSource设置这个大参数

我是@ahmet-orhan的同事,我们找到了解决方案。

感谢您的建议@kfinity,它适用于插入和更新,但是当我们在选择语句中将 clob 或 blob 设置为"参数表"时,我们仍然收到此错误。

如果使用支持 JDBC4.0 的驱动程序,正确的解决方案是创建一个 DefaultLobHandler 并将 streamAsLob 或 createTemporaryLob 设置为 true。

MapSqlParameterSource params = new MapSqlParameterSource();
String myString = "";
for (int i = 0; i < MAX_CLOB_BLOB_SIZE_IN_SELECT; i++) {
myString = myString + "1";
}
DefaultLobHandler lobHandler = new DefaultLobHandler();
lobHandler.setStreamAsLob(true);
params.addValue("param", new SqlLobValue(myString, lobHandler), Types.CLOB);
// @formatter:off
String sql =
"SELECT 1 id  FROM DUAL WHERE :param IS NOT NULL ";
// @formatter:on
Integer id = namedParameterJdbcTemplate.queryForObject(sql, params, Integer.class);

我们更喜欢streamAsLob,但说实话,我们不知道哪一个更好。

此注释指出 JDBC 查询中的 ORA-01460 与"ORA-01704:字符串文字太长"相同。(字符串文本不能超过 4000 个字符。也许试试这个解决方案?

params.addValue("param", theLargeStr, Types.CLOB);

虽然!=也不适用于 clob 比较,因此您还需要将查询更改为

SELECT NULL id, NULL text FROM DUAL WHERE dbms_lob.compare('X',:param) != 0