PL/SQL触发器编译报PLS-00382错误,求定位解决
PL/SQL触发器编译报错求助
我是PL/SQL初学者,写了一段将CSV文件导入GLOBALTERRORISM数据库的PL/SQL代码。现在脚本编译时持续报错,具体输出如下:
Trigger BEFORE_INSERT_GLOBALTERRORISM compiled
LINE/COL ERROR187/9 PL/SQL: Statement ignored
187/61 PLS-00382: expression is of wrong type
Errors: check compiler logTrigger AFTER_INSERT_GLOBALTERRORISM compiled
Trigger BEFORE_UPDATE_GLOBALTERRORISM compiled
LINE/COL ERROR207/9 PL/SQL: Statement ignored
207/61 PLS-00382: expression is of wrong type
Errors: check compiler logTrigger AFTER_UPDATE_GLOBALTERRORISM compiled
Trigger BEFORE_DELETE_GLOBALTERRORISM compiled
一开始我以为是日期验证的CASE语句导致的问题,原代码如下:
-- Validate day of the month CASE WHEN :NEW.IMONTH IN (1, 3, 5, 7, 8, 10, 12) THEN -- Months with 31 days IF :NEW.IDAY < 1 OR :NEW.IDAY > 31 THEN RAISE_APPLICATION_ERROR(-20003, 'Day must be between 1 and 31 for the given month.'); END IF; WHEN :NEW.IMONTH IN (4, 6, 9, 11) THEN -- Months with 30 days IF :NEW.IDAY < 1 OR :NEW.IDAY > 30 THEN RAISE_APPLICATION_ERROR(-20004, 'Day must be between 1 and 30 for the given month.'); END IF; WHEN :NEW.IMONTH = 2 THEN -- February, handle leap year IF (:NEW.IYEAR MOD 4 = 0 AND :NEW.IYEAR MOD 100 <> 0) OR (:NEW.IYEAR MOD 400 = 0) THEN IF :NEW.IDAY < 1 OR :NEW.IDAY > 29 THEN RAISE_APPLICATION_ERROR(-20005, 'Day must be between 1 and 29 for February in a leap year.'); END IF; ELSE IF :NEW.IDAY < 1 OR :NEW.IDAY > 28 THEN RAISE_APPLICATION_ERROR(-20006, 'Day (IDAY) must be between 1 and 28 for February in a non-leap year.'); END IF; END IF; END CASE;
我把这段代码改成了IF语句的形式:
-- Validate day of the month IF :NEW.IMONTH IN (1, 3, 5, 7, 8, 10, 12) THEN -- Months with 31 days IF :NEW.IDAY < 1 OR :NEW.IDAY > 31 THEN RAISE_APPLICATION_ERROR(-20003, 'Day must be between 1 and 31 for the given month.'); END IF; END IF; IF :NEW.IMONTH IN (4, 6, 9, 11) THEN -- Months with 30 days IF :NEW.IDAY < 1 OR :NEW.IDAY > 30 THEN RAISE_APPLICATION_ERROR(-20004, 'Day must be between 1 and 30 for the given month.'); END IF; END IF; IF :NEW.IMONTH = 2 THEN -- February, handle leap year IF (:NEW.IYEAR MOD 4 = 0 AND :NEW.IYEAR MOD 100 <> 0) OR (:NEW.IYEAR MOD 400 = 0) THEN IF :NEW.IDAY < 1 OR :NEW.IDAY > 29 THEN RAISE_APPLICATION_ERROR(-20005, 'Day must be between 1 and 29 for February in a leap year.'); END IF; ELSE IF :NEW.IDAY < 1 OR :NEW.IDAY > 28 THEN RAISE_APPLICATION_ERROR(-20006, 'Day (IDAY) must be between 1 and 28 for February in a non-leap year.'); END IF; END IF; END IF;
但报错情况完全没变化。我甚至直接删掉了这段日期验证代码,问题依然存在。之后我又怀疑是生成EVENTID的代码片段导致的,尝试调整后还是没用:
SELECT COUNT(*) s INTO v_count FROM GLOBALTERRORISM WHERE IYEAR = :NEW.IYEAR AND IMONTH = :NEW.IMONTH AND IDAY = :NEW.IDAY; -- Generate the EVENTID based on IYEAR, IMONTH, IDAY, and the occurrence count :NEW.EVENTID := TO_CHAR(:NEW.IYEAR, 'FM0000') || TO_CHAR(:NEW.IMONTH, 'FM00') || TO_CHAR(:NEW.IDAY, 'FM00') || TO_CHAR(v_count + 1, 'FM0000');
内容的提问来源于stack exchange,提问作者JIA CIN WONG
相关产品推荐
相关产品推荐

