Oracle 如何编写PL/SQL程序,在使用触发器删除特定行(员工)后获取行数(员工数)?

Oracle 如何编写PL/SQL程序,在使用触发器删除特定行(员工)后获取行数(员工数)?,oracle,plsql,triggers,Oracle,Plsql,Triggers,我写了这篇文章,我很确定这里缺少了一些东西: CREATE OR REPLACE TRIGGER AFTER DELETE ON Employees FOR EACH ROW BEGIN SELECT COUNT(*) FROM Employees; END; 有人能帮我吗 SQL> CREATE OR REPLACE TRIGGER Trg_Emp_AD AFTER DELETE ON Employees 2 v_count INT; 3 BEGIN 4 SE

我写了这篇文章,我很确定这里缺少了一些东西:

CREATE OR REPLACE TRIGGER
AFTER DELETE
ON Employees
FOR EACH ROW
BEGIN
SELECT COUNT(*) FROM Employees;
END;
有人能帮我吗

SQL> CREATE OR REPLACE TRIGGER Trg_Emp_AD AFTER DELETE ON Employees
  2    v_count INT;
  3  BEGIN
  4    SELECT COUNT(*) INTO v_count FROM Employees;
  5    DBMS_OUTPUT.PUT_LINE( 'There are '||v_count||' lines in the table' );
  6  END;
  7  /
  v_count INT;
  *
ERROR at line 2:
ORA-04079: invalid trigger specification

如果需要显示计数的结果,则首先移除每行的
,将当前触发器主体转换为以下语句级别的类型,而不是行级别的触发器,例如

SQL> SET SERVEROUTPUT ON
SQL> CREATE OR REPLACE TRIGGER Trg_Emp_AD AFTER DELETE ON Employees
  v_count INT;
BEGIN
  SELECT COUNT(*) INTO v_count FROM Employees;
  DBMS_OUTPUT.PUT_LINE( 'There are '||v_count||' lines in the table' );
END;
/

你打算怎么处理这些信息?通常,
employees
上的行级触发器无法查询
employees
表。您可能会使用语句级触发器,但会丢失行更改的上下文,这通常是有问题的。您可以有一个包含行和语句级部分的复合触发器,其中行级触发器填充更改内容的集合,语句级触发器使用该集合查询表,但当您只发布一行内容时,这会增加很多复杂性。这与Justin的注释和Barbaros的注释一样答案是,为了更好的一致性,最好创建一个物化视图(提交时快速刷新),这样您就可以很容易地获得它,或者删除的特殊过程,它将在其输出参数中返回删除后的员工数,并且是它而不是带触发器的纯删除。不要忘记触发器会增加复杂性、影响性能和隐藏逻辑。假设触发器正常工作,那么在得到它时,您打算对计数做什么?你想用这些来解决什么商业问题。我强烈怀疑我们正在寻找x-y问题的第一阶段@EdStevens她正在学习。我试过这个,但它出了错误。它说触发器规范无效。不过我添加了触发器的名称。顺便说一下,我使用的是Oracle 19C。是的,我们错过了名称@GayatriBarhate,刚刚修复。