2011-06-09 92 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)。然後檢查您正在使用的數據以確定哪個數值太大。標準調試技術將有所幫助。

相關問題