提问人:Pete Ythong 提问时间:9/27/2023 最后编辑:marc_sPete Ythong 更新时间:9/27/2023 访问量:33
无法使用 NamedParameterJdbcTemplate 查询存储过程以提交 CLOB
Can't query stored procedure with NamedParameterJdbcTemplate to submit CLOB
问:
我触发一个 SQL 语句来启动一个只有一个输入参数的过程,即一个 clob。但它不起作用,我不知道为什么。
查询:
private static final String ADD_DOCUMENTS =
"select * from table(Test.test_clob(in_document_clob => :cblob))";
调用查询:
public void addDocuments(InputStream data, String name) throws IOException, SQLException {
byte[] byteArray = IOUtils.toByteArray(data);
SqlParameterSource paramSource = new MapSqlParameterSource().addValue("cblob",
new SqlLobValue(new ByteArrayInputStream(byteArray), byteArray.length, new DefaultLobHandler()), OracleTypes.CLOB);
final List<SomeResponse> query = this.template.query(ADD_DOCUMENTS, paramSource, new SomeResponseMapper(true));
}
我知道到目前为止,它适用于字符串作为输入,但不适用于 clob。
我收到此错误:
java.lang.ArrayIndexOutOfBoundsException:索引 32768 超出长度 32768 的范围
在 oracle.sql.CharacterSet.convertJavaCharsToAL32UTF8Bytes(CharacterSet.java:1895) 在 oracle.jdbc.driver.DBConversion.javaCharsToCHARBytes(DBConversion.java:832) 在 oracle.jdbc.driver.DBConversion.javaCharsToCHARBytes(DBConversion.java:766)
当我尝试调用没有长度参数的 SqlLobValue 时,出现以下错误:
java.lang.IllegalArgumentException:CLOB 列不支持内容类型 [[B]
在 org.springframework.jdbc.core.support.SqlLobValue.setTypeValue(SqlLobValue.java:204) 在 org.springframework.jdbc.core.StatementCreatorUtils.setValue(Statement CreatorUtils.java:292)
非常感谢您的帮助。
当我尝试调用没有长度参数的 SqlLobValue 时,我尝试调用。
答:
正如@pmdba提到的,我的问题是大小限制。具有流式处理功能的 Clob 限制为 32kb 解决了此错误。
java.lang.ArrayIndexOutOfBoundsException:索引 32768 超出长度 32768 的范围
在 oracle.sql.CharacterSet.convertJavaCharsToAL32UTF8Bytes(CharacterSet.java:1895) 在 oracle.jdbc.driver.DBConversion.javaCharsToCHARBytes(DBConversion.java:832) 在 oracle.jdbc.driver.DBConversion.javaCharsToCHARBytes(DBConversion.java:766)
评论
test_clob