ORA-12899:列值太大

raj*_*aju 5 oracle

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

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

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

我不能增加列长度,因为它是生产中的基表.

Fra*_*itt 8

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

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

  ALTER TABLE table_name MODIFY column_name VARCHAR2(15 CHAR)
Run Code Online (Sandbox Code Playgroud)

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

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

  • 在列数据库设置为的目标数据库中创建一个临时表 15 CHAR
  • 将源表中的数据插入到临时表中
  • 找到有问题的行

    SELECT*FROM staging WHERE lengthb(mycol)> 15

(注意使用LENGTHBas附加LENGTH- 前者以字节为单位返回长度,而后者以字符为单位返回长度)


小智 6

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

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