【问题标题】:Oracle select count(*) into n generates ORA-01401 inserted value too large for columnOracle select count(*) into n 生成 ORA-01401 插入的值对于列来说太大
【发布时间】:2016-08-10 23:56:22
【问题描述】:

我花了好几个小时来追踪这个错误的来源,我很困惑。我设法确定以下简单的选择语句是问题所在(评论而不是错误..所以是的,这是原因)。 n 最初被定义为一个数字,我也尝试使用整数来表示笑容。

n integer;

    n := 1;
select count(*) into n 
from category
where (
      upper(ltrim(rtrim(category_long_name))) = upper(ltrim(rtrim(cat_long_name)))
        or
      upper(ltrim(rtrim(category_short_name))) = upper(ltrim(rtrim(cat_short_name)))
        or
      upper(ltrim(rtrim(category_description))) = upper(ltrim(rtrim(cat_descr)))
      )  
  and (settings_setting_id = sett_id) and (category_id <> cat_id);

执行此代码时,我得到ORA-01401:插入的值对于列而言太大。因此,唯一的“插入”是行计数的 n 值。实际值(使用的调试器)为 0。

我不明白这会导致什么问题。我已经在示例中看到这个 select count(*) into x code sn-p。该过程运行良好,此语句被注释掉。唯一一次使用“n”是在下一步中,如果它 > 0,我会引发异常。我已经注释掉了整个存储过程,只留下了这个语句,它会导致错误。

我的在线研究表明 count(*) 返回一个整数。

类别表中大约有 50 行。

我错过了什么?

这是类别: "CATEGORY_ID" NUMBER(,0), "VERSION_VERSION_ID" NUMBER(,0), "SETTINGS_SETTING_ID" NUMBER(*,0), "CATEGORY_LONG_NAME" CHAR(256 BYTE), "CATEGORY_SHORT_NAME" CHAR(25 字节), "CATEGORY_DESCRIPTION" VARCHAR2(4000 BYTE), "CATEGORY_FORM_ID" CHAR(10 BYTE), “CATEGORY_FORM_SYNONYM”字符(256 字节), "CATEGORY_GUIDE_FOR_USE" VARCHAR2(4000 BYTE), “CATEGORY_COMMENTS”VARCHAR2(4000 字节), “CATEGORY_EFFECTIVE_DATE”日期, “CATEGORY_UNTIL_DATE”日期, "CATEGORY_CREATOR" CHAR(50 字节), "CATEGORY_ADMIN_STATUS" CHAR(25 BYTE), “CATEGORY_ADMIN_STATUS_DATE”日期, "CATEGORY_REGISTR_STATUS" CHAR(25 BYTE), “CATEGORY_REGISTR_STATUS_DATE”日期, "CATEGORY_STATUS" VARCHAR2(10 BYTE), "CATEGORY_STATUS_JUST" VARCHAR2(2000 BYTE), “CATEGORY_TYPE”编号

我发送的代码 sn-p 周围还有其他一些东西,所以我创建了一个新的存储过程,在其中我分配了将作为参数传递的值(我在调试器中设置的变量)。我仍然将选择计数(*)上的 ORA-01401 放入 N 行。 当我注释掉 where 子句时,问题就消失了。

create or replace PROCEDURE PROCEDURE1 
IS 
  CATEGORY_NAME_EXISTS Exception;
  WRONG_ACTION_PARAM Exception;
  WRONG_PARAM_SET Exception;
  NO_JUSTIFICATION Exception;
  VERSION_PERSISTENT Exception;
  CANNOT_APPROVE Exception;
  VERSION_SETTING_NEEDED Exception;
  n number :=1;
  msg1 nvarchar2(2000);
  curr_status nvarchar2(10);
  curr_persistent number;
  curr_sett_status nvarchar2(10);
  update_with_hierarchy nvarchar2(3);
  sql_txt nvarchar2(1000);  
  err_num number;
  err_msg varchar2(200);
  CAT_LONG_NAME nvarchar2(1000) := 'Administrative';
  CAT_SHORT_NAME nvarchar2(1000) := 'Administrative';
  CAT_DESCR nvarchar2(1000) := 'Admin form';
  SETT_ID number := 2;
  CAT_ID number := 13;
  categORy_long_name nvarchar2(1000);
  categORy_shORt_name nvarchar2(1000);
  categORy_description nvarchar2(1000);
  settings_setting_id number;
  categORy_id number;
BEGIN

    SELECT COUNT(*) INTO n 
    FROM categORy

    WHERE
    (
        UPPER(LTRIM(RTRIM(categORy_long_name))) = UPPER(LTRIM(RTRIM(cat_long_name)))
        OR
        UPPER(LTRIM(RTRIM(categORy_shORt_name))) = UPPER(LTRIM(RTRIM(cat_shORt_name)))
        OR
        UPPER(LTRIM(RTRIM(categORy_description))) = UPPER(LTRIM(RTRIM(cat_descr)))
    )  
    AND (settings_setting_id = sett_id) and (categORy_id <> cat_id)

    ;
END;

【问题讨论】:

  • 如果n 的类型不知何故为varchar(1),那么在尝试存储来自计数的两位数时会出现此错误。
  • 请给我们类别的表结构。
  • 不.. n 是一个数字。我也尝试将其设为整数,因为我读过 count(*) 返回一个整数。同样的问题。
  • 如果您从选择中删除条件并只保留SELECT COUNT(*) INTO n FROM categORy,您还会收到错误消息吗?
  • 你在做某事。当我注释掉 where 子句并执行该过程时,该错误不会发生。在第一次之后,我注意到并不是 where 子句中的所有变量都定义了。非常兴奋 - 但后来我宣布了它们,但当 where 子句没有被评论时,问题仍然存在。

标签: oracle oracle9i


【解决方案1】:

试试这个:

DECLARE
    n number := 1;
BEGIN
    SELECT COUNT(*) INTO n 
    FROM categORy
    WHERE
    (
        UPPER(LTRIM(RTRIM(categORy_long_name))) = UPPER(LTRIM(RTRIM(cat_long_name)))
        OR
        UPPER(LTRIM(RTRIM(categORy_shORt_name))) = UPPER(LTRIM(RTRIM(cat_shORt_name)))
        OR
        UPPER(LTRIM(RTRIM(categORy_description))) = UPPER(LTRIM(RTRIM(cat_descr)))
    )  
    AND (settings_setting_id = sett_id) and (categORy_id <> cat_id);
END;

【讨论】:

  • 谢谢.. 但同样的问题。
猜你喜欢
  • 2015-05-27
  • 2016-07-24
  • 2015-11-05
  • 2011-08-18
  • 1970-01-01
  • 2015-02-19
  • 1970-01-01
  • 2021-05-09
相关资源
最近更新 更多