触发器在执行过程中遇到错误
Trigger encountered error during execution
我的更新功能之一无法执行,因为下面的触发器抛出异常 ORA-2001、ORA-06512 和 ORA-04088
create or replace TRIGGER "UAM_USER"."BEFORE_UPDATE_VILLAGE" BEFORE UPDATE ON village
FOR EACH ROW
DECLARE
v_tbl_id NUMBER(2);
user_xcep EXCEPTION;
PRAGMA EXCEPTION_INIT( user_xcep, -20001 );
BEGIN
IF :OLD.panchayat_id != :NEW.panchayat_id
THEN
RAISE user_xcep;
END IF;
v_tbl_id := 14;
IF :OLD.name != :NEW.name
THEN
INSERT INTO UAM_USER.MASTER_HISTORY
(HISTORY_ID
,TBL_ID
,USER_ID
,FIELD_NAME
,OLD_VALUE
,NEW_VALUE
,HISTORY_DATE
,USER_NAME
,record_id)
VALUES
(MASTER_HISTORY_SEQ.NEXTVAL
,v_tbl_id
,:NEW.UPDATE_BY
,'Name'
,:OLD.name
,:NEW.name
,:NEW.UPDATE_DATE
,:NEW.update_by_name
,:NEW.village_id
);
END IF;
IF (:OLD.name_hindi IS NULL AND :NEW.name_hindi IS NOT NULL)
OR (:NEW.name_hindi IS NULL AND :OLD.name_hindi IS NOT NULL)
OR (:OLD.name_hindi != :NEW.name_hindi)
THEN
INSERT INTO UAM_USER.MASTER_HISTORY
(HISTORY_ID
,TBL_ID
,USER_ID
,FIELD_NAME
,OLD_VALUE
,NEW_VALUE
,HISTORY_DATE
,USER_NAME
,record_id)
VALUES
(MASTER_HISTORY_SEQ.NEXTVAL
,v_tbl_id
,:NEW.UPDATE_BY
,'Name Hindi'
,:OLD.name_hindi
,:NEW.name_hindi
,:NEW.UPDATE_DATE
,:NEW.update_by_name
,:NEW.village_id
);
END IF;
IF (:OLD.status IS NULL AND :NEW.status IS NOT NULL)
OR (:NEW.status IS NULL AND :OLD.status IS NOT NULL)
OR (:OLD.status != :NEW.status)
THEN
INSERT INTO UAM_USER.MASTER_HISTORY
(HISTORY_ID
,TBL_ID
,USER_ID
,FIELD_NAME
,OLD_VALUE
,NEW_VALUE
,HISTORY_DATE
,USER_NAME
,record_id)
VALUES
(MASTER_HISTORY_SEQ.NEXTVAL
,v_tbl_id
,:NEW.UPDATE_BY
,'Status'
,:OLD.status
,:NEW.status
,:NEW.UPDATE_DATE
,:NEW.update_by_name
,:NEW.village_id
);
END IF;
END;
控制台日志:
org.springframework.jdbc.UncategorizedSQLException: PreparedStatementCallback; uncategorized SQLException for SQL [ UPDATE village SET name = ? ,panchayat_id = ? ,name_hindi = ? ,status = ? ,update_date = ? ,update_by = ? ,update_by_name = ? ,dc_id = ? ,loksabha_id = ? ,census_code = ? ,pincode = ? ,area_type = ? WHERE village_id = ? ]; SQL state [72000]; error code [20001]; ORA-20001:
ORA-06512: at "UAM_USER.BEFORE_UPDATE_VILLAGE", line 9
ORA-04088: error during execution of trigger 'UAM_USER.BEFORE_UPDATE_VILLAGE'
; nested exception is java.sql.SQLException: ORA-20001:
ORA-06512: at "UAM_USER.BEFORE_UPDATE_VILLAGE", line 9
ORA-04088: error during execution of trigger 'UAM_USER.BEFORE_UPDATE_VILLAGE'
我想不通,我检查了我控制器中的所有参数,所有参数都很好,我的控制器和服务没有问题,问题在触发器之上,根据我的研发错误代码ORA-20001
和ORA-06512
表示列宽错误,ORA-4088
表示递归更新。
更新代码:
@Override
public void update(Village village) {
String q = " UPDATE village "
+ " SET name = :name "
// + " ,panchayat_id = :panchayat_id "
+ " ,name_hindi = :name_hindi "
+ " ,status = :status "
+ " ,update_date = :update_date "
+ " ,update_by = :update_by "
+ " ,update_by_name = :update_by_name "
+ " ,dc_id = :dc_id "
+ " ,loksabha_id = :loksabha_id "
+ " ,census_code = :census_code "
+ " ,pincode = :pincode "
+ " ,area_type = :area_type "
+ " WHERE village_id = :village_id ";
MapSqlParameterSource param = new MapSqlParameterSource();
param.addValue("village_id", village.getVillageId());
param.addValue("panchayat_id", village.getPanchayat() != null ? village.getPanchayat().getPanchayatId() : null);
param.addValue("name", village.getName());
param.addValue("name_hindi", village.getNameHindi());
param.addValue("status", village.getStatus());
param.addValue("update_date", village.getUpdateDate());
param.addValue("update_by", village.getUserdetail() != null ? village.getUserdetail().getUserId() : null);
param.addValue("update_by_name", village.getUserdetail().getName());
param.addValue("dc_id", village.getDc() != null ? village.getDc().getDcId() : null);
param.addValue("loksabha_id", village.getLoksabha() != null ? village.getLoksabha().getLoksabhaId() : null);
param.addValue("census_code", village.getCensusCode());
param.addValue("pincode", village.getPincode());
param.addValue("area_type", village.getAreaType());
getNamedParameterJdbcTemplate().update(q, param);
}
我验证了我的列,一切正常,所以剩下的都是 ORA-04088,我无法弄清楚它在哪里以及如何递归地尝试更新表。
请帮忙
尝试通过包含 REFERENCING OLD AS OLD NEW AS NEW 来更改触发器声明
create or replace TRIGGER "UAM_USER"."BEFORE_UPDATE_VILLAGE" BEFORE UPDATE ON village
REFERENCING OLD AS OLD NEW AS NEW
FOR EACH ROW
ORA-06512 是标准的 PL/SQL 错误,当被调用的过程(或触发器)失败时。
Ora-04088 是 Oracle 在执行触发器出现运行时错误时抛出的标准错误。
根本原因是ORA-20001错误。这在用户定义的异常范围内,瞧!您的触发器定义了一个:
PRAGMA EXCEPTION_INIT( user_xcep, -20001 );
触发器在此处引发此异常:
IF :OLD.panchayat_id != :NEW.panchayat_id
THEN
RAISE user_xcep;
END IF;
看来您的更新语句试图更改 panchayat_id
的值。最好的解决方案是从 SET 子句中删除该列:
SET name = ? ,panchayat_id = ?
查看您的 SpringBatch(或其他)代码,也许您应该做的是更改验证检查。也许是这样的:
IF :OLD.panchayat_id is null then
null; -- allow update
ELSIF :NEW.panchayat_id is null then
:NEW.panchayat_id := :OLD.panchayat_id; -- don't wipe existing value
ELSIF :OLD.panchayat_id != :NEW.panchayat_id
THEN
RAISE user_xcep;
END IF;
我的更新功能之一无法执行,因为下面的触发器抛出异常 ORA-2001、ORA-06512 和 ORA-04088
create or replace TRIGGER "UAM_USER"."BEFORE_UPDATE_VILLAGE" BEFORE UPDATE ON village
FOR EACH ROW
DECLARE
v_tbl_id NUMBER(2);
user_xcep EXCEPTION;
PRAGMA EXCEPTION_INIT( user_xcep, -20001 );
BEGIN
IF :OLD.panchayat_id != :NEW.panchayat_id
THEN
RAISE user_xcep;
END IF;
v_tbl_id := 14;
IF :OLD.name != :NEW.name
THEN
INSERT INTO UAM_USER.MASTER_HISTORY
(HISTORY_ID
,TBL_ID
,USER_ID
,FIELD_NAME
,OLD_VALUE
,NEW_VALUE
,HISTORY_DATE
,USER_NAME
,record_id)
VALUES
(MASTER_HISTORY_SEQ.NEXTVAL
,v_tbl_id
,:NEW.UPDATE_BY
,'Name'
,:OLD.name
,:NEW.name
,:NEW.UPDATE_DATE
,:NEW.update_by_name
,:NEW.village_id
);
END IF;
IF (:OLD.name_hindi IS NULL AND :NEW.name_hindi IS NOT NULL)
OR (:NEW.name_hindi IS NULL AND :OLD.name_hindi IS NOT NULL)
OR (:OLD.name_hindi != :NEW.name_hindi)
THEN
INSERT INTO UAM_USER.MASTER_HISTORY
(HISTORY_ID
,TBL_ID
,USER_ID
,FIELD_NAME
,OLD_VALUE
,NEW_VALUE
,HISTORY_DATE
,USER_NAME
,record_id)
VALUES
(MASTER_HISTORY_SEQ.NEXTVAL
,v_tbl_id
,:NEW.UPDATE_BY
,'Name Hindi'
,:OLD.name_hindi
,:NEW.name_hindi
,:NEW.UPDATE_DATE
,:NEW.update_by_name
,:NEW.village_id
);
END IF;
IF (:OLD.status IS NULL AND :NEW.status IS NOT NULL)
OR (:NEW.status IS NULL AND :OLD.status IS NOT NULL)
OR (:OLD.status != :NEW.status)
THEN
INSERT INTO UAM_USER.MASTER_HISTORY
(HISTORY_ID
,TBL_ID
,USER_ID
,FIELD_NAME
,OLD_VALUE
,NEW_VALUE
,HISTORY_DATE
,USER_NAME
,record_id)
VALUES
(MASTER_HISTORY_SEQ.NEXTVAL
,v_tbl_id
,:NEW.UPDATE_BY
,'Status'
,:OLD.status
,:NEW.status
,:NEW.UPDATE_DATE
,:NEW.update_by_name
,:NEW.village_id
);
END IF;
END;
控制台日志:
org.springframework.jdbc.UncategorizedSQLException: PreparedStatementCallback; uncategorized SQLException for SQL [ UPDATE village SET name = ? ,panchayat_id = ? ,name_hindi = ? ,status = ? ,update_date = ? ,update_by = ? ,update_by_name = ? ,dc_id = ? ,loksabha_id = ? ,census_code = ? ,pincode = ? ,area_type = ? WHERE village_id = ? ]; SQL state [72000]; error code [20001]; ORA-20001:
ORA-06512: at "UAM_USER.BEFORE_UPDATE_VILLAGE", line 9
ORA-04088: error during execution of trigger 'UAM_USER.BEFORE_UPDATE_VILLAGE'
; nested exception is java.sql.SQLException: ORA-20001:
ORA-06512: at "UAM_USER.BEFORE_UPDATE_VILLAGE", line 9
ORA-04088: error during execution of trigger 'UAM_USER.BEFORE_UPDATE_VILLAGE'
我想不通,我检查了我控制器中的所有参数,所有参数都很好,我的控制器和服务没有问题,问题在触发器之上,根据我的研发错误代码ORA-20001
和ORA-06512
表示列宽错误,ORA-4088
表示递归更新。
更新代码:
@Override
public void update(Village village) {
String q = " UPDATE village "
+ " SET name = :name "
// + " ,panchayat_id = :panchayat_id "
+ " ,name_hindi = :name_hindi "
+ " ,status = :status "
+ " ,update_date = :update_date "
+ " ,update_by = :update_by "
+ " ,update_by_name = :update_by_name "
+ " ,dc_id = :dc_id "
+ " ,loksabha_id = :loksabha_id "
+ " ,census_code = :census_code "
+ " ,pincode = :pincode "
+ " ,area_type = :area_type "
+ " WHERE village_id = :village_id ";
MapSqlParameterSource param = new MapSqlParameterSource();
param.addValue("village_id", village.getVillageId());
param.addValue("panchayat_id", village.getPanchayat() != null ? village.getPanchayat().getPanchayatId() : null);
param.addValue("name", village.getName());
param.addValue("name_hindi", village.getNameHindi());
param.addValue("status", village.getStatus());
param.addValue("update_date", village.getUpdateDate());
param.addValue("update_by", village.getUserdetail() != null ? village.getUserdetail().getUserId() : null);
param.addValue("update_by_name", village.getUserdetail().getName());
param.addValue("dc_id", village.getDc() != null ? village.getDc().getDcId() : null);
param.addValue("loksabha_id", village.getLoksabha() != null ? village.getLoksabha().getLoksabhaId() : null);
param.addValue("census_code", village.getCensusCode());
param.addValue("pincode", village.getPincode());
param.addValue("area_type", village.getAreaType());
getNamedParameterJdbcTemplate().update(q, param);
}
我验证了我的列,一切正常,所以剩下的都是 ORA-04088,我无法弄清楚它在哪里以及如何递归地尝试更新表。
请帮忙
尝试通过包含 REFERENCING OLD AS OLD NEW AS NEW 来更改触发器声明
create or replace TRIGGER "UAM_USER"."BEFORE_UPDATE_VILLAGE" BEFORE UPDATE ON village
REFERENCING OLD AS OLD NEW AS NEW
FOR EACH ROW
ORA-06512 是标准的 PL/SQL 错误,当被调用的过程(或触发器)失败时。
Ora-04088 是 Oracle 在执行触发器出现运行时错误时抛出的标准错误。
根本原因是ORA-20001错误。这在用户定义的异常范围内,瞧!您的触发器定义了一个:
PRAGMA EXCEPTION_INIT( user_xcep, -20001 );
触发器在此处引发此异常:
IF :OLD.panchayat_id != :NEW.panchayat_id
THEN
RAISE user_xcep;
END IF;
看来您的更新语句试图更改 panchayat_id
的值。最好的解决方案是从 SET 子句中删除该列:
SET name = ? ,panchayat_id = ?
查看您的 SpringBatch(或其他)代码,也许您应该做的是更改验证检查。也许是这样的:
IF :OLD.panchayat_id is null then
null; -- allow update
ELSIF :NEW.panchayat_id is null then
:NEW.panchayat_id := :OLD.panchayat_id; -- don't wipe existing value
ELSIF :OLD.panchayat_id != :NEW.panchayat_id
THEN
RAISE user_xcep;
END IF;