所以,如果满足条件,我要做的就是阻止插入。在这种情况下,我正在开发一个简单的库数据库系统,如果某个人已经借了两本书,但还没有归还一本书,我不想让他借到一本书。
我需要通过扳机来做这件事,有可能吗?此外,我还想知道是否可以像我一样向WHEN子句提供一个查询。
CREATE OR REPLACE TRIGGER trigger_borrowing_limit
BEFORE INSERT ON Borrowing
REFERENCING NEW ROW AS NROW
FOR EACH ROW
WHEN SELECT COUNT(*) FROM Borrowing WHERE RETURN_DATE IS NULL AND NROW.ID = Borrowing.ID > 2
BEGIN
?
END发布于 2014-06-15 21:32:06
不能为WHEN子句提供查询。从Oracle 11文档 (在到达页面后搜索"WHEN (条件)“):
对何时(条件)的限制
至于防止行插入,来自Mihai的注释是可行的。您的前端可以捕获异常,如果它是错误号-20101 (按照Mihai的示例),您就会知道这个人已经有两本书了。请注意,一些驱动程序将报告异常号的绝对值,因此到达您的错误号可能是20101。
增编:后续问题询问如何应用“两本书出”逻辑,因为它对WHEN子句无效。
答案是删除WHEN子句并将逻辑放入触发器主体。注意,我通常坚持使用标准的NEW来引用新行,所以我的答案没有REFERENCING NEW AS NROW
CREATE OR REPLACE TRIGGER trigger_borrowing_limit
BEFORE INSERT ON Borrowing
DECLARE
booksOut NUMBER;
BEGIN
SELECT COUNT(*) INTO booksOut
FROM Borrowing
WHERE RETURN_DATE IS NULL AND NEW.ID = Borrowing.ID;
IF booksOut > 2 THEN
-- Next line courtesy of Mihai's comment under the question
raise_application_error(-20101, 'You already borrowed 2 books');
END IF;
END;https://stackoverflow.com/questions/24233915
复制相似问题