显示工资变化的 SQL 触发器

标签 sql oracle plsql triggers

我正在尝试在 sql developer 中创建一个简单的触发器,以在工资发生变化时显示工资的变化

CREATE OR REPLACE TRIGGER salary_changes
BEFORE DELETE OR INSERT OR UPDATE ON FACULTY
FOR EACH ROW

DECLARE
  sal_diff  NUMBER;

BEGIN
  sal_diff  :=  :NEW.F_SALARY  - :OLD.F_SALARY;

  DBMS_OUTPUT.PUT_LINE('Difference: ' || sal_diff);
END;

当我尝试运行触发器时,它提示输入新旧绑定(bind),当我尝试运行更新以查看它是否有效时,它提示触发器失败。那么我是如何错误地使用旧标签和新标签的呢?或者这不是问题

最佳答案

您的代码存在多个问题。

  1. 您需要创建一个后触发器而不是前触发器。

  2. 您正在尝试编写一个触发器来执行一个操作 插入、删除或更新。所以你应该做条件检查 (例如如果插入、删除或更新)子句。

  3. 此外,当您删除时,没有新值,只有旧值 值(value)。

我会如下更改您的触发器..

CREATE OR REPLACE TRIGGER salary_changes
AFTER DELETE OR INSERT OR UPDATE ON FACULTY
FOR EACH ROW

DECLARE
  sal_diff  NUMBER;
BEGIN
 If (INSERTING or UPDATING) then 
     sal_diff  :=  :NEW.F_SALARY  - :OLD.F_SALARY;
     DBMS_OUTPUT.PUT_LINE('Difference: ' || sal_diff);
  END IF;

 IF DELETING THEN 
    DBMS_OUTPUT.PUT_LINE('The deleted value is:' || :OLD.F_SALARY);
 END IF;   
END;

关于显示工资变化的 SQL 触发器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37370399/

相关文章:

sql - 汇总数据的分组依据

MySQL 带有连接的 SELECT 查询花费太长的时间

SQL合并具有相同ID但列值不同的两行(Oracle)

oracle - 静态 sql(与动态 SQL 相对)是否会使 Oracle 中的其他包无效

database - 是否可以将错误记录到DML操作中的错误记录(集合或临时表)中?

mysql - 在 Mysql 中验证电子邮件地址

sql - 如何获取表变量的行数?

java - Hibernate 映射 - 用关联表连接两个表 - 但有一个转折

ruby-on-rails - 使用 db :schema:dump using rake 在遗留 oracle 数据库上进行模式转储

sql - PL/SQL 调用 webservice https ORA-03113 通信 channel 上的文件结束