触发检查会费

时间:2011-12-17 19:32:01

标签: sql oracle triggers

我需要一个触发器来检查过期费用。

如果它已经结束,它应该将一个名为loan的表中的一些细节放到一个名为fine的表中,但是,我创建的触发器会产生编译错误。

SQL> CREATE OR REPLACE TRIGGER Over_Due
  2  AFTER INSERT OR UPDATE ON loan_table
  3  FOR EACH ROW
  4  DECLARE due_date DATE;
  5  BEGIN
  6  SELECT COUNT(*) INTO due_date FROM loan_table l
  7     WHERE l.date_due = :new.date_due;
  8     IF(date_due > SYSDATE)
  9     THEN
 10  INSERT INTO fine_table VALUES(fine_id, :old.loan_id,:old.book_id,:old.student_id,amount);
 11  END IF;
END; 12
 13  /

 Warning: Trigger created with compilation errors.

 SQL> show errors;
 Errors for TRIGGER OVER_DUE:

 LINE/COL ERROR
 -------- -----------------------------------------------------------------
 3/1      PL/SQL: SQL Statement ignored
 3/8      PL/SQL: ORA-00932: inconsistent datatypes: expected DATE got
         NUMBER

3 个答案:

答案 0 :(得分:2)

您的设计存在一个大问题:触发器基于事件 - 您的只有在发生贷款时才会触发。如果一本书逾期且没有人暂时借书,会发生什么?答案是,没有!在借书之前,不会进行逾期检测。此外,每次借书时都会进行相同的检查,这种情况经常发生。

相反,你需要的是定期检查所有记录 - 我建议每天一次,在图书馆关闭后定时运行(所以你的处理过程确实如此) (不影响交易业绩)检查是否存在逾期账簿。

答案 1 :(得分:0)

您将Count(*)(数字)的值分配到DATE字段(due_date)。

我怀疑你打算在这里做的是:

select l.due_date into due_date from ...

答案 2 :(得分:0)

您的问题似乎是

SELECT COUNT(*) INTO due_date

COUNT(*)永远不会是DATE类型。

您可能希望像

一样修改它
...
DECLARE due_date DATE;
BEGIN
SELECT l.date_due INTO due_date FROM loan_table l
    WHERE l.date_due = :new.date_due ORDER BY l.date_due ASC LIMIT 1;
    IF(due_date > SYSDATE)
    THEN
...

将检查l.date_dueSYSDATE的最早{{1}}并相应地插入。如果你需要其他东西,你需要更具体。