创建触发器以重新排序列并修改语句级别

Posted

技术标签:

【中文标题】创建触发器以重新排序列并修改语句级别【英文标题】:Create Trigger to reorder a column and modify statement levels 【发布时间】:2015-11-09 00:17:39 【问题描述】:

我需要更改 Product 表以具有 varchar2(3) 重新订购列,并修改注释中的语句级别触发器以将产品重新订购字段设置为“是”,如果手头数量小于产品最小值的两倍数量或现有数量少于 10 个。否则,该值应为“否”。在插入或更新 p_min 或 p_qoh 后触发触发器。通过事先检查数据、进行更改、然后检查来进行调试。

为此我有

CREATE or REPLACE TRIGGER 
  TRG_Product_Reorder
  AFTER INSERT OR UPDATE of P_min, P_qoh ON lab9_Product
BEGIN
  UPDATE lab9_Product SET REORDER = 'yes'
   WHERE P_qoh < P_min*2 or p_qoh < 10;

  UPDATE lab9_Product SET REORDER = 'no'
   WHERE P_qoh >= p_min*2;
END;
/

我得到错误:

SQL statement ignored
"REORDER": invalid identifier

【问题讨论】:

“REORDER”是您要更新的列的名称吗?如果是,它是否存在于“lab9_Product”表中? 您不能在表中创建触发器来自我更新!您可以做的是更改当前更新或插入行的列的值!认为 IF 允许您以无限循环结束它,因为新的更新会再次调用触发器! 您执行的将REORDER 列添加到LAB9_PRODUCT 表的语句是什么样的? 嗯好吧,你是对的,我之前确实忘记将 REORDER 添加为列。语句添加 REORDER = ALTER TABLE Lab9_Product ADD REORDER varchar2(3) default 'No' 【参考方案1】:

我认为您可能需要 before 触发器而不是 after 触发器。应该是这样的:

CREATE or REPLACE TRIGGER 
TRG_Product_Reorder
BEFORE INSERT OR UPDATE of P_min, P_qoh ON 
lab9_Product
BEGIN
    IF :OLD.P_qoh < :OLD.P_min*2 AND :OLD.p_qoh < 10 THEN
       :NEW.REORDER := 'yes';
    ELSE  :NEW.REORDER := 'no';
    END IF;
END;

【讨论】:

以上是关于创建触发器以重新排序列并修改语句级别的主要内容,如果未能解决你的问题,请参考以下文章

数据库中有触发器,将备份后数据库恢复后看不到触发器,重新用脚本创建触发器,该数据库中已存在改对象?

如何创建触发器以检查更新的字段值

触发器(Trigger)

sql插入的操作

怎么用SQL语句创建视图

MySQL触发器触发器的使用创建修改及删除