机器学习和生物信息学实验室联盟

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 8279|回复: 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();
//关闭所有连接
然后执行,可以成功插入
-----------------------------------------------------------------------------------------------------
以上是纠结了一天的问题,发现网上并没有什么特别清晰的答案,所以既然偶然的成功了,那就把这种经验分享一下,希望大家能够不吝赐教,有什么更好的办法,欢迎共享~
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 转播转播 分享分享
回复

使用道具 举报

沙发
发表于 2011-9-25 13:44:13 | 只看该作者
这不是偶然...是努力的结果。
回复 支持 反对

使用道具 举报

板凳
 楼主| 发表于 2011-9-25 16:42:39 | 只看该作者
xmubingo 发表于 2011-9-25 13:44
这不是偶然...是努力的结果。

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

使用道具 举报

地板
发表于 2011-9-25 16:42:44 | 只看该作者
我在远方表示祝贺!
回复 支持 反对

使用道具 举报

5#
 楼主| 发表于 2011-9-25 16:45:03 | 只看该作者
zouquan 发表于 2011-9-25 16:42
我在远方表示祝贺!

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

使用道具 举报

6#
发表于 2011-9-25 22:13:57 | 只看该作者
突破困难,恭喜恭喜。
回复 支持 反对

使用道具 举报

7#
发表于 2011-9-26 08:48:57 | 只看该作者
了不起,就成Oracle专家啦!
回复 支持 反对

使用道具 举报

8#
 楼主| 发表于 2011-9-26 10:35:07 | 只看该作者
tangzk 发表于 2011-9-25 22:13
突破困难,恭喜恭喜。

呵呵,同喜同喜~
回复 支持 反对

使用道具 举报

9#
 楼主| 发表于 2011-9-26 10:35:37 | 只看该作者
chenwq 发表于 2011-9-26 08:48
了不起,就成Oracle专家啦!

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

使用道具 举报

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

本版积分规则

机器学习和生物信息学实验室联盟  

GMT+8, 2024-11-23 09:17 , Processed in 0.073427 second(s), 21 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表