2014-05-03 97 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