关于blob转到目标库报ORA-01461: 仅能绑定要插入 LONG 列的 LONG 值错误解决方案
Posted ThinkDifferent
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了关于blob转到目标库报ORA-01461: 仅能绑定要插入 LONG 列的 LONG 值错误解决方案相关的知识,希望对你有一定的参考价值。
在数据抽取时,开发需要clob类型的数据,但是目标库类型是blob类型的,于是抽取的时候报错:
ORA-01461: 仅能绑定要插入 LONG 列的 LONG 值错误
可能有以下几种原因:
可能有以下几种原因:
1、插入到字符串长度大于4000字节。
2、插入到表中的记录的某个字段数据的实际长度大于2000个字节(如果是UTF-8,则是1333个字节);或者是插入的记录中有两个或两个以上长度大于2000字节的字符串。
3、数据库与客户端的JDBC 驱动不匹配。对于UTF-8或欧洲的某些字符集,oracle在存储时,对于一个字符需要2个或3个字节的存储空间,虽然表定义中为 varchar2(4000),但是其实该字段的data_length为其2倍或3倍长。这种情况下oracle会把data_length长度超过 4000的当做LONG型处理,你的表中有两个这样的字段,插入数据时相当于同时操作2个LONG字段。
4、使用9i的及以下的版本引发的bug. 10.1.0.1版本中已经修复bug
我这边遇到的是第一种,字符串长度大于4000了。
解决方法:
创建函数进行转换就可以了。
函数如下:
CREATE OR REPLACE FUNCTION BlobToClob(blob_in IN BLOB) RETURN CLOB AS v_clob CLOB; v_varchar VARCHAR2(32767); v_start PLS_INTEGER := 1; v_buffer PLS_INTEGER := 32767; BEGIN DBMS_LOB.CREATETEMPORARY(v_clob, TRUE); FOR i IN 1 .. CEIL(DBMS_LOB.GETLENGTH(blob_in) / v_buffer) LOOP v_varchar := UTL_RAW.CAST_TO_VARCHAR2(DBMS_LOB.SUBSTR(blob_in, v_buffer, v_start)); DBMS_LOB.WRITEAPPEND(v_clob, LENGTH(v_varchar), v_varchar); DBMS_OUTPUT.PUT_LINE(v_varchar); v_start := v_start + v_buffer; END LOOP; RETURN v_clob; END BlobToClob;
以上是关于关于blob转到目标库报ORA-01461: 仅能绑定要插入 LONG 列的 LONG 值错误解决方案的主要内容,如果未能解决你的问题,请参考以下文章
mybatis + oracle insert clob,出现ORA-01461:仅能绑定要插入LONG列的LONG值
ORA-01461 带有 MERGE INTO 语句和 clob 列
MyBatis 批量插入包含 BLOB 类型的数据到 Oracle 异常问题分析
MyBatis 批量插入包含 BLOB 类型的数据到 Oracle 异常问题分析
ORA-01461用于继承char(1字节)列 - 需要使用Spring JDBC(扩展StoredProcedure)使其工作