PL/SQL 触发器和多次更新

Posted

技术标签:

【中文标题】PL/SQL 触发器和多次更新【英文标题】:PL/SQL Trigger and multiple updates 【发布时间】:2014-02-11 19:17:11 【问题描述】:

我编写了一个触发器,它只允许更新产品价格,前提是它至少比成本高出 10%。当我更新一种产品价格时,它似乎正在工作,但是我需要它能够一次更新多个产品。有什么建议么?感谢任何可以提供帮助的人。

create or replace TRIGGER P_check
BEFORE UPDATE ON ProductCat
FOR EACH ROW
BEGIN
IF (:new.ListPrice < :old.TotalCost * 1.1) THEN
 raise_application_error (-20500, :new.ListPrice || ' is too low so the price stays '  ||:old.ListPrice);
 ELSE
 dbms_output.put_line ('Price was updated and the new price is ' || :new.ListPrice);
 END IF;
END;

【问题讨论】:

【参考方案1】:

它应该可以正常工作。您将触发器定义为FOR EACH ROW;因此,将为ProductCat 中更改的每一行调用您的触发器。

分享和享受。

【讨论】:

可悲的是不起作用。当我运行这样的事情时: UPDATE ProductCat SET listPrice = 200;触发器启动应用程序错误(因为 200 对于第一个值来说太小了)。然后,显示 output.put_line 说它更新了各种项目的价格(但它确实没有)。但是,如果我选择一个较大的值,例如 productcatalog1 SET listPrice = 5000;它可以工作,因为应用程序错误永远不会消失。 我的教授暗示我需要使用类似 :new 的东西。 := :老。解决这个问题,但我不明白 您是否提交了更改? 鲍勃,你这是什么意思?当我将其更改为 5000 时,listPrice 的值会发生变化。 当您引发异常时,会隐含回滚;因此,没有变化。所以 - 你需要想出一种方法,使用你的教授的建议,在不引发异常的情况下恢复更改。考虑一下。分享和享受。

以上是关于PL/SQL 触发器和多次更新的主要内容,如果未能解决你的问题,请参考以下文章

PL/SQL 触发器更新或删除

如何创建在 PL/SQL 中更新后触发的触发器

使用 PL/SQL 在触发器中中止插入/更新操作

PL/SQL 中的触发器

PL/SQL ORACLE:删除时触发更新

语句触发器 PL/SQL