ORA-01704: string literal too long
2017-07-28oracle攻城狮4781°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
标签:oracle