PLSQL:NEW和:OLD

时间:2012-10-30 08:37:21

标签: oracle plsql triggers

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

15 个答案:

答案 0 :(得分:30)

您通常使用trigger中的字词: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将包含新值。

答案 1 :(得分:17)

:新的和:旧值可以在DML语句中区分 插入 - :旧 = NULL :新 =插入新值

更新 - :旧 =在Update语句之前表中存在的值触发:新建 =给予新值更新

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

答案 2 :(得分:6)

: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 =预更新值,:新值=发布更新 值
  4. 例如:

    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);
    

答案 3 :(得分:4)

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

答案 4 :(得分:1)

:旧的是你的旧价值 :new是你的新价值,

它在触发器中使用很多,例如Creation_Date& Modified_By字段

答案 5 :(得分:1)

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

•:旧-表示旧值 •:new-表示新值

例如:

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;

希望这解释了旧的和新的概念。

答案 6 :(得分:0)

:new是新值 - 触发触发器后,这是列的值 :old是旧值 - 触发器触发后,此值将替换为                        :新值

答案 7 :(得分:0)

新的和旧的与触发器内的更新操作更相关,要获取字段的旧值,请使用old;对于最近的值,请使用new

答案 8 :(得分:0)

简单的方法

当您将数据处理到表中时,将触发触发器。因此,在触发调用时,您同时具有这两个值。一种是指旧数据值,另一种是您最近更新/删除/插入的新数据值。 如果是

插入-旧值将为null,新值将包含一些值 更新-旧的和新的都有一定的价值 删除-旧有值,新无值。

因此,通过使用:OLD和:NEW,您可以在要维护历史记录的位置插入/更新其他表,或者基于:OLD或:NEW值可以插入/更新其他依赖表。

希望这对您有所帮助。

答案 9 :(得分:0)

:OLD和:NEW是Record类型的变量,其列与触发触发器的表行的列相同。它们仅适用于行级触发器。由于触发器是在预定义事件上自动触发的,因此:OLD和:NEW也将自动获取其值。顾名思义,:OLD将具有表中现有的完整行值(即在update和delete情况下具有现有值),而:NEW将具有该行的新值(即在update和delete情况下具有行值)。插入)。

答案 10 :(得分:0)

A simple example that shows the use of old and new using triggers

CREATE TABLE emp_log(
emp_id NUMBER;
updated_by DATE,
new_salary VARCHAR2(15),
Action VARCHAR2(20));

CREATE OR REPLACE TRIGGER log_sal 
AFTER UPDATE OF sal on emp
FOR EACH ROW
BEGIN
INSERT INTO emp_log( emp_id, updated_by, new_salary, Action)
VALUES(:NEW.empno, USER, :NEW.sal, 'New salary');
END;
/

答案 11 :(得分:0)

这很简单

If Insert :old = NULL and :New = New Inserted Value
If Update  :Old = Value already in the table  :New = Updated Value in the Table
If Delete :Old = Value before deletion :New = NULL

换句话说

  1. 对于INSERT触发器,OLD不包含任何值,而NEW包含 新值。

  2. 对于UPDATE触发器,OLD包含旧值,NEW包含旧值 新值。

  3. 对于DELETE触发器,OLD包含旧值,NEW包含旧值 没有值。

示例:

CREATE OR REPLACE TRIGGER update_name_view_trigger
INSTEAD OF UPDATE ON emp_locations
BEGIN
  UPDATE employees SET
    first_name = substr( :NEW.name, instr( :new.name, ',' )+2),
    last_name = substr( :NEW.name, 1, instr( :new.name, ',')-1)
  WHERE employee_id = :OLD.employee_id;
END;

答案 12 :(得分:0)

在更新之后/之前100%的时间里,您可以使用:OLD :NEW是(插入或更新)添加的新值的记录 :OLD用于旧值。 没有它们,触发器就没用了

答案 13 :(得分:0)

这里主要是指词

:old 指触发触发前的旧值。 :new 包含触发器触发后的值。

答案 14 :(得分:0)

您在尝试进行任何数据库修改(更新)时可能会遇到此问题。当您插入(添加/新)数据时,:New 将出现。由于您没有任何现有数据,因此没有显示为 :Old。当您通过代码更新现有详细信息时,您将看到现有数据显示为 :Old,更新后的详细信息显示为 :New