我制作了一个简单的DVD商店数据库。 DVD表格中有一个“状态”列,可以是“FOR_RENT”,“FOR_SALE”,“RENTED”或“已售出”。如果DVD表中的状态列未设置为“FOR_RENT”,我想写一个触发器来阻止任何插入到我的RENTALS表中。
我看过的大部分文档一般都没有显示使用两个不同表中的值的示例,所以我有点不知所措。
这是我认为迄今为止我最好的尝试:
CREATE OR REPLACE TRIGGER RENTAL_UNAVAILABLE
BEFORE INSERT ON RENTAL;
FOR EACH ROW
WHEN (DVD.STATUS != 'FOR_RENT')
DECLARE
dvd_rented EXCEPTION;
PRAGMA EXCEPTION_INIT( dvd_rented, -20001 );
BEGIN
RAISE dvd_rented;
EXCEPTION
WHEN dvd_rented THEN
RAISE_APPLICATION_ERROR(-20001,'DVD has been rented');
END;
/
我收到了这个错误:
ORA-00911: invalid character
答案 0 :(得分:3)
试试这个 - 我没有遵守代码,但应该是好的。如果您看到任何编译问题,请告诉我并在sqlfiddle.com上发布架构
CREATE OR REPLACE TRIGGER rental_unavailable
BEFORE INSERT
ON rental
FOR EACH ROW
DECLARE
dvd_rented EXCEPTION;
PRAGMA EXCEPTION_INIT (dvd_rented, -20001);
n_count NUMBER (1);
BEGIN
SELECT COUNT (*)
INTO n_count
FROM dvd
WHERE dvd_id = :NEW.dvd_id AND dvd.status = 'FOR_RENT' AND ROWNUM < 2;
IF n_count > 0
THEN
RAISE dvd_rented;
END IF;
EXCEPTION
WHEN dvd_rented
THEN
raise_application_error (-20001, 'DVD has been rented');
END;