在pl / sql中插入触发器

时间:2015-07-10 14:41:34

标签: sql oracle plsql

我无法在pl / sql中找到以下问题的正确结构: 需要在“产品表”上触发,在插入新产品之前检查价格,产品价格不得超过4000美元。

CREATE or REPLACE TRIGGER pro 
BEFORE UPDATE OF price 
ON products
FOR EACH ROW 
declare 
pr products.price%type;
BEGIN 
if pr < 4000 then 
INSERT INTO products VALUES (:old.product_ID,:old.price);
end if; 
END;

请帮忙

3 个答案:

答案 0 :(得分:3)

使用check constraint代替触发器:

create table products (price number);

ALTER TABLE PRODUCTS ADD CONSTRAINT check_price CHECK (price < 4000);

测试:

insert into products values (5000)  => ERROR

编辑:如果您坚持使用触发器版本:

CREATE or REPLACE TRIGGER pro BEFORE insert or UPDATE OF price ON products 
FOR EACH ROW 
BEGIN 
if :new.price > 4000 then 
  raise_application_error(-20101, 'Price exceeds 4000.');
end if; 
END;

答案 1 :(得分:1)

您为此而不是检查约束而烦恼的唯一原因是控制错误消息。请记住,触发器假定操作正在发生,因此要停止操作,您的工具将引发异常。

CREATE OR REPLACE TRIGGER pro 
BEFORE INSERT OR UPDATE
ON products
FOR EACH ROW 
BEGIN 
if :new.price > 4000 then 
     RAISE_APPLICATION_ERROR(-20001,'Price exceeds maximum permitted value') ;
end if; 
END;

答案 2 :(得分:1)

如果您不想提出错误并按照我的意愿保留旧值,请使用以下代码:

CREATE or REPLACE TRIGGER pro 
      BEFORE UPDATE OF price 
      ON products
      FOR EACH ROW 
declare 
   pr products.price%type;
BEGIN 
  if :new.price > 4000 then 
     :new.price := :old.price;
     :new.product_ID := :old.product_ID;
  end if; 
END;