2014-05-03 61 views
0

我正在为班级开发一个项目,在这个项目中,我们必须设置一个触发器,以防止学生在有5个或更多缺席时注册预约辅导。它编译时没有错误,但当我插入违反约束条件的记录时,我无法启动它。如果任何人都能指出我出错的地方或者指向正确的方向,我将不胜感激,因此我一直在头撞墙。Oracle 10g触发器编译但不会触发

CREATE OR REPLACE TRIGGER absence_violation 
    BEFORE INSERT ON appointment FOR EACH ROW 
DECLARE 
    absences NUMBER(1); 
BEGIN 
    SELECT COUNT(app_attendance) 
    INTO absences 
    FROM appointment 
    WHERE app_attendance = 'N' 
    AND stu_id = :new.stu_id; 

    IF absences >= 5 THEN 
    dbms_output.put_line('ERROR 223, Student Exceeds Absence Violations'); 
    END IF; 
END; 
+0

它可能会触发,但它没有任何可见的效果,因为它所做的只是向dbms_output发送消息,该消息可能在会话中被禁用。这里的问题虽然是你的触发器查询同一个表,这是行不通的。 –

回答

1

尝试在你的代码中使用的RAISE_APPLICATION_ERROR代替DBMS_OUTPUT.PUT_LINE

CREATE OR REPLACE TRIGGER ABSENCE_VIOLATION 
BEFORE INSERT ON APPOINTMENT 
FOR EACH ROW 
DECLARE Absences NUMBER (1); 
BEGIN 
Select COUNT(app_attendance) INTO Absences 
FROM appointment 
WHERE app_attendance = 'N' AND Stu_ID = :NEW.Stu_ID; 
IF Absences >= 5 THEN RAISE_APPLICATION_ERROR(223, 'Student Exceeds Absence Violations'); 
END IF; 
END; 
+0

非常感谢!只要我插入第五个,就会引发错误,非常有必要。 – Hual0901