从同一个表

时间:2016-12-06 21:18:40

标签: sql oracle

我想构建一个触发器,它可以获得一本书的最低价格,如果新价格是最小值的5倍,则会触发。我的SELECT语句出错了。我认为这是因为我从同一张桌子中选择了触发器。

CREATE OR REPLACE TRIGGER check
BEFORE INSERT OR UPDATE ON book_type
FOR EACH ROW

DECLARE 
newPrice number;
lowestPrice number;
topPrice number;

BEGIN
newPrice := NEW.price;
lowestPrice := (SELECT MIN(price) FROM book_type);
topPrice := (5 * lowestPrice); 

IF (topPrice < newPrice) THEN
  dbms_output.put_line('Error. Price too high.');
END IF;
END;
/

1 个答案:

答案 0 :(得分:1)

首先,您不能以这种方式分配值。你需要这样的东西:

select min(price) into lowestPrice from book_type;

但是,您将看到的下一个问题是变异表错误(ORA-4091),因为您正在尝试从定义触发器的同一个表中进行选择。换句话说,触发器是在table book_type上定义的,并且您尝试从触发器中的table book_type中进行选择。 Oracle不允许使用此语句触发器。

最后,dbms_output在触发器中并不是非常有用,因为没有终端可以显示输出。通常,您会引发异常。