2014-10-30 39 views
0
CREATE OR REPLACE TRIGGER stud 
AFTER INSERT ON error 
FOR EACH ROW 
BEGIN 
IF (age < 0) THEN 
RAISE.APPLICATION.ERROR(-2000,'No negative'); 
END IF; 
END; 

这是我的触发代码。其实我是DBMS的新手。我收到一个错误!插入不工作后触发?

ERROR at line 3: PLS-00103: Encountered the symbol ";" when expecting one of the following: 

    , * & - +/at mod remainder rem 
    as 
    from into || multiset bulk year DAY_ 

1. CREATE OR REPLACE TRIGGER stud 
2. AFTER INSERT ON error 
3. FOR EACH ROW 
4. BEGIN 
5. IF (age < 0) THEN 

我已经写了这个根据我引用的语法!最新错误,我不知道?

回答

1
RAISE_APPLICATION_ERROR 

RAISE.APPLICATION.ERROR 

if (:new.age < 0) 

if (age < 0) 

:new:old预选赛处于更相关触发器,因为它们允许您引用数据库中当前的值以及通过更新语句进入的新值。一个insert触发器只能访问:new值,因为数据库中当前没有行。我承认我并不是100%确定限定符在insert触发器中是强制性的,但即使不是,我建议使用它是一种很好的做法,因为它会使代码更清晰。

+0

雅的工作!你能告诉我为什么“:新”是需要的,它究竟是什么? – user3672971 2014-10-30 15:05:10

+0

我已经更新了我的答案并提供了进一步的解释。如果它解决了你的问题,不要忘记你可以升级或接受它。 :) – Bacs 2014-10-30 15:15:41

+0

感谢它帮助很多! :) – user3672971 2014-10-30 15:22:45

1

除了关于.而不是_RAISE.APPLICATION_ERROR的错误。

您必须指定值的范围,无论是old还是new。否则,Oracle如何知道您的IF条件是否为旧的或新的值?eferring

甲骨文有一个关于referencing old as old and new as new的条款是有原因的。值的状态需要非常清楚,无论是旧值还是新值。因为,只提到column name而不告诉Oracle是检查旧值还是新值是模糊的。这是需要验证的价值。