【问题标题】:Oracle 10g Trigger Compiles but doesn't fireOracle 10g 触发器编译但不触发
【发布时间】:2014-06-19 20:06:27
【问题描述】:

我正在为班级工作一个项目,在该项目中,我们必须设置一个触发器,当学生缺席 5 次或更多时,不允许他们报名参加辅导预约。它编译时没有错误,但是当我插入违反约束的记录时,我无法触发它。如果有人能指出我哪里出错或指出我正确的方向,我将不胜感激,我已经为此苦苦挣扎了一段时间。

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;

【问题讨论】:

  • 它可能正在触发,但它没有可见的效果,因为它所做的只是向 dbms_output 发送一条消息,这可能在您的会话中被禁用。但是这里的问题是您的触发器正在查询同一个表,这不起作用。

标签: database oracle triggers oracle10g


【解决方案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;

【讨论】:

  • 非常感谢!一旦我插入第 5 个,它就会引发错误,非常感谢。
猜你喜欢
  • 2016-09-28
  • 1970-01-01
  • 1970-01-01
  • 2012-04-04
  • 1970-01-01
  • 1970-01-01
  • 2019-12-23
  • 2014-11-29
  • 2013-07-13
相关资源
最近更新 更多