我无法在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;
请帮忙
答案 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;