2011-12-17 42 views
1

我需要一個觸發器來檢查超額會費。觸發檢查會費

如果它已經結束,它應該從一個名爲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

您指定COUNT(*)(數字)的價值爲日期字段(DUE_DATE)。

我懷疑你打算在這裏做的是:

select l.due_date into due_date from ... 
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並做相應的插件。如果你需要別的東西,你需要更具體。

2

有一個很大的問題與您的設計:觸發器是基於事件的 - 你只時,將觸發貸款作出。如果一本書已經逾期了,而且沒有人在一段時間內借了一本書,會發生什麼?答案是,什麼都沒有!在借書之前不會進行逾期檢測。此外,每次檢查時都會發生同樣的檢查一本書是借來的,這太經常了。

相反,你需要的是所有記錄週期性檢查 - 我建議每天一次,定時運行庫關閉後(讓你處理不影響事務性能),對於檢查存在過期的書籍。