使用spring StoredProcedure插入oracle clob IN参数时克服32k限制

时间:2015-04-26 01:43:09

标签: spring oracle stored-procedures limit clob

环境:oracle 11g,spring-jdbc-3.2.2-RELEASE.jar,JDK 1.7,Oracle UCP驱动程序。

我有一个存储过程,它将记录插入到CLOB列的表中。 SP在其他IN和OUT参数中有一个CLOB输入参数。我的Java代码使用Spring StoredProcedure来调用存储过程:

public class MyClass extends StoredProcedure {
    public MyClass(){
       .....
       declareParameter(new SqlParameter("content", Types.CLOB));
       .....
    }

    public void insert(){
       HashMap<String,Object> params = new HashMap<String, Object>(37);
       String bigContent = ....; // which contains ASCII chars in my test
       ....
       params.put("content", new SqlLobValue(bigContent));
       ....
       execute(params);
    }
}

如果bigContent具有&lt; 32k字符。如果bigContent有50K的字符,那就不行了。 我还测试了使用jdbcTemplate和SqlLobValue直接插入表中,一切正常,bigContent有50K字符。

我想使用SP,因为它会处理大量其他内容,并且比分别调用多个SQL插入,更新和查询语句更有效。

任何人都知道如何让它与SP合作?或者这是我必须以不同方式处理它的限制,如果bigContent具有&gt; 32K字符?

4 个答案:

答案 0 :(得分:0)

这取决于您的Oracle版本:

  • &LT; 10.1:您可以将SetBigStringTryClob属性设置为true中的DriverManager
  • &gt; = 10.1:您可以使用OraclePreparedStatement.setStringForClob doc here

此外,this article可能会对您有所帮助。

答案 1 :(得分:0)

Oracle中CLOB的限制为176TB。 VARCHAR限制为32KB。您的代码在某处使用从VARCHAR到CLOB的隐式转换。在Oracle中,CLOB必须是OUTPUT参数 - 即使您正在插入它。 Oracle的API假定您在数据库端创建empty_clob(),然后将LOB定位符返回到aplication。然后,应用程序将此LOB定位器用作文件句柄。

此行为与其他数据库不同。

答案 2 :(得分:0)

如果将数据作为字符串发送,PL / SQL的硬限制为32k字符。如果参数是CLOB,您可以先创建一个临时LOB,用数据填充它,然后用CLOB对象调用PL / SQL过程。

答案 3 :(得分:0)

我们遇到了类似的问题,但后来我们发现了 PL/SQL 内部的根本原因——“大”参数混合了 VARCHAR2 和 CLOB 类型。

所以最后我们保留了 Java 代码原样 - 即使使用 String 而不是 Clob 将大参数传递给 Java(使用 Spring StoredProcedure)。