Oracle触发器:条件语句

时间:2012-11-19 16:59:02

标签: oracle triggers

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

由于

1 个答案:

答案 0 :(得分:2)

首先,您为什么要使用触发器进行此类操作?为什么您希望触发器列出除了当前事务正在影响的产品之外需要重新排序的产品?由于绝对不能保证任何人都会看到任何写入DBMS_OUTPUT的内容,因为提醒某人下订单要对产品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表,而无需担心获得变异表异常。但是,这也意味着每次插入效率低的行时,都会对整个表执行一个可能很昂贵的查询。