【问题标题】:What is the difference of using :new and new in triggers in oracle?在 oracle 的触发器中使用 :new 和 new 有什么区别?
【发布时间】:2017-11-20 23:46:28
【问题描述】:

例如,

我有这个触发器

CREATE OR REPLACE TRIGGER SAL_REDUCE
BEFORE UPDATE ON DRIVER --or insert--
FOR EACH ROW
BEGIN
IF(NEW.SAL < 1000) THEN
RAISE_APPLICATION_ERROR(-20001,'SALARY CANNOT BE REDUCED!!! PAY THEM MORE');
END IF;
END;
/

还有这个触发器

CREATE OR REPLACE TRIGGER Salary_check
BEFORE INSERT OR UPDATE OF Sal, Job ON Emp99
FOR EACH ROW
DECLARE
Minsal NUMBER;
Maxsal NUMBER;
Salary_out_of_range   EXCEPTION;
BEGIN

/* Retrieve the minimum and maximum salary for the
employee's new job classification from the SALGRADE
table into MINSAL and MAXSAL: */

SELECT Minsal, Maxsal INTO Minsal, Maxsal FROM Salgrade
WHERE Job_classification = :new.Job;
IF (:new.Sal < Minsal OR :new.Sal > Maxsal) THEN
  RAISE Salary_out_of_range;
END IF;
EXCEPTION
WHEN Salary_out_of_range THEN
  Raise_application_error (-20300,
     'Salary '||TO_CHAR(:new.Sal)||' out of range for '
     ||'job classification '||:new.Job
     ||' for employee '||:new.Ename);
WHEN NO_DATA_FOUND THEN
  Raise_application_error(-20322,
     'Invalid Job Classification '
     ||:new.Job_classification);
END;
/

所以,在第二个示例中,正如我在标题中所描述的那样,您注意到了 :new 的用法,而在第一个示例中,则使用了不带冒号的 new。这两者有什么区别?

谢谢!

【问题讨论】:

  • 您使用:new(带有冒号)来引用触发器中的伪记录。引用 new(不带冒号)将产生错误,除非您有其他名为 new 的对象(复合对象),例如包 - 坏主意。

标签: sql oracle plsql triggers oracle-sqldeveloper


【解决方案1】:

第一个触发器在语法上不正确。正如 Nicholas 已经评论过的,:new 在触发器的主体中是必需的。

唯一需要new. 的地方是触发器定义的WHEN 子句。例如:

CREATE OR REPLACE TRIGGER SAL_REDUCE
BEFORE UPDATE ON DRIVER --or insert--
FOR EACH ROW
WHEN (NEW.SAL > 100)
BEGIN
  IF(:NEW.SAL < 1000) THEN
    RAISE_APPLICATION_ERROR(-20001,'SALARY CANNOT BE REDUCED!!! PAY THEM MORE');
  END IF;
END;
/

在这个愚蠢的人为示例中,触发器只会在 SAL 超过 100 时触发。

【讨论】:

    猜你喜欢
    • 2018-08-02
    • 2011-11-22
    • 2018-06-04
    • 1970-01-01
    • 1970-01-01
    • 2012-12-29
    • 1970-01-01
    • 2017-10-31
    • 2011-04-23
    相关资源
    最近更新 更多