Oracle 为什么代码抛出java.sql.SQLException:ORA-01438?
我通过以下语句在表中插入数据:Oracle 为什么代码抛出java.sql.SQLException:ORA-01438?,oracle,plsql,database-trigger,Oracle,Plsql,Database Trigger,我通过以下语句在表中插入数据: 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/12
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;
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)
。然后检查您正在使用的数据以确定哪个数值太大。标准调试技术将有所帮助。同样的问题,但现在需要更多信息。我认为人们不愿意帮助你有两个重要原因。1) 你的格式很差2)你没有编辑现有的问题,而是发布了一个重复的问题!我看不出这与Java有什么关系。应该是Oracle和PLSQL。您可能希望在格式化代码方面投入更多的精力。它在当前状态下几乎不可读。我认为错误本身就说明了问题,请检查值的长度并与表进行比较。做一个DESC CATEGORY_MASTER并发布结果。我通过格式化代码帮助新手。亲爱的Kiran,请下次使用一些格式化工具。此外,错误代码表明其中一个值太大。也许您可以检查数据,以找到导致问题的值?也许序列中的值变得惊人地大。