ORA-01461:只能为插入LONG列绑定LONG值 - 查询时发生

Rup*_*esh 63 oracle oracle11g

当我尝试查询对象时,我最终得到以下错误:

ORA-01461: can bind a LONG value only for insert into a LONG column
Run Code Online (Sandbox Code Playgroud)

有人可以帮助我解决问题的原因和解决方案吗?

Kir*_*ran 178

varchar2列也可能发生这种情况.通过JDBC简单地使用PreparedStatements可以很好地重现这一点

  1. 创建一个包含varchar2列(20或任意长度)的表
  2. 使用包含超过20个字符的行插入上表

因此,如上所述,类型或超出列宽可能是错误的.

另请注意,由于varchar2允许最大4k字符,因此双字节字符的实际限制为2k

希望这可以帮助

  • 在Oracle数据库中,我有一个表格,其列为VARCHAR2(2000 CHAR).我看到了ORA-01461(关于那个长值)和另一个错误ORA-12899.ORA-12899准确地说明了问题:实际长度:2392,最大长度:2000.当内容> 4000 CHAR时,似乎会返回误导性的ORA-01461,这是Oracle支持的最大值.当长度> 2000且<4000时返回ORA-12899.任何人都可以确认这一点(至少对Oracle而言)? (14认同)
  • @Vering,可以确认一下.我们得到了同样的行为. (5认同)
  • 这就是我们真正发生的事情。 (2认同)

Tom*_*Żuk 33

当在SQL语句中尝试使用长度超过4000字节的varchar变量时,会发生此错误.PL/SQL允许varchars最多32767字节,但数据库表和SQL语言的限制是4000.您不能使用SQL在SQL语句中无法识别的PL/SQL变量; 正如消息所解释的那样,一个例外是直接插入到长型列中.

create table test (v varchar2(10), c clob);


declare
  shortStr varchar2(10) := '0123456789';
  longStr1 varchar2(10000) := shortStr;
  longStr2 varchar2(10000);
begin
  for i in 1 .. 10000
  loop
    longStr2 := longStr2 || 'X';
  end loop;

  -- The following results in ORA-01461
  insert into test(v, c) values(longStr2, longStr2);

  -- This is OK; the actual length matters, not the declared one
  insert into test(v, c) values(longStr1, longStr1);

  -- This works, too (a direct insert into a clob column)
  insert into test(v, c) values(shortStr, longStr2);

  -- ORA-01461 again: You can't use longStr2 in an SQL function!
  insert into test(v, c) values(shortStr, substr(longStr2, 1, 4000));
end;
Run Code Online (Sandbox Code Playgroud)


Mar*_*bak 14

好吧,既然你没有显示任何代码,我会在这里做一些假设.

基于ORA-1461错误,您似乎在select语句中指定了LONG数据类型?你试图将它绑定到输出变量?是对的吗?错误很简单.您只能将LONG值绑定到LONG列中.

不知道还有什么可说的.错误是相当不言自明的.

通常,从LONG数据类型转移到CLOB是个好主意.CLOB受到更好的支持,而LONG数据类型实际上只是为了向后兼容.

是LONG数据类型限制列表

希望有所帮助.

  • 发生错误时无法在具有LONG类型的表上进行操作. (14认同)
  • 不幸的是,如果错误消息是由超过其字段长度的varchar2字段引起的,则错误消息不是很自我解释(参见Kiran的回答) (12认同)
  • 我在尝试将一些数据合并到一个带有 CLOB 的表中时得到了它 (2认同)
  • 我没有向下滚动并意识到Kiran有更好的答案.我不喜欢被接受的答案如何处于最顶端的想法,当另一个答案变得更加赞成时,应该有某种方式将其提升到第二位. (2认同)
  • 即使您尝试添加的字符多于为varchar列指定的大小,也会发生这种情况.例如varchar(4000):如果你给4001个字符就会得到那个错误. (2认同)

Mar*_*ien 8

我和我的同事发现了以下内容:

当我们使用Microsoft .NET Oracle驱动程序连接到oracle数据库(System.Data.OracleClient.OracleConnection)时

我们尝试使用数据库参数将长度在2000到4000个字符之间的字符串插入到CLOB或NCLOB字段中

oraCommand.CommandText = "INSERT INTO MY_TABLE (NCLOB_COLUMN) VALUES (:PARAMETER1)";
// Add string-parameters with different lengths
// oraCommand.Parameters.Add("PARAMETER1", new string(' ', 1900)); // ok
oraCommand.Parameters.Add("PARAMETER1", new string(' ', 2500));  // Exception
//oraCommand.Parameters.Add("PARAMETER1", new string(' ', 4100)); // ok
oraCommand.ExecuteNonQuery();
Run Code Online (Sandbox Code Playgroud)
  • 任何长度小于2000个字符的字符串都不会抛出此异常
  • 任何长度超过4000个字符的字符串都不会抛出此异常
  • 只有长度在2000到4000个字符之间的字符串才会抛出此异常

我们多年前在微软公司为这个漏洞开了一张票,但它还没有修好.


小智 5

仅当将其插入到Long列中时,才会出现此ORA-01461。绑定长字符串以将其插入VARCHAR2列时,可能会发生此错误,最常见的情况是在存在多字节(意味着单个字符在oracle中可能占用一个以上字节空间)字符转换问题时发生。

如果数据库是UTF-8,则由于每个字符最多占用3个字节,因此将3的转换应用于校验,因此实际上限制为使用1333个字符插入varchar2(4000)。

另一个解决方案是将数据类型从varchar2(4000)更改为CLOB。