Я потратил часы, отслеживая источник этой ошибки и нахожусь в тупике. Мне удалось определить, что следующая простая инструкция выбора была проблемой (комментарий, а не ошибка .. так что да, это причина). n изначально было определено как число, я пробовал целое и для усмешек.Oracle select count (*) в n генерирует добавленное значение ORA-01401 для столбца
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.
Я не понимаю, как это может вызвать проблемы. Я видел этот подсчет числа (*) в x фрагменте кода в примерах. Процедура выполняется нормально, когда этот комментарий закомментирован. Единственное время «n» используется на следующем шаге, где я поднимаю и исключаю, если он равен> 0. Я буквально прокомментировал всю хранимую процедуру, оставив только этот оператор, и это вызывает ошибку.
Мои исследования онлайн показывают, что count (*) возвращает целое число.
В таблице категорий содержится около 50 строк.
Что мне не хватает?
Это категория: "CATEGORY_ID" NUMBER (, 0), НОМЕР "VERSION_VERSION_ID" (, 0), "SETTINGS_SETTING_ID" NUMBER (*, 0), "CATEGORY_LONG_NAME" CHAR (256 BYTE) , "CATEGORY_SHORT_NAME" СИМ (25 BYTE), "CATEGORY_DESCRIPTION" VARCHAR2 (4000 BYTE), "CATEGORY_FORM_ID" СИМ (10 BYTE), "CATEGORY_FORM_SYNONYM" СИМ (256 BYTE), "CATEGORY_GUIDE_FOR_USE" VARCHAR2 (4000 BYTE) , "CATEGORY_COMMENTS" VARCHAR2 (4000 BYTE), "CATEGORY_EFFECTIVE_DATE" DATE, " CATEGORY_UNTIL_DATE»ДАТА, "CATEGORY_CREATOR" СИМ (50 BYTE), "CATEGORY_ADMIN_STATUS" СИМ (25 BYTE), "CATEGORY_ADMIN_STATUS_DATE" ДАТА, "CATEGORY_REGISTR_STATUS" СИМ (25 BYTE), "CATEGORY_REGISTR_STATUS_DATE" ДАТА, "CATEGORY_STATUS" VARCHAR2 (10 BYTE), «CATEGORY_STATUS_JUST» VARCHAR2 (2000 BYTE), «CATEGORY_TYPE» НОМЕР
Существовал некоторые другие вещи вокруг фрагмента кода я послал, так что я создал новую хранимую процедуру, где присваиваются значения, которые будут передаются как параметры (переменные, заданные в отладчике). Я все еще получаю 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) ', то вы получите сообщение об ошибке при попытке сохранить две цифры номера, поступающего из счета. –
Пожалуйста, дайте нам структуру таблицы для категории. –
Nope .. n - число. Я попытался сделать его целым числом, так как я читаю count (*), возвращает целое число. Та же проблема. –