2016-04-19 4 views
2

Я потратил часы, отслеживая источник этой ошибки и нахожусь в тупике. Мне удалось определить, что следующая простая инструкция выбора была проблемой (комментарий, а не ошибка .. так что да, это причина). 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; 
+0

Если тип 'n' были как-то' VARCHAR (1) ', то вы получите сообщение об ошибке при попытке сохранить две цифры номера, поступающего из счета. –

+0

Пожалуйста, дайте нам структуру таблицы для категории. –

+0

Nope .. n - число. Я попытался сделать его целым числом, так как я читаю count (*), возвращает целое число. Та же проблема. –

ответ

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; 
+0

Спасибо .. но такая же проблема. –