我想创建一个触发器,强制延迟返回罚款是每天2美元。罚款应自动计算并添加到余额中。下面是我的代码以及我对触发器的尝试。触发器只占一天的租赁代码,但如果我能找出其中一个租赁代码,另外两个很容易弄明白。
到目前为止,我有什么触发器代码:
Create or Replace Trigger Late_Rule
BEFORE INSERT ON Transaction
For each Row
DECLARE
NofDays NUMBER;
ChargeDays Number;
Fee Number;
BEGIN
SELECT count(Rental_Code) into NofDays
From Transaction Group by Mem_num having Mem_num= :new.Mem_num;
DBMS_output.put_line(NofDays);
If Rental_Code = 'R101'
If (Date_Rented_Out - Date_returned) > 1
NofDays- 1 = ChargeDays
ChargeDays * 2 = Fee
ELSE
Fee = 0
END IF;
END IF;
Update Fee into Unpaid_Bal
end;
/
show error;
--Attempt 2
Create or replace trigger Late_Fee_Rule
Before UPDATE ON transaction
for each row
DECLARE
Fine_Due NUMBER;
BEGIN
SET Fine_Due = trunc(sysdate - date_rented_out) * 2
where date_returned is null
and (sysdate - date_rented_out) > decode (Rental_code, 'R101', 1, 'R103', 3, 'R105', 5);
Update Member
where Unpaid_Bal = (Unpaid_Bal + Fine_Due)
End;
/
show error;
答案 0 :(得分:0)
你最近问过几个关于触发器的问题,所以我认为你正在了解它们。但是,您已达到触发器不适合您需要实现的业务逻辑的程度。
你很难写出触发器,这表明你走错了路。更好的解决方案是使用数据库作业每天检查一次所有未退回的电影,并计算每笔交易的罚款。看起来你打算在TRANSACTION表上有一个很好的到期列:这是一种方法。生活稍微困难一些,因为租期是一个字符串代码而不是天数,而且你不会存储截止日期。
update transaction
set fine_due = trunc(sysdate - date_returned_out) * 2
where date_returned is null
and (sysdate - date_returned_out) > decode (rental_code, 'R101', 1, 'R103', 3, 'R105', 5)
/
答案 1 :(得分:0)
如果任何数据(如罚款到期)会持续变化(例如每天),则根本不要将其存储在模型中。
相反,使用视图在报告时计算它,例如(改编自APC的例子):
CREATE transaction_vw AS
SELECT t.*
,CASE WHEN date_returned is null
and (sysdate - date_returned_out)
> DECODE(rental_code
,'R101', 1
,'R103', 3
,'R105', 5)
THEN trunc(sysdate - date_returned_out) * 2
END AS fine_due
FROM transaction t;