【问题标题】:SQL trigger to show salary change显示工资变化的 SQL 触发器
【发布时间】:2016-09-19 02:50:43
【问题描述】:

我正在尝试在 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;

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

【问题讨论】:

    标签: sql oracle plsql triggers


    【解决方案1】:

    您的代码存在几个问题。

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

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

    3. 另外,当你删除时,没有新值,只有旧值 价值。

    我会改变你的触发器如下..

    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;
    

    【讨论】:

    • 我试着像你说的那样实现它。它运行成功,但是当我更新数据时,没有出现与触发器相关的任何内容。它只是说“更新了 5 行”。没有任何触发器
    • 我没有在 dbms 输出中添加连接,所以我看不到它,谢谢
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-07
    • 1970-01-01
    • 2019-09-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多