SQL错误:ORA-12899:值对于列来说太大

时间:2010-12-03 16:57:35

标签: sql oracle ora-12899

我创建了下表

CREATE TABLE Customers(
  CustomerID varchar2(9) PRIMARY KEY, 
  Customer_Contact varchar2(40) NOT NULL, 
  Address varchar2(20) NOT NULL,
  Post_Code varchar2(7) NOT NULL, 
  Telephone_Number varchar2(11) NOT NULL)

我目前正在尝试使用INSERT VALUES语句。我写了以下陈述

INSERT INTO Customers VALUES(
  501623129, 
  'John Petterson', 
  '-- Singleton Close London', 
  '--- ---', 02082860222)

当我尝试运行该语句时,它给出了以下错误消息。

  

在命令的第4行开始出错:   插入客户   VALUES(501623129,'David Patterson',   '30 Singleton Close London','SW17   9JY',02082860642)错误报告:SQL   错误:ORA-12899:值太大了   专栏“DJ”。“CUSTOMERS”。“ADDRESS”   (实际:25,最大:20)   12899. 00000 - “列%s的值太大(实际:%s,最大值:%s)”

6 个答案:

答案 0 :(得分:18)

ORA-12899: value too large for column "DJ"."CUSTOMERS"."ADDRESS" (actual: 25, maximum: 2

告诉你错误是什么。地址最多可以包含20个字符,您传递25个字符。

答案 1 :(得分:8)

如上所述,错误消息显示确切的问题:您将25个字符传递到设置为20的字段中。您可能还需要考虑更精确地定义列。您可以定义VARCHAR2列是否存储一定数量的字节或字符。在将来尝试在字段中插入多字节字符时可能会遇到问题,例如,这个字符长度为5个字符,但不适合5个字节:'ÀÈÌÕÛ'

以下是一个例子:

CREATE TABLE Customers(CustomerID  VARCHAR2(9 BYTE), ...

CREATE TABLE Customers(CustomerID  VARCHAR2(9 CHAR), ...

答案 2 :(得分:2)

这个答案在ORA-12899的清单中仍然很高,以及上面的许多非有用的评论,即使它们已经过时了。最有帮助的评论是#4,任何专业人士试图找出他们在加载数据时得到这个的原因。

某些字符的长度超过1个字节,尤其是在SQL Server上。可能适合SQLServer中的varchar(20)的东西不适合Oracle中类似的varchar2(20)。

昨天我遇到了这个错误,SSIS加载了一个带有Attunity驱动程序的Oracle数据库,并且认为我会节省一些时间。

答案 3 :(得分:0)

在我的情况下,我将C# OracleCommandOracleParameter一起使用,并将所有参数Size属性设置为每列的最大长度,然后解决了错误。

OracleParameter parm1 = new OracleParameter();
param1.OracleDbType = OracleDbType.Varchar2;
param1.Value = "test1";
param1.Size = 8;

OracleParameter parm2 = new OracleParameter();
param2.OracleDbType = OracleDbType.Varchar2;
param2.Value = "test1";
param2.Size = 12;

答案 4 :(得分:0)

我只是想在这里分享 Google 的最佳结果...

我试图添加这样的虚拟列

alter table t1 add (
    export_code varchar2(3 char) as (case when country is null then code else substr(code, 3) end) virtual
);

然后 oracle 抱怨:

ORA-12899: value too large for column "EXPORT_CODE" (actual: 12, maximum: 480)

问题是,我的 code 列是 varchar2(120),所以 substr 最多 120 个字符。

创建临时表时可以发现:

create table t2 as
    select case when country is null then code else substr(code, 3) end as export_code from t1;

desc返回

Name        Null? Type          
----------- ----- ------------- 
EXPORT_CODE       VARCHAR2(120) 

一旦我意识到,解决方案是使用 export_code varchar2(120 char) 或进行强制转换:

alter table t1 add (
  export_code varchar2(3 char) as ( cast (case when country is null then code else substr(code, 3) end as varchar2(3 char) ) ) virtual
);

答案 5 :(得分:-2)

示例:1和2表可用

1表删除条目并选择也不是2个表记录并插入到没有1个表。当删除时间没有1表没有第二个表记录示例emp id不可用意味着出现此错误