Триггер обнаружил ошибку во время выполнения - PullRequest
0 голосов
/ 11 октября 2018

Одна из моих функций обновления не может быть выполнена, поскольку приведенный ниже триггер генерирует исключения 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, и я не могу понять, где и как он рекурсивно пытается обновить таблицы.

Пожалуйста, помогите

Ответы [ 2 ]

0 голосов
/ 11 октября 2018

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;
0 голосов
/ 11 октября 2018

Попробуйте изменить склонение триггера, добавив ссылку НА СТАРЫЙ КАК СТАРЫЙ НОВЫЙ КАК НОВЫЙ

create or replace TRIGGER "UAM_USER"."BEFORE_UPDATE_VILLAGE" BEFORE UPDATE ON village
 REFERENCING OLD AS OLD NEW AS NEW

FOR EACH ROW
...