触发器将插入行值设置为null

时间:2015-10-29 09:56:46

标签: sql plsql oracle11g

所以我正在尝试编写一个触发器,当某个东西插入到数据库中时,如果它超过特定时间,则将行值设置为null

CREATE OR REPLACE TRIGGER hi
  AFTER INSERT OR UPDATE OF CLASS_TIME ON class
  FOR EACH ROW 
BEGIN 
    IF (:NEW.CLASS_TIME < '09:00' ) 
    OR (:NEW.CLASS_TIME > '18:00' )
    THEN    
        RAISE_APPLICATION_ERROR(-20000, 'Due to low attendance no class cannot be scheduled at that time');
        SET NEW.STAFFNO = NULL; 
        SET NEW.CLASS_DAY = NULL; 
        SET NEW.CLASS_TYPE = NULL; 
        SET NEW.ROOMNUM = NULL;

    END IF; 
END; 

我在网上找到的所有内容都表明我得到的是正确的,但我在STAFFNO上得到了错误。提前感谢任何意见。

1 个答案:

答案 0 :(得分:1)

首先你必须决定:

  • 您希望插入或更新在不需要的时间完成时失败
  • 您希望处理插入或更新,但是将列设置为null。

你不能同时拥有两者。

如果要将列设置为NULL,则应该是 BEFORE INSERT / UPDATE触发器,因此更改的列将写入表中。 (在AFTER INSERT / UPDATE触发器中将字段设置为某个值不会产生任何影响,因为它们不会被写入。)

然后SET NEW.STAFFNO = NULL;不是有效的PL / SQL,而是必须:NEW.STAFFNO := NULL;

CREATE OR REPLACE TRIGGER hi
  BEFORE INSERT OR UPDATE OF class_time ON class
  FOR EACH ROW 
WHEN (new.class_time NOT BETWEEN '09:00' AND '18:00')
BEGIN 
  :new.staffno := null; 
  :new.class_day := null; 
  :new.class_type := null; 
  :new.roomnum := null;
END;