环境: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字符?
答案 0 :(得分:0)
这取决于您的Oracle版本:
SetBigStringTryClob
属性设置为true
中的DriverManager
。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)。