【问题标题】:ORACLE SQL Creating Update TriggerORACLE SQL 创建更新触发器
【发布时间】:2015-03-03 15:56:58
【问题描述】:

大家好,我正在尝试创建一个触发器,当表中的值低于某个值时,它会更新它们。

例如说我有表 Inventory:

Item | Quantity
-----|---------
A    |      400
B    |      160
C    |     1200
D    |      105

我想创建一个触发器,如果​​一个项目的数量应该低于 100,它将添加一个随机值 (100 - 200)。

这是我想出的:

CREATE OR REPLACE TRIGGER QuantityTrigger
AFTER
UPDATE ON INVENTORY FOR EACH ROW
BEGIN
 IF :QUANTITY < 100 THEN
   UPDATE INVENTORY
   SET QUANTITY = QUANTITY + dbms_random.value(100,200);
 END IF;
END;

但是这给了我错误:Error(2,9): PLS-00049: bad bind variable 'QUANTITY'

我做错了什么?任何建议表示赞赏。谢谢!

【问题讨论】:

  • 去掉IF子句QUANTITY前面的:,oracle认为是输入(绑定)变量
  • 尝试 :new.quantity 代替
  • 现在进行更改,它给了我错误:Error(2,9): PLS-00201: identifier 'QUANTITY' must be declared
  • 对不起,试试@Aramillo 刚才说的话
  • Aramillo 的更改使其编译成功。现在来测试一下。

标签: sql oracle triggers


【解决方案1】:

语法错误:将 :QtyOnHand 更改为 :new.QtyOnHand

逻辑错误:不编写后触发器,而是将其更改为前触发器,并且只更新列值而不执行任何 UPDATE。

CREATE OR REPLACE TRIGGER QuantityTrigger
BEFORE
UPDATE ON QITEM FOR EACH ROW
BEGIN
 IF :new.QtyOnHand < 100 THEN
   :new.QtyOnHand := :new.QtyOnHand + dbms_random.value(100,200);
 END IF;
END;
/

但是,我会调查哪个程序在此表中插入小于 100 的值并修复它。使用触发器是一种技巧,您试图通过它来掩盖问题的症状而不是治愈它。

只要您怀疑插入小于 100 的值,只需在插入语句中使用相同的逻辑即可。

【讨论】:

  • 这段代码不起作用,:new.QtyOnHand = :new.QtyOnHand 有一个错误,它说它需要 '('
  • 抱歉已修复。赋值运算符是 := 而不是 =。
【解决方案2】:

我相信您正在寻找的价值在于:

:new.Quantity

【讨论】:

    猜你喜欢
    • 2019-05-03
    • 1970-01-01
    • 1970-01-01
    • 2013-07-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-05
    • 2018-12-02
    相关资源
    最近更新 更多