我需要一个触发器来检查过期费用。
如果它已经结束,它应该将一个名为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
答案 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_due
对SYSDATE
的最早{{1}}并相应地插入。如果你需要其他东西,你需要更具体。