ORA-12899:列值太大

时间:2014-12-20 04:39:58

标签: oracle

我以Feed的形式从erp系统获取数据,特别是Feed中的一列长度仅为15。

在目标表中也对应列也长度为varchar2(15)但是当我尝试将其加载到db时它显示错误如:

  

ORA-12899:列emp_name的值太大(实际值:16,最大值:   15)

我无法增加列长度,因为它是生产中的基表。

4 个答案:

答案 0 :(得分:8)

这类问题的常见原因是非ASCII字符,可以在原始数据库中用一个字节表示,但在目标数据库中需要两个(或更多)字节(由于不同的NLS设置)。

要确保目标列足够容纳15个字符,您可以对其进行修改:

  ALTER table_name MODIFY column_name VARCHAR2(15 CHAR)

(注意15 CHAR - 您也可以使用BYTE;如果两者都不存在,则数据库使用NLS_LENGTH_SEMANTICS设置作为默认设置。

要检查哪些值大于15个字节,您可以

  • 在目标数据库中创建一个临时表,其列长度设置为15 CHAR
  • 将源表中的数据插入到临时表
  • 使用

    查找有问题的行

    SELECT * FROM staging WHERE lengthb(mycol)> 15

(注意使用LENGTHB作为LENGTH - 前者返回长度(以字节为单位),后者以字符形式返回长度)

答案 1 :(得分:5)

看看这个博客,通过将列数据类型从varchar(100)更改为varchar(100 char)来解决问题。在我的情况下,数据包含一些变音字符。

http://gerardnico.com/wiki/database/oracle/byte_or_character

答案 2 :(得分:0)

我发现AL32UTF8是唯一有效的设置。这与标准UTF8不同,少数字符具有补充字节,即字符大约99%相同。我猜你正在进行角色转换问题。换句话说,table1中的数据是使用一个字符集编写的,而新表的字符集略有不同。

如果这是真的,你必须找到oddball charset的来源。因为这将继续发生。

答案 3 :(得分:0)

解决方案:

  

ORA-12899:栏目价值过高(实际,最大)

如果您在更新已经拥有超过下面新长度的数据的表的列大小时遇到​​问题,那么这个简单的脚本肯定会有效。

ALTER TABLE TABLE_NAME ADD (NEW_COLUMN_NAME DATATYPE(DATASIZE));
UPDATE TABLE_NAME SET NEW_COLUMN_NAME  = SUBSTR(OLD_COLUMN_NAME , 1, NEW_LENGTH);
ALTER TABLE TABLE_NAME DROP COLUMN OLD_COLUMN_NAME ;
ALTER TABLE TABLE_NAME RENAME COLUMN NEW_COLUMN_NAME  TO OLD_COLUMN_NAME;

查询的含义:

ALTER TABLE TABLE_NAME ADD (NEW_COLUMN_NAME DATATYPE(DATASIZE));

它只会在现有表格中创建所需新长度的新列。

UPDATE TABLE_NAME SET NEW_COLUMN_NAME  = SUBSTR(OLD_COLUMN_NAME , 1, NEW_LENGTH);

它将从旧列值中丢弃新长度值之后的所有值,并将修剪后的值设置为新列名。

ALTER TABLE TABLE_NAME DROP COLUMN OLD_COLUMN_NAME ;

现在将删除旧列名称为荒谬,我们已将所有信息复制到新列中。

ALTER TABLE TABLE_NAME RENAME COLUMN NEW_COLUMN_NAME  TO OLD_COLUMN_NAME;

将新列名重命名为旧列名将帮助您重新获得原始表结构,但新列的大小除外。