You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PL/SQL触发器编译报PLS-00382错误,求定位解决

PL/SQL触发器编译报错求助

我是PL/SQL初学者,写了一段将CSV文件导入GLOBALTERRORISM数据库的PL/SQL代码。现在脚本编译时持续报错,具体输出如下:

Trigger BEFORE_INSERT_GLOBALTERRORISM compiled
LINE/COL ERROR

187/9 PL/SQL: Statement ignored
187/61 PLS-00382: expression is of wrong type
Errors: check compiler log

Trigger AFTER_INSERT_GLOBALTERRORISM compiled

Trigger BEFORE_UPDATE_GLOBALTERRORISM compiled
LINE/COL ERROR

207/9 PL/SQL: Statement ignored
207/61 PLS-00382: expression is of wrong type
Errors: check compiler log

Trigger 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.19 09:59:51