如果超出现有数量,则触发以阻止订单更新

Posted

技术标签:

【中文标题】如果超出现有数量,则触发以阻止订单更新【英文标题】:Trigger to prevent an Order update if the exceeds Quantity On Hand 【发布时间】:2018-09-26 01:20:34 【问题描述】:

需要在 Oracle 中创建一个触发器,如果​​数量超过 Items 表 Quantity on Hand 中的现有数量,将阻止 Order 条目进入 ItemsOrder 表。

这是我目前所拥有的:

create or replace
TRIGGER check_qty
AFTER UPDATE on OrderItems
FOR EACH ROW
BEGIN
  IF(SELECT
      OrderItems.quantity, Items.quantityOnHand FROM Items
      INNER JOIN OrderItems On Items.itemID = OrderItems.itemID
      WHERE Items.quantityOnHand < OrderItems.quantity);
      raise_application_error(-20999,'The quantity amount is greater than the unite available');
  ELSE
    dbms_output.put_line('Success');
  END IF;
END

得到以下错误:

错误(2,6):PLS-00103:在预期以下情况之一时遇到符号“SELECT”:(-+ case mod new not null continue avg count current exists max min prior sql stddev sum variance execute forall merge时间 时间戳 间隔 日期 管道

错误(4,13):PLS-00103:在预期以下之一时遇到符号“JOIN”:, ;对于有相交负序的组开始并集,其中连接

【问题讨论】:

【参考方案1】:

我会这样想:

create or replace trigger check_qty before update on OrderItems
for each row as
    v_quantity number;
BEGIN
    select i.quantityOnHand into v_quantity
    from items i
    where i.itemId = :new.itemId;

    if (v_quantity < :new.quantity) then
      raise_application_error(-20999, 'The quantity amount is greater than the unite available');
    end if;
end;

【讨论】:

以上是关于如果超出现有数量,则触发以阻止订单更新的主要内容,如果未能解决你的问题,请参考以下文章

Oracle 触发器检查一个表中的课程持续时间,如果课程是特定日期,则阻止更新

订单并发处理--悲观锁和乐观锁任务队列

mysql---触发器

MySQL触发器 trigger之after与before区分

NetSuite,如果分配了潜在客户与客户,则阻止引用销售订单(通过销售订单按钮)

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