当前位置: 移动技术网 > IT编程>开发语言>Java > 报错:ORA-01461:仅能绑定要插入 LONG 列的 LONG 值

报错:ORA-01461:仅能绑定要插入 LONG 列的 LONG 值

2019年08月28日  | 移动技术网IT编程  | 我要评论

石家庄火车站列车时刻表,芒果网,窃听风云3qvod

需求:

  使用jdbc运用 arcgis的st_linestring 存取函数插入arcgis数据(空间数据)到oracle数据库。

前期工作:

  建表:create table lines_test ( id smallint, geometry sde.st_geometry ); //示例

  拼装数据:

  通过arcgis的官方api 拼装:sde.st_linestring (wkt clob, srid integer) 格式的数据。作为一个sql语句体的一部分存入到 geometry 字段中,也就是空间数据了。

问题:

  sde.st_linestring( string ,srid integer)当参数为string 时,

1     insert into lines_test (id, geometry) values (
2     1901,
3     sde.st_linestring ('linestring (750 150, 750 750)', 4326)
4     );

经过测试 'linestring (750 150, 750 750)' --string类型,即为通过生成的点坐标集合拼接所需格式。根据官方文档,string 的 length() 是有限制的,但是官方并未说明大小限制。经测试,大约拼接的 string 数据长度超过3500左右,会报错 ora-01461:仅能绑定要插入 long 列的 long 值。所以当你插入的 string 的长度在3500以内时是可以正常插入的。

解决思路(百度大佬们的)

基本为以下几种:

  1、插入到字符串长度大于4000字节。
  2、插入到表中的记录的某个字段数据的实际长度大于2000个字节(如果是utf-8,则是1333个字节);或者是插入的记录中有两个或两个以上长度大于2000字节的字符串。
  3、数据库与客户端的jdbc驱动不匹配。

解决:

  因为我的驱动为ojdbc6.jar,所以驱动肯定没问题。基本上就在长度过长的问题上了。

  采用预编译sql操作:preparestatement,通过占位符插入参数插入空间数据:

1 //set sde.st_linestring ( ? ,4326)语句中的参数。
2 if (point.length() > 3500) {
3 //长度超过arcgis函数sde.st_linestring限制,通过setcharacterstream方法,通过流的形式,写入到数据库。避免转成oracle的clob的问题。
4      reader clobreader = new stringreader(point); 
5      sm.setcharacterstream(11, clobreader);
6 }else {
7 //未超过限制,可以使用string类型插入,提高效率
8      sm.setstring(11, point.tostring());
9 }

注意:

 setcharacterstream是把给定的参数设置给reader对象,当将一个非常大的unicode值输入longvarchar参数时,通过java.io.reader对象发送它可能更有效,这一过程将根据需要从流中读取数据,一直读取到文件末尾。jdbc驱动程序将执行从unicode到数据库char格式的任何必要转换。

如果流长度与 length 参数指定的长度不同,则 jdbc 驱动程序将在更新或插入行时引发异常 。如下:

  测试1:刚开始我指定了流的长度 sm.setcharacterstream(11, clobreader,point.length()); 也会报错 ora-01461:仅能绑定要插入 long 列的 long 值。

  测试2:不考虑参数长度,改成 sm.setcharacterstream(11, clobreader,-1); 报错:java.lang.negativearraysizeexception 

  测试3:通过sm.setcharacterstream另一个构造方法,无长度参数,测试,成功。

 

如有问题,欢迎指正。新人驾到,请多关照。滑稽.jpg 

 

如对本文有疑问,请在下面进行留言讨论,广大热心网友会与你互动!! 点击进行留言回复

相关文章:

验证码:
移动技术网