2

我制作了一个简单的 DVD 商店数据库。DVD 表有一个“状态”列,可以是“FOR_RENT”、“FOR_SALE”、“RENTED”或“SOLD”。如果 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
4

1 回答 1

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;
于 2014-03-10T20:58:19.133 回答