2011-06-09 90 views
0

我通过这条语句插入表中的数据:为什么代码会抛出java.sql.SQLException:ORA-01438?

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

同样的问题,但现在有一些更多的信息。 http://stackoverflow.com/questions/6290873/java-sql-sqlexception-ora-01438 – 2011-06-09 10:10:54

+0

我认为人们不愿意帮助你的两个重要原因。 1)你的格式非常差2)你没有编辑现有的问题,而是发布了一个副本! – adarshr 2011-06-09 10:15:10

+0

我不明白这是如何与Java相关的。应该是Oracle和PLSQL。你可能想更加努力地设置代码的格式。在当前状态下它几乎不可读。 – 2011-06-09 10:23:16

回答

0

ORA-01438的explanantion是:

“值大于该列允许的特定精度“

所以你的一个表(不一定是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)。然后检查您正在使用的数据以确定哪个数值太大。标准调试技术将有所帮助。

相关问题