PLSQL:NEW和:OLD

Pra*_*vin 26 oracle triggers plsql

任何人都可以帮助我了解何时使用:NEW:OLD在PLSQL块中,我发现很难理解它们的用法.

Gra*_*amA 33

您通常使用的条款的触发 使用: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;
Run Code Online (Sandbox Code Playgroud)

在此示例中,触发器触发BEFORE DELETE OR INSERT OR UPDATE :old.sal将包含触发器触发之前的工资,:new.sal并将包含新值.

  • @Pravin常见用例是验证和审计.使用上面的示例假设需求是跟踪员工工资历史记录,在这种情况下,我们可以将旧工资,修改日期和用户名插入历史记录表.在我正在使用ATM的应用程序中,触发器用于在编辑坐标时更新记录高程 (3认同)

Gok*_*Gok 19

:新值和:旧值可以在DML语句中区分.
Insert - :Old = NULL :New =插入新值

更新 - :Old =在Update语句之前存在于表中的值Triggered :New =给予Update更新的新值

删除 - :旧 =删除前的值 :新 = NULL


小智 7

:old和:new是在使用行级触发器时引用访问行级数据的伪记录.

  • :old - 指Old Value
  • :new - 指新值

对于以下操作,各自的旧值和新值:

  1. INSERT - :old.value = NULL,:new value = post insert value
  2. DELETE - :old.value = Pre删除值,:new value = null
  3. 更新 - :old.value =预更新值,:新值=更新后值

例如:

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;
Run Code Online (Sandbox Code Playgroud)

触发声明:

UPDATE employees
SET dept ='Accounts'
WHERE empno IN (101 ,105);
Run Code Online (Sandbox Code Playgroud)


小智 5

:new表示您要插入的新值:old表示数据库中的现有值