2017-06-18 98 views
0

在例子中,使用的区别是什么:oracle中的new和new触发器有什么不同?

我有这样的触发

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

因此,在第二个例子中,你注意到的用法:作为我的标题描述新,并在第一个例子中使用新的没有冒号。这两者有什么区别?

谢谢!

+3

您使用'火:new'(带冒号)在触发器引用一个伪记录。引用'new'(不带冒号)会产生一个错误,除非你有一些名为'new'的其他对象(复合对象),比如包 - 坏主意。 –

回答

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

相关问题