无法使用 NamedParameterJdbcTemplate 查询存储过程以提交 CLOB

Can't query stored procedure with NamedParameterJdbcTemplate to submit CLOB

提问人:Pete Ythong 提问时间:9/27/2023 最后编辑:marc_sPete Ythong 更新时间:9/27/2023 访问量:33

问:

我触发一个 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 时,我尝试调用。

java oracle spring-boot jdbctemplate clob

评论

0赞 Pete Ythong 9/27/2023
如果您有任何改进我问题的建议,请告诉我
1赞 pmdba 9/27/2023
PL / SQL(如您的流函数)对CLOB变量的大小限制为32K。test_clob
0赞 Pete Ythong 9/27/2023
@pmdba你是对的,用较小的PDF成功测试,非常感谢

答:

0赞 Pete Ythong 9/27/2023 #1

正如@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)