您通常使用a中的条款 触发 运用 :old 引用旧的价值和 :new 引用新值。
:old
:new
以下是与上面链接的Oracle文档中的示例
CREATE OR REPLACE TRIGGER Print_salary_changes BEFORE DELETE OR INSERT OR UPDATE ON Emp_tab FOR EACH ROW WHEN (new.Empno > 0) DECLARE sal_diff number; BEGIN sal_diff := :new.sal - :old.sal; dbms_output.put('Old salary: ' || :old.sal); dbms_output.put(' New salary: ' || :new.sal); dbms_output.put_line(' Difference ' || sal_diff); END;
在此示例中,触发器触发 BEFORE DELETE OR INSERT OR UPDATE :old.sal 将包含触发器触发前的工资和 :new.sal 将包含新值。
BEFORE DELETE OR INSERT OR UPDATE
:old.sal
:new.sal
:new是新值 - 触发触发器后,这是列的值 :old是旧值 - 触发器触发后,此值将替换为 :新的价值
:old和:new是在使用行级触发器时引用访问行级数据的伪记录。
对于以下操作,各自的旧值和新值:
例如:
CREATE OR REPLACE TRIGGER get_dept BEFORE DELETE OR INSERT OR UPDATE ON employees FOR EACH ROW BEGIN DBMS_OUTPUT.PUT('Old Dept= ' || :OLD.dept|| ', '); DBMS_OUTPUT.PUT('New Dept= ' || :NEW.dept ); END;
触发声明:
UPDATE employees SET dept ='Accounts' WHERE empno IN (101 ,105);
新旧与触发器内的更新操作更相关,用于获取旧字段的旧值以及最近值使用new
:新值和:旧值可以在DML语句中区分。 的 插入 强> - 的 :旧 强> = NULL 的 :新 强> =插入新值
的 更新 强> - 的 :旧 强> = Update语句触发前表中存在的值 的 :新 强> =给予Update更新的新值
的 删除 强> - 的 :旧 强> =删除前的值 的 :新 强> = NULL
:旧是你的旧价值 :新是你的新价值,
它在触发器中使用很多,例如Creation_Date& Modified_By字段
“老: - 指旧价值 “新: - 指新价值
CREATE OR REPLACE TRIGGER mytrig BEFORE INSERT OR UPDATE ON mytab FOR EACH ROW BEGIN IF INSERTING THEN SELECT trunc(sysdate), trunc(sysdate) INTO :new.created, :NEW.last_updated FROM DUAL; END IF; --INSERTING IF UPDATING THEN SELECT trunc(sysdate) INTO :NEW.last_updated FROM DUAL; END IF; --UPDATING END;
希望这能解释新旧概念。
简单来说,
将数据操作到表中时将触发触发器。所以当触发器调用时,你同时拥有两个值。一个是指旧数据值,一个是您最近更新/删除/插入的新数据值。 的情况下
insert-旧值为null,新值包含一些值 更新 - 旧的和新的都有一些价值 delete - old有值但new不包含值。
所以通过使用:OLD和:NEW,您可以插入/更新您想要维护历史记录的其他表或基于:OLD或:您可以插入/更新其他一些依赖表的新值。
希望这可以帮助你..
:new表示您尝试插入的新值 :old表示数据库中的现有值