所以我在CLOB和Oracle方面遇到了很大的问题。到目前为止,我公司一直用于这个客户端的数据库刚刚通过PreparedStatement传递了简单的字符串。这很好,因为这些字符串都少于4,000个字符。我们刚刚发现存在限制。不是100%肯定为什么,相信它与CLOB的行为方式有关。无论如何,我已被分配进入代码并解决此问题。
因此,目前,PreparedStatement的参数通过一个非常简单的过程分配:
((PreparedStatement) stmt).setObject(fieldIndex++, fieldInfo.value);
现在已经足够好了,但显然没有那么多。
无论如何,我首先想到的是尝试使用一些与CLOB相关的PreparedStatement方法。 fieldInfo.value是Object的声明类型,其实际类型是动态设置的。到目前为止,它已被保存为字符串,正如我所说,所以我决定只更改其类型,然后使用其中一个PreparedStatement方法来分配它。
我尝试过以下类型值& PreparedStatement方法:
if(fieldInfo.value instanceof InputStream){
((PreparedStatement) stmt).setBinaryStream(fieldIndex++, (InputStream) fieldInfo.value);
}
if(fieldInfo.value instanceof Reader){
((PreparedStatement) stmt).setCharacterStream(fieldIndex++, (Reader) fieldInfo.value);
}
if(fieldInfo.value instanceof Clob){
((PreparedStatement) stmt).setClob(fieldIndex++, (Clob) fieldInfo.value);
}
我显然没有连续调用所有这些,这些只是我单独尝试过的例子。
其中每一个都有相同的结果:AbstractMethodError。在研究该异常后,我发现问题很可能是我的JDBC驱动程序。除了......据我所知,我是正确的。我用ojdbc6&尝试了这个。 ojdbc7,同样的错误。我已经仔细检查了我的类路径以及项目中的每个目录,以获得有关旧罐子藏在那里的任何迹象,我似乎无法找到它。
有没有人知道会发生什么?
答案 0 :(得分:0)
无论如何,看到这个的任何mod都可以关闭这个问题。
答案 1 :(得分:0)
我不知道您要在代码中执行什么命令,是INSERT,UPDATE还是其他命令?
但是,我只是按照手册“JDBC Developer's Guide”,主题“使用LOB和BFILE”==> http://docs.oracle.com/cd/E11882_01/java.112/e16548/oralob.htm#JJDBC28535
一切都很好
他们在文档中写道:
在Oracle Database 11g第2版(11.2)中,setBytes, setBinaryStream, setString ,setCharacterStream和setAsciiStream PreparedStatement的方法被扩展以增强其能力 使用BLOB,CLOB和NCLOB目标列。
他们说setString
必须使用字符串> 4000 char,然后我创建了这个简单的测试用例,我使用了 ojdbc6驱动程序(对于Oracle 11.2),见下文:
CREATE TABLE myclob(
id int,
myclob clob
);
================================
public static void main(String ...x) throws SQLException{
OracleDataSource ods = new OracleDataSource();
ods.setURL("jdbc:oracle:thin:@//localhost:1521/orcl");
ods.setUser("test");
ods.setPassword("test");
Connection con = ods.getConnection();
PreparedStatement stmt = con.prepareStatement("INSERT INTO myclob( id, myclob) VALUES (?, ?)");
StringBuffer str = new StringBuffer();
for(int i = 0; i<1000; i++)
str.append("Very long line number = " + i);
System.out.println( "The length is: " + str.length());
stmt.setInt(1, 2);
stmt.setString(2, str.toString());
stmt.executeUpdate();
con.commit();
stmt.close();
con.close();
}
================================
select length( m.myclob), m.*
from myclob m;
LENGTH(M.MYCLOB) ID MYCLOB
---------------- ---------- --------------------------------------------------------------------------------
26890 2 Very long line number = 0Very long line number = 1Very long line number = 2Very