PLSQL:BEFORE INSERT TRIGGER(在允许插入之前检查其他表中列的值)

时间:2014-03-10 02:04:29

标签: oracle plsql triggers ora-00911

我制作了一个简单的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

1 个答案:

答案 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;