【问题标题】:(Oracle SQL Stored Proc) Insert a single character into a table -- Value too large for columns(Oracle SQL 存储过程) 向表中插入单个字符 -- 值对于列来说太大
【发布时间】:2014-04-15 10:09:18
【问题描述】:

据我所知,在声明存储过程时,不可能指定 CHAR 的长度,因此它似乎默认为 200 个字符的长度。这是一个问题,因为我的表只接受 1 个字符的 CHAR。

因此,即使我只将单个字符传递给存储过程,我仍然会收到此错误:

ORA-12899: value too large for columns ... (actual: 200, maximum: 1)

这是我所拥有的:

CREATE OR REPLACE
PACKAGE BODY TESTPACKAGE AS

      PROCEDURE Testing(myChar IN CHAR)
      IS
      BEGIN
        UPDATE my_table SET my_column = myChar WHERE [some condition];
      END Testing;

END TESTPACKAGE;

我的包裹声明:

PROCEDURE Testing(myChar IN CHAR);

真正的存储过程显然有更多的参数和逻辑,但我已经将其剥离到问题区域。

在不改变我的表以接受 200 个字符的 CHARS(这完全没有必要)的情况下,处理这个问题的最佳方法是什么?

谢谢

【问题讨论】:

  • 尝试使用varchar作为参数
  • 是的,这行得通。为什么 varchar 有效,但 CHAR 无效?如果您将评论移至答案,我会接受。
  • 因为CHAR 总是用空格填充到定义的长度。这是使用 CHAR 几乎没有意义的原因之一。
  • 如果你声明 char(200) 它总是 200 长。 Varchar2(200) 只会占用您分配给它的字符串所需的空间。

标签: sql oracle plsql oracle11g


【解决方案1】:

我只能产生这个错误是传入的变量被定义为char(200)

declare
  val char(200);
begin
  val := 'b';
  testpackage.testing(val);
end;
/

ORA-12899: value too large for column ... (actual: 200, maximum: 1)

如果 val 被声明为 char(1) 或传递了字符串文字,则不会出错:

declare
  val char(1);
begin
  val := 'b';
  testpackage.testing(val);
end;
/

anonymous block completed

begin
  testpackage.testing('b');
end;
/

anonymous block completed

所以它看起来根本不是默认的。如果你不能改变传递变量的声明方式,你可以trim它:

      PROCEDURE Testing(myChar IN CHAR)
      IS
      BEGIN
        UPDATE my_table SET my_column = trim(myChar)
        WHERE [some condition];
      END Testing;

然后这个工作:

declare
  val char(200);
begin
  val := 'b';
  testpackage.testing(val);
end;
/

anonymous block completed

如果调用者尝试传递多个字符,这仍然会失败,但这可能就是你想要的。

【讨论】:

    猜你喜欢
    • 2015-05-27
    • 1970-01-01
    • 2016-08-10
    • 2023-03-23
    • 1970-01-01
    • 2010-12-20
    • 1970-01-01
    • 2015-02-19
    • 1970-01-01
    相关资源
    最近更新 更多