本帖最后由 hsc 于 2011-9-25 10:34 编辑
这个问题昨天我纠结了一天啊,在网上也没有搜出来什么东西,不过还是对我有一定的影响滴,然后昨天晚上一直在这里奋战,其实也不全是搞这个问题,随意的做,很偶然滴试了一种办法,没想到,尽然成功了,兴奋啊,就出来八一八~~~
----------------------------------------------------------------------------------------------------------------------------
我使用的java写的,所以错误的详情如下:
java.sql.SQLException: ORA-01704: string literal too long
at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:112)
at oracle.jdbc.driver.T4CTTIoer.processError(T4CTTIoer.java:331)
at oracle.jdbc.driver.T4CTTIoer.processError(T4CTTIoer.java:288)
at oracle.jdbc.driver.T4C8Oall.receive(T4C8Oall.java:743)
at oracle.jdbc.driver.T4CPreparedStatement.doOall8(T4CPreparedStatement.java:213)
at oracle.jdbc.driver.T4CPreparedStatement.executeForRows(T4CPreparedStatement.java:952)
at oracle.jdbc.driver.OracleStatement.doExecuteWithTimeout(OracleStatement.java:1160)
at oracle.jdbc.driver.OraclePreparedStatement.executeInternal(OraclePreparedStatement.java:3285)
at oracle.jdbc.driver.OraclePreparedStatement.execute(OraclePreparedStatement.java:3390)
at myPackage.test.main(test.java:39)
由于数据库里定义的字段类型是varchar2(size)类型,而varchar2所规定的最高上限是4000,如果插入超过4000的话,就会报这个错误,然后上网搜了很久,大部分都说改成long或者clob类型,但是试了一下,还是这个错误,long和clob所规定最大上限2G和4G完全成为空谈。然后偶然看到一个大牛人物讲到使用PreparedStatement可以避免这个错误,于是又完全把所有的Statement全调换成PreparedStatement还是不可以,然后其中有一个细节问题就是PreparedStatement的传参问题,我开始搞的不是很懂,后来试了一下这个,当然是随便试了一下,没想到竟然成功了,然后接着这个传参问题就一清二楚了。
先讲一下这个传参问题:
(PreparedStatement).setString(parameterIndex, x)
这只是里边一个方法而已,具体设置什么类型,根据你字段的定义而定。
其中参数1 parameterIndex是指的数据库表中第几个字段属性,他标记的是从1开始的,比如说一个表里边有两个字段属性(id,name)其中id是number类型,name是varchar2类型,那么设置的时候设置两个值就可以了,即:
state.setInt(1, count);//count为int类型
state.setString(2,str);//str为String类型
然后说一下怎么解决上面这个异常的:
比如说要插入一个字段,我可以在sql语句里完全写为空,比如说这个表里字段只有两个,一个number,一个clob,因为要存入超过4000个,所以只能使用clob类型了,当然也可以使用long。我写一小段程序模拟一下:
//数据库连接已完毕
PreparedStatement state=conn.prepareStatement("insert into test values(?,?)");
String str="";
for(int i=0;i<10000;++i)
{
str+="abcdefghigklmnopqrstuvwxyz";
}
state.setInt(1,1);
state.setString(2,str);
state.execute();
//关闭所有连接
然后执行,可以成功插入
-----------------------------------------------------------------------------------------------------
以上是纠结了一天的问题,发现网上并没有什么特别清晰的答案,所以既然偶然的成功了,那就把这种经验分享一下,希望大家能够不吝赐教,有什么更好的办法,欢迎共享~ |