0

このステートメントを介してテーブルにデータを挿入しています:

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;
4

1 に答える 1

1

説明ORA-01438は次のとおりです。

「この列に許可されている指定された精度より大きい値」

そのため、テーブルの 1 つ (必ずしも 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)。次に、使用しているデータをチェックして、どの数値が大きすぎるかを確認します。標準のデバッグ手法が役に立ちます。

于 2015-11-09T07:56:00.740 に答える