机器学习和生物信息学实验室论坛联盟MAchine Learning And Bioinformatics, MALAB
查看: 9416|回复: 8

ORA-01704: string literal too long

 火 [复制链接]
发表于 2011-9-25 10:33:43 | 显示全部楼层 |阅读模式
本帖最后由 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();
//关闭所有连接
然后执行,可以成功插入
-----------------------------------------------------------------------------------------------------
以上是纠结了一天的问题,发现网上并没有什么特别清晰的答案,所以既然偶然的成功了,那就把这种经验分享一下,希望大家能够不吝赐教,有什么更好的办法,欢迎共享~
回复

使用道具 举报

发表于 2011-9-25 13:44:13 | 显示全部楼层
这不是偶然...是努力的结果。
回复

使用道具 举报

 楼主| 发表于 2011-9-25 16:42:39 | 显示全部楼层
xmubingo 发表于 2011-9-25 13:44
这不是偶然...是努力的结果。

嘿嘿,偶然的成分也很大啊,我希望继续偶然的发现更多的东西
回复

使用道具 举报

发表于 2011-9-25 16:42:44 | 显示全部楼层
我在远方表示祝贺!
回复

使用道具 举报

 楼主| 发表于 2011-9-25 16:45:03 | 显示全部楼层
zouquan 发表于 2011-9-25 16:42
我在远方表示祝贺!

,看来以后遇到问题的话,还是每个方面都尝试一下比较好,不管有关系没有,说不定就搞出一个新的成果,哈哈
回复

使用道具 举报

发表于 2011-9-25 22:13:57 | 显示全部楼层
突破困难,恭喜恭喜。
回复

使用道具 举报

发表于 2011-9-26 08:48:57 | 显示全部楼层
了不起,就成Oracle专家啦!
回复

使用道具 举报

 楼主| 发表于 2011-9-26 10:35:07 | 显示全部楼层
tangzk 发表于 2011-9-25 22:13
突破困难,恭喜恭喜。

呵呵,同喜同喜~
回复

使用道具 举报

 楼主| 发表于 2011-9-26 10:35:37 | 显示全部楼层
chenwq 发表于 2011-9-26 08:48
了不起,就成Oracle专家啦!

这可不敢当,我要学的还有很多呢~
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

关注公众号
机器学习和生物信息学实验室联盟

相关侵权、举报、投诉及建议等,请发 E-mail:admin@discuz.vip

Powered by Discuz! X5.0 © 2001-2026 Discuz! Team.

在本版发帖
关注公众号
返回顶部