关于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;
时间: 2024-07-30 19:31:01

关于blob转到目标库报ORA-01461: 仅能绑定要插入 LONG 列的 LONG 值错误解决方案的相关文章

更新数据库报错:SQL Error: 1461, SQLState: 72000 ORA-01461: 仅能绑定要插入 LONG 列的 LONG 值

原因:某一个字段本为varchar2(1024),但是实际要插入的值超过varchar2允许的最大长度4000时,oracle自动将该字段值转化为Long类型,然后提示插入操作失败. 解决办法: 1.是不是真的要插入超过定义长度的值?否则对长度做判断,截取等. 2.若是,则将字段采用clob.blob,或者使用文件代替,字段保存文件地址即可.

json-lib-2.4-jdk15.jar 报错 net.sf.json.JSONException: There is a cycle in the hierarchy!错误解决方案(Hibernate)

使用hibernate容易出现该问题,主要是由于pojo类属性存在级联关系.比如说员工和部门,在员工表里面有部门属性,而在部门表里面有个员工集合,这样就存在了嵌套引用的问题了,就会抛出这个异常. 解决方法很简单,在将每个对象转为json对象的时候用setExcludes函数将级联的属性去除掉就可以了,如下面: 比如CityVo  里面有关联属性 ProvinceVo province 以及 地区属性 Set<DistrictVo> districtList 使用hibernate 查询所有的c

ORACLE同义词源库锁表导致目标库删除操作报ora 02055 02049 02063 06512

故障现象:目标库执行存储过程过程中报ora 02055 02049 02063 06512错误 排查过程:1.查询该存储过程的110行只是简单的删除动作 2.通过如下SQL语句查死锁,未见任何死锁SELECT 'alter system kill session '||chr(39)||l.session_id||','||s.serial#||chr(39)||'immediate;', l.session_id sid,s.serial#,l.locked_mode,l.oracle_use

impdp+network link 跳过expdp直接导入目标库

impdp命令特殊用途,可以将数据库的一个用户迁移到另一台机器上的数据库的用户中.如果目标用户不存在,还可以对应的创建该用户. 快速的把A库上的用户迁移到B库上. 下面就来看一下命令格式: B库下执行命令: Impdp username/[email protected] schema=userA remap_schema=userA:userB remap_tablespace=tbsA:tbsB network_link=dblink_to_userA_on_userB 说明: Userid

【故障处理】 DBCA建库报错CRS-2566

[故障处理] DBCA建库报错CRS-2566 PRCR-1071 PRCR-1006 一.1  BLOG文档结构图       一.2  前言部分   一.2.1  导读和注意事项 各位技术爱好者,看完本文后,你可以掌握如下的技能,也可以学到一些其它你所不知道的知识,~O(∩_∩)O~: ① dbca静默建库 ② 将监听加入CRS中     Tips:        ① 若文章代码格式有错乱,推荐使用搜狗.QQ或360浏览器,也可以下载pdf格式的文档来查看,pdf文档下载地址:http://

Python virtualenv安装库报错SSL: CERTIFICATE_VERIFY_FAILED

Python virtualenv安装库报错SSL: CERTIFICATE_VERIFY_FAILED 问题描写叙述 使用pip依照virtualenv报错,例如以下: pip install virtualenv Collecting virtualenv /opt/python27/lib/python2.7/site-packages/pip/_vendor/requests/packages/urllib3/util/ssl_.py:315: SNIMissingWarning: An

Cygwin编译自定义OpenCV库报错:opencv_contrib: LOCAL_SRC_FILES points to a missing file

今天受命帮师弟调个OpenCV4Android 识别银行卡的程序,版本为OpenCV4Android2.4.9,使用方式为前文介绍的第一种方式,即通过jni调用opencv.如杂家前文所述,配套的NDK应使用较高版本的android-ndk-r9d.它的安装很简单,解压缩后设置环境变量到Path就ok:D:\ProgramFile\android-ndk-r9d; 但遗憾的是,同样的程序同样的配置在一台PC上通过Cygwin编译一切ok.但在新的一台电脑上却出现如下错误: Android NDK

导入第三方库报 unknown type name &#39;NSString&#39; 错误

添加包含 C OC C++混编文件的第三方库 报unknown type name 'NSString' 错误: stackOverflow上找到解决方法: 在所在项目pch文件中,把自己所#import的头文件做如下操作 #ifdef __OBJC__ #import #endif pch里面自加的头文件是全局性的,当在C等文件import时就是问题出处,所以要ObjC区分开编译 导入第三方库报 unknown type name 'NSString' 错误

plsql 连接oralce数据库,报ora 12557 tns 协议适配器不可加载错误

使用plsql 连接oracle 数据库报ora 12557 错误: 解决方案: 1:首先确保服务中的service以及监听器都开启 2:F:\app\Administrator\product\11.2.0\dbhome_1\NETWORK\ADMIN下的tnsnames配置文件中的字符串连接是否配置 这个路径根据你的oracle安装路径有关 3:如果还是不行,删除注册表里面的环境变量oracle_home,默认只想路径 cmd——rededit—— HKEY_LOCAL_MECHINE——S