如何编写一个在更新 date_returned 列时执行的触发器?
Posted
技术标签:
【中文标题】如何编写一个在更新 date_returned 列时执行的触发器?【英文标题】:How to write a Trigger that executes when date_returned column is updated? 【发布时间】:2015-12-08 02:14:57 【问题描述】:此触发器在 date_returned 列更新时执行。触发器应该计算罚款并更新借款人表中借款人的未偿罚款。每晚一天罚款 5 美元。
我的桌子:
DROP TABLE Loan_Transaction;
DROP TABLE Borrower;
CREATE TABLE Borrower (
Borr_ID NUMBER (4) PRIMARY KEY,
borr_name VARCHAR2 (25) not null,
borr_address VARCHAR2 (50) not null,
borr_city VARCHAR2 (15) not null,
phone VARCHAR2 (8),
borr_type VARCHAR2 (2),
books_on_loan NUMBER(1),
outstanding_fines NUMBER (6,2),
check (borr_type in('R','NR','S')),
check (books_on_loan <10)
);
CREATE TABLE Loan_Transaction (
loan_ID NUMBER (9) PRIMARY KEY,
Borr_ID NUMBER (7) REFERENCES Borrower,
Item_Copy_ID NUMBER (7),
loan_type VARCHAR2 (1),
loan_date DATE,
due_date DATE,
date_returned DATE,
check (loan_type in('O','R'))
);
到目前为止我所拥有的......
CREATE OR REPLACE TRIGGER fines
BEFORE UPDATE ON Loan_Transaction
FOR EACH ROW
DECLARE fine_amt NUMBER;
BEGIN
SET fine_amt = (loan_date - date_returned) * 5
UPDATE Borrower b
SET outstanding_fines = (outstanding_fines + fine_amt);
END;
/
这是错误:ORA-24344: 编译错误成功
【问题讨论】:
【参考方案1】:您的代码有语法错误。运行脚本创建触发器后,您需要运行 sho errors 以列出错误。
此行无效SET fine_amt = (loan_date - date_returned) * 5
应该是fine_amt := (:NEW.loan_date - :NEW.date_returned) * 5;
此外,您的更新声明没有任何意义。您需要使用 where 子句来仅更新与在 loan_transaction 表中更新的贷款相关的行。这段代码不正确,而且似乎也有问题。
您需要学习语法并相应地实施。您还需要使用 :OLD, :NEW 来引用 trigger 中来自 loan_transaction 的列。
【讨论】:
以上是关于如何编写一个在更新 date_returned 列时执行的触发器?的主要内容,如果未能解决你的问题,请参考以下文章