你好,欢迎访问我的博客!登录
当前位置:首页 - oracle - 正文 求知成瘾,却无作品!

ORA-01704: string literal too long

2017-07-28oracle攻城狮6323°c
A+ A-

使用Java向oracle数据库插入数据时,报错提示:ORA-01704: string literal too long,在网上搜到的做法大概有三种:

    一、存储过程(尝试了,不靠谱)。原因很简单,你调用存储过程的时候还是得将这个长度6000的字符串直接传给SQL解析器,跟你直接用SQL 插入数据一个道理,因此这种方法不行。

    二、多次更新(太麻烦,没有试)。原打算用这种方式,但是感觉稍微有点麻烦,我得按照4000的倍数去拆字符串。。想想还是算了。

    三、使用预编译语句插入(我用的就是这种)。预编译确实解决了问题,可以参考下面预编译代码。


出现这种问题的原因往往有两个:

    一、插入的值大于给定字段的值,比如你往一个varchar2(16)的字段里插入了长度为20的字符串就会报错,对于这种错误,更改字段定义就能够解决;

    二、插入的值超过了SQL解析器能够支持的最大长度,比如我现在遇到的,由于字符串长度太大,将数据库字段从varchar(4000)改为了clob类型,但是当我将一个长度为6000的字符串插入这个字段的时候依然报错:ORA-01704: string literal too long,最终发现原来不是数据库字段定的长度不够,而是SQL解析器无法解析这么大的字符串。对于这种错误,使用预编译语句可以解决问题:

//假设要往logtab表中插入数据,longstring是clob字段
String jsonString="";//假设jsonString的长度为6000,
PreparedStatement ps = conn.prepareStatement("insert into logtab(id,longstring) values(?,?)");
ps.setInt(1,1);
ps.setString(2,jsonString);
ps.execute();
ps.close();
conn.close();

上面这段代码应该可以解决问题。

预编译的方法参考博客:http://blog.sina.com.cn/s/blog_9098e0010102vyki.html

标签:
推荐阅读

发表评论

必填

选填

选填

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。


  登录