Почему код выбрасывает исключение java.sql.SQLException: ORA-01438? - PullRequest
0 голосов
/ 09 июня 2011

Я вставляю данные в таблицу через это утверждение:

insert into CATEGORY_MASTER (
  CAT_MAS_ID, 
  DESCRIPTION, ORG_ID, STATUS, MODIFY_EMPID, LANGUAGE_ID, LG_IP_MAC)  
values ( 
  ( SELECT COALESCE(MAX(ct.cat_mas_id), 0)+1 
    FROM category_master ct),
  'fff', 2, 'A', 52,1,'SYSTEM/127.0.0.1/NOTDEFINE')

Таблица назначения имеет этот триггер:

create or replace trigger trg_aft_i_u_category_master
  after insert OR UPDATE of cat_mas_id,status on category_master FOR EACH ROW
DECLARE
  CURSOR CSTYPE IS
    SELECT CST.SUB_TYPE_ID,CST.TYPE_ID,CST.ORG_ID,CST.STATUS
    FROM COMPLAINT_SUB_TYPE CST
    WHERE CST.ORG_ID=:NEW.ORG_ID AND CST.STATUS='A';
  V_CSTYPE CSTYPE%ROWTYPE;
BEGIN
  IF CSTYPE%ISOPEN THEN
    CLOSE CSTYPE;
  END IF;
  OPEN CSTYPE;
  LOOP
    FETCH CSTYPE INTO V_CSTYPE;
    EXIT WHEN CSTYPE%NOTFOUND;
    if INSERTING then
      /******** Suspect issue here  *******/
      INSERT INTO CATEGORY_DETAILS(
          CAT_DTL_ID, CAT_MAS_ID, TYPE_ID ,SUB_TYPE_ID,
          ORG_ID,MAP_STATUS,MODIFY_EMPID,LANGUAGE_ID,LG_IP_MAC)
      VALUES (SEQ_CATEGORY_DETAILS.NEXTVAL,:NEW.CAT_MAS_ID, 
          V_CSTYPE.TYPE_ID,V_CSTYPE.SUB_TYPE_ID,:NEW.ORG_ID,'U',
          :NEW.MODIFY_EMPID,:NEW.LANGUAGE_ID,:NEW.LG_IP_MAC);
      /************************************/
    end if;
    if UPDATING then
      if :new.status = 'I' then
        UPDATE CATEGORY_DETAILS CD 
        SET CD.MAP_STATUS= 'U' 
        WHERE CD.CAT_MAS_ID=:NEW.CAT_MAS_ID AND CD.ORG_ID=:NEW.ORG_ID;
      end if;
    end if;
  END LOOP;
  CLOSE CSTYPE;
end trg_aft_i_u_category_master;

1 Ответ

0 голосов
/ 09 ноября 2015

Объяснение для ORA-01438:

"значение, превышающее указанную точность, разрешенную для этого столбца"

Таким образом, в одной из ваших таблиц (не обязательно MASTER_CATEGORY) есть числовой столбец, определенный значащими цифрами, и ваш код пытается вставить слишком большое число.

Учитывая эту таблицу ...

SQL> create table t42 (col1 number(5,2));

Table created.
SQL> 

... мы можем вставить значение, соответствующее объявлению:

SQL> insert into t42 values (123.45);

1 row created.

SQL> 

... база данных округляет конечные десятичные числа:

SQL> insert into t42 values (12.345);

1 row created.

SQL> 

... и база данных отклоняет значение, когда ведущий элемент слишком велик:

SQL> insert into t42 values (1234.5);
insert into t42 values (1234.5)
                        *
ERROR at line 1:
ORA-01438: value larger than specified precision allowed for this column

SQL> 

Теперь это становится проблемой для вас. Вам нужно описать свои таблицы, чтобы увидеть, какие столбцы определены как точные числа, например, NUMBER(3) или NUMBER(7,2). Затем проверьте данные, которые вы используете, чтобы определить, какое числовое значение слишком велико. Стандартные методы отладки помогут.

...