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

まず、なぜこの種のトリガーを使用したいのですか? また、現在のトランザクションが影響している製品以外に、再注文が必要な製品をリストするトリガーが必要なのはなぜですか? 製品 1 を注文した人に製品 6 を再注文するように警告するのは直観に反するように思われますDBMS_OUTPUT。また、通常、在庫の更新と在庫の注文を分けたいため、 、アプローチ全体が意味をなさないようです。

これは宿題であると仮定しますが、代わりにステートメントレベルのトリガーを使用できます

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 に答える