我花了几个小时追查这个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;
答案 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;