如何编写PL/SQL触发器:删除员工行后统计员工总数(ORA-04079报错解决)
报错原因逐一排查
- 第一版初始代码的缺失问题:
CREATE OR REPLACE TRIGGER关键字后未指定触发器名称,语法结构缺失- 裸写
SELECT COUNT(*) FROM Employees没有配置接收结果的INTO变量,查询结果无承载位置,也没有实际的输出逻辑,属于无效空操作
- 第二版代码触发
ORA-04079: invalid trigger specification的核心原因:
PL/SQL块的变量声明段必须前置DECLARE关键字,原代码在写触发表映射后直接声明v_count INT,跳过了块结构的声明段标识,不符合触发器的语法解析规则,直接触发语法校验错误。 - 额外隐藏问题:如果按照最初的写法保留
FOR EACH ROW行级触发,就算语法修正完成,后续运行时也会触发ORA-04091 表正在变异,触发器无法读取的错误——因为行级触发器执行过程中,表的数据还处于逐行修改的中间状态,不允许直接查询本表的全表统计值。
可正确实现需求的代码方案
因为需求是删除操作完成后统计全表员工总行数,不需要逐行响应单条删除动作,直接用语句级后触发即可,从结构上规避变异表问题,完整代码如下:
CREATE OR REPLACE TRIGGER Trg_Emp_AD AFTER DELETE ON Employees DECLARE v_total_emp INT; BEGIN -- 统计删除完成后的全表员工数 SELECT COUNT(*) INTO v_total_emp FROM Employees; DBMS_OUTPUT.PUT_LINE('删除操作执行完成,当前员工表总剩余行数为:' || v_total_emp); END; /
使用注意:执行删除操作测试前,需要先在SQL*Plus/开发工具中开启服务器输出功能,执行
SET SERVEROUTPUT ON,否则无法看到触发器输出的统计信息。
内容的提问来源于stack exchange,提问作者Gayatri Barhate
相关产品推荐
相关产品推荐

