• oracle ORA-01461 错误 can bind a LONG value only for insert into a LONG column


    我的ORACLE表里没有long字段,可是保存时报错: 

    ORA-01461 :仅可以为插入LONG列的LONG值赋值 


    本来我这张表里只有一个VARCHAR2(4000)的字段,一直没有这种错误发生,后来我把另一个字段长度调整为VARCHAR2(4000),这错误就开始发生了。 


    你的数据库字符集可能是UTF-8的,对于UTF-8或欧洲的某些字符集,oracle在存储时,对于一个字符需要2个或3个字节的存储空间,虽然表定义中为varchar2(4000),但是其实该字段的data_length为其2倍或3倍长。这种情况下oracle会把data_length长度超过4000的当做LONG型处理,你的表中有两个这样的字段,插入数据时相当于同时操作2个LONG字段,所以报错。 
    建议减小字段长度或拆分 

    案例2: 

    今天接到开发人员报告:在用jdbc导入数据时遇到ORA-01461 
    ORA-01461 can bind a LONG value only for insert into a LONG column 

    Cause: An attempt was made to insert a value from a LONG datatype into another datatype. This is not allowed. 

    Action: Do not try to insert LONG datatypes into other types of columns. 

    这个错误一般发生在插入或者更新Varchar2类型的字段 


    实际引起这个错误的主要原因是字符集问题及字符串长度到原因,根据本人遇到到情况一共分两种: 
    1、插入到字符串长度大于4000字节 
    2、插入到表中的记录其中一个是long类型、还有其他实际长度大于2000个字节(如果是UTF-8,则是1333个字节);或者是插入的记录中有两个或两个以上长度大于2000字节的字符串 

    用以下SQL可以查出有可能引起ORA-01461错误的表: 
    SELECT * FROM 
    (SELECT TABLE_NAME, OWNER, count(*) NUM 
    FROM DBA_TAB_COLUMNS 
    WHERE DATA_TYPE='LONG' 
    OR (( DATA_TYPE='VARCHAR2' 
    or DATA_TYPE='CHAR' 
    or DATA_TYPE='NVARCHAR2' 
    or DATA_TYPE='NCHAR') 
    AND DATA_LENGTH > 1333) 
    AND OWNER NOT IN 
    ('SYS','SYSTEM','SH','OLAPSYS','MDSYS','WKSYS','ODM','XDB','WMSYS') 
    GROUP BY TABLE_NAME, OWNER) 
    WHERE NUM > 1 


    在本例中,更好是插入到记录有2个字段长度大于2000,由于数据库字符集不可更改,故结合实际业务逻辑,将插入记录到其中一个字符串长度缩减在2000字节以下,解决连问题. 
  • 相关阅读:
    BFS(双向) HDOJ 3085 Nightmare Ⅱ
    BFS+Hash(储存,判重) HDOJ 1067 Gap
    BFS(判断状态) HDOJ 3533 Escape
    三进制状压 HDOJ 3001 Travelling
    BFS(八数码) POJ 1077 || HDOJ 1043 Eight
    Codeforces Round #332 (Div. 2)
    BFS HDOJ 2102 A计划
    if语句
    shell脚本编程测试类型下
    shell脚本编程测试类型上
  • 原文地址:https://www.cnblogs.com/yangkai-cn/p/4016611.html
Copyright © 2020-2023  润新知