0

我在表格中有一个产品列表,我想创建一个触发器来读取特定产品的库存,然后如果库存少于 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> SELECT * FROM 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 的产品列表?我对甲骨文很陌生。非常感谢。

谢谢

4

1 回答 1

2

首先,你为什么要为这种事情使用触发器?为什么您希望触发器列出除了当前交易影响的产品之外需要重新订购的产品?由于绝对不能保证任何人都会看到写入的任何内容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表而不必担心会出现变异表异常。但是,这也意味着每次插入单行时,您都在对整个表执行潜在的昂贵查询,这是低效的。

于 2012-11-19T17:07:16.793 回答