甲骨文触发器:条件语句



我在一个表格中有一个产品列表,我想创建一个触发器来读取特定产品的现有库存,然后在库存小于 5 时显示一条消息。 这个概念很简单。

这是我到目前为止所拥有的。

SET SERVEROUTPUT ON
SET ECHO ON
CREATE OR REPLACE TRIGGER TRG_REORDERSTOCK
AFTER INSERT OR UPDATE OF S_QUANTITY ON STOCK_INVENTORY
FOR EACH ROW
BEGIN
IF :OLD.S_QUANTITY <= 10 THEN
     DBMS_OUTPUT.PUT_LINE ('Warning: ----- product with ID ('  || :OLD.BR_ID || ') has (' || :NEW.S_QUANTITY || ') units remaining, please re-order -----' );
    ELSE
        DBMS_OUTPUT.PUT_LINE ('UPDATE COMPLETE');
    END IF;
END;
/

现在为了测试触发器,我将更新特定产品的手头数量;

UPDATE STOCK_INVENTORY
SET S_QUANTITY = 4
WHERE BR_ID = 1
AND P_ID = 6;

结果是:

Warning: ----- product with ID (1) has (4) units remaining, please re-order -----

这意味着触发器有效。但是,stock_inventory有一些库存水平低于 10 的产品,但有条件的我有,它只显示当前交易的消息。

以下是stock_inventory中一些产品的列表,这是一个链接器表;

SQL>从STOCK_INVENTORY中选择*;

     BR_ID|      P_ID|S_QUANTITY
----------|----------|----------
         1|         1|        10
         1|         6|         4
         1|         3|        30
         1|         8|        24
         1|         9|        18
         2|        10|         9
         2|         2|        10
         2|        20|        15
         2|        16|        17
         2|        13|        20
         3|        21|        15

如何显示数量少于 10 的产品列表?我对甲骨文很陌生。多谢。

谢谢

首先,为什么要为这种事情使用触发器? 为什么您希望触发器列出需要重新排序的产品,而不是当前事务正在影响的产品? 由于绝对不能保证任何人都会看到任何写给DBMS_OUTPUT的东西,因为提醒下产品 1 订单的人重新订购产品 6 似乎违反直觉,并且由于您通常希望将库存更新与库存订购分开,整个方法似乎没有意义。

假设这是一个家庭作业,但是您可以使用语句级触发器代替

CREATE OR REPLACE TRIGGER trg_new_reorder_stock
  AFTER INSERT OR UPDATE ON stock_inventory
BEGIN
  FOR x IN (SELECT *
              FROM stock_inventory
             WHERE s_quantity <= 10)
  LOOP
    dbms_output.put_line( 'Reorder ' || x.p_id || ' it has only ' || x.s_quantity || ' units remaining.' );
  END LOOP;
END;

由于这涉及语句级触发器,因此您可以查询stock_inventory表,而不必担心出现变异表异常。 但是,这也意味着每次插入单行时都会对整个表执行可能代价高昂的查询,这是低效的。

最新更新