【发布时间】:2019-09-08 05:56:09
【问题描述】:
创建一个名为 products_before_update 的触发器,用于检查 Products 表的 discount_percent 列的新值。如果折扣百分比大于 100 或小于 0,则此触发器应引发适当的错误。 如果新的折扣百分比介于 0 和 1 之间,则此触发器应修改新的折扣百分比,将其乘以 100。这样,0.2 的折扣百分比变为 20。 使用适当的 UPDATE 语句测试此触发器。
if 语句不起作用,或者我收到表正在变异的消息,因此触发器看不到它..
connect mgs/mgs;
CREATE or replace TRIGGER products_before_update
BEFORE UPDATE ON Products
FOR EACH ROW IS
BEGIN
IF :NEW.discount_percent > 100 THEN
RAISE_APPLICATION_ERROR(-20001, 'the discount percent cannot be greater than 100.');
ELSEIF :new.discount_percent < 0 THEN
RAISE_APPLICATION_ERROR(-20001, 'the discount percent cannot be less than 0.');
ELSEIF :NEW.discount_percent < 1 THEN
SET :NEW.discount_percent = (:NEW.discount_percent * 100);
END IF;
END;
/
SET SERVEROUTPUT ON;
UPDATE Products
SET discount_percent = .4
WHERE product_id = 3;
我希望收到一条消息,然后一个值超出 [0,100] 或在 (0;1) 中更新值,但触发器在任何情况下都不会做出反应。
【问题讨论】:
-
删除
IS,ELSEIF应该是ELSIF而不是SET <lvalue> = <rvalue>用于赋值,例如在SQL Server 中使用,使用<lvalue> := <rvalue>。 -
顺便说一句,你可以避开触发器。第一个和第二个
IF条件可以转换为check constraint,第三个可能转换为虚拟列..?
标签: oracle plsql oracle12c database-trigger