编写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
相关产品推荐
相关产品推荐

