使用spring StoredProcess在参数中插入oracle clob时克服32k限制

使用spring StoredProcess在参数中插入oracle clob时克服32k限制,spring,oracle,stored-procedures,limit,clob,Spring,Oracle,Stored Procedures,Limit,Clob,环境:Oracle11g,spring-jdbc-3.2.2-RELEASE.jar,JDK1.7,OracleUCP驱动程序 我有一个存储过程,它将记录插入到具有CLOB列的表中。SP在其他输入和输出参数中有一个CLOB输入参数。我的Java代码使用Spring StoredProcess调用存储过程: public class MyClass extends StoredProcedure { public MyClass(){ ..... declare

环境:Oracle11g,spring-jdbc-3.2.2-RELEASE.jar,JDK1.7,OracleUCP驱动程序

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

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);
    }
}
公共类MyClass扩展了StoredProcess{
公共MyClass(){
.....
declareParameter(新的SqlParameter(“content”,Types.CLOB));
.....
}
公开作废插入(){
HashMap params=新的HashMap(37);
String bigContent=..;//在我的测试中包含ASCII字符
....
参数put(“content”,新的SqlLobValue(bigContent));
....
执行(参数);
}
}
如果bigContent的字符数小于32k,则代码工作正常。如果bigContent有,比如说5万个字符,它就不起作用了。 我还使用jdbcTemplate和SqlLobValue直接插入到表中进行了测试,bigContent有50K个字符,一切正常

我希望使用SP,因为它可以处理大量其他事情,并且比单独调用多个SQL insert、update和查询语句更有效


有人知道如何让它与SP一起工作吗?或者,如果bigContent的字符数大于32K,我必须以不同方式处理此限制?

这取决于您的Oracle版本:

  • <10.1:您可以将
    SetBigStringTryClob
    属性设置为
    true
    DriverManager
  • >=10.1:您可以使用OraclePreparedStatement.setStringForClob

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

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


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

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

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


因此,最后我们保留了Java代码的原样——甚至使用字符串而不是Clob将大参数传递到Java中(使用Spring StoredProcedure)。

我的理解是Oracle在编程库的存储过程参数中没有对Clob设置32K限制。这可能是一个Spring方面的问题。