Oracle select count(*)into n生成的ORA-01401插入值对于列

时间:2016-04-19 02:47:38

标签: oracle oracle9i

我花了几个小时追查这个bug的来源并且很难过。我设法确定下面简单的选择语句是问题(评论而不是错误..所以是的,它是原因)。 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:列值的插入值太大。所以唯一的&#34;插入&#34;是行数的n值。实际值(使用的调试器)为0.

我不明白这是如何导致问题的。我在示例中看到了这个选择计数(*)到x代码段。注释掉该语句,程序运行正常。唯一的时间&#39; n&#39;用于下一步我提出和例外,如果它&gt; s&gt;我完全注释掉了整个存储过程,只留下了这个语句,它会导致错误。

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

类别表中有大约50行。

我错过了什么?

这是类别: &#34; CATEGORY_ID&#34; NUMBER(,0), &#34; VERSION_VERSION_ID&#34; NUMBER(,0), &#34; SETTINGS_SETTING_ID&#34; NUMBER(*,0),     &#34; CATEGORY_LONG_NAME&#34; CHAR(256 BYTE),     &#34; CATEGORY_SHORT_NAME&#34; CHAR(25 BYTE),     &#34; CATEGORY_DESCRIPTION&#34; VARCHAR2(4000 BYTE),     &#34; CATEGORY_FORM_ID&#34; CHAR(10 BYTE),     &#34; CATEGORY_FORM_SYNONYM&#34; CHAR(256 BYTE),     &#34; CATEGORY_GUIDE_FOR_USE&#34; VARCHAR2(4000 BYTE),     &#34; CATEGORY_COMMENTS&#34; VARCHAR2(4000 BYTE),     &#34; CATEGORY_EFFECTIVE_DATE&#34;日期,     &#34; CATEGORY_UNTIL_DATE&#34;日期,     &#34; CATEGORY_CREATOR&#34; CHAR(50 BYTE),     &#34; CATEGORY_ADMIN_STATUS&#34; CHAR(25 BYTE),     &#34; CATEGORY_ADMIN_STATUS_DATE&#34;日期,     &#34; CATEGORY_REGISTR_STATUS&#34; CHAR(25 BYTE),     &#34; CATEGORY_REGISTR_STATUS_DATE&#34;日期,     &#34; CATEGORY_STATUS&#34; VARCHAR2(10 BYTE),     &#34; CATEGORY_STATUS_JUST&#34; VARCHAR2(2000 BYTE),     &#34; CATEGORY_TYPE&#34; NUMBER

我发送的代码片段还有一些其他的东西,所以我创建了一个新的存储过程,我分配了将作为参数传递的值(我在调试器中设置的变量)。我仍然将选择计数(*)上的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;

1 个答案:

答案 0 :(得分:0)

试试这个:

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;