我在一个表格中有一个产品列表,我想创建一个触发器来读取特定产品的现有库存,然后在库存小于 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
表,而不必担心出现变异表异常。 但是,这也意味着每次插入单行时都会对整个表执行可能代价高昂的查询,这是低效的。