【发布时间】: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 子句没有被评论时,问题仍然存在。