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

编写works_on表插入触发器遇PLS-00103错误该如何解决

问题原因分析

你编写的触发器触发PLS-00103报错,以及逻辑不匹配需求的核心问题如下:

  • 基础语法错误:IF分支结构混乱,多个END IF、ELSIF、ELSE的嵌套逻辑完全不符合PL/SQL语法要求,导致解析到SELECT语句时直接触发语法报错
  • 拼写错误:代码中反复将表名works_on错写为worsk_on,字段名也存在porject_number这类拼写错误
  • 非法语法:不能直接将SELECT语句放在IF的判断条件中,需要先将查询结果赋值给变量再做判断;同时聚合函数的过滤不能写在WHERE子句中,需要用HAVING子句处理
  • 逻辑不匹配需求:原代码的判断条件和你提出的三条规则没有对应关系,也没有取当前插入行的员工SSN、工时值,会错误扫描全表数据
正确实现代码
create or replace trigger works_on_insert_check
before insert on works_on
for each row
declare
    -- 存储当前员工已关联的项目数、总工时、单个项目最大工时
    v_project_count NUMBER;
    v_total_hours NUMBER;
    v_max_single_hours NUMBER;
    
    ex_single_hours_over EXCEPTION;
    ex_total_hours_over EXCEPTION;
    ex_project_count_over EXCEPTION;
begin
    -- 查询当前插入员工的已有数据统计
    SELECT COUNT(*), NVL(SUM(hours),0), NVL(MAX(hours),0)
    INTO v_project_count, v_total_hours, v_max_single_hours
    FROM works_on
    WHERE ssn = :NEW.ssn;
    
    -- 规则3:员工最多可关联6个项目
    IF v_project_count >=6 THEN
        RAISE ex_project_count_over;
    END IF;
    
    -- 规则1:单个项目工时超50,不得分配第二个项目
    IF v_project_count >=1 AND v_max_single_hours >50 THEN
        RAISE ex_single_hours_over;
    END IF;
    
    -- 规则2:2个项目总工时超70,不得关联第三个项目
    IF v_project_count >=2 AND v_total_hours >70 THEN
        RAISE ex_total_hours_over;
    END IF;

EXCEPTION
    WHEN ex_project_count_over THEN
        raise_application_error(-20001,'员工最多可关联6个项目,无法继续分配');
    WHEN ex_single_hours_over THEN
        raise_application_error(-20002,'员工已有单个项目工时超过50小时,无法分配第二个项目');
    WHEN ex_total_hours_over THEN
        raise_application_error(-20003,'员工2个项目总工时已超过70小时,无法关联第三个项目');
end;
/
逻辑说明
  • 通过:NEW.ssn获取当前待插入行的员工编号,仅查询该员工的历史项目数据,不会影响其他员工
  • 用NVL函数处理员工首次插入没有历史数据的场景,避免空值导致判断逻辑失效
  • 按规则优先级依次校验,命中任意规则就抛出对应错误终止插入操作,符合需求要求

内容的提问来源于stack exchange,提问作者Toni Rossi

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.20 14:06:08