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

问题描述 投票:0回答:1

我触发一条 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
1个回答
0
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.