如何编写一个在更新 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 列时执行的触发器?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Julia 中编写和读取包含日期时间列的 DataFrame

Oracle 11G - NVL 和 AVG

Rails 3.x 如何根据行值编写全部更新?

如何根据与另一个表中的值的比较来更新列

如何更新重复列值上的 mySQL 键

如何为更新列的数量是动态的编写更新语句