2016-04-12 7 views
0

私は在庫の在庫を更新するためのトリガーを作成したいと思います。顧客の注文した在庫数量と数量は、2つの異なるテーブルに表示されます。私は両方にどのように参加しますか?テーブル参加のトリガー

CREATE OR REPLACE 
TRIGGER UPDATE_QUANTITY_TRIGGER 
AFTER insert ON SALE_ORDER 
FOR EACH ROW 
BEGIN 
update product values 
    (:old.product_id, 
    :old.product_name, 
    :old.description, 
    quantity_on_stock-s.quantity, 
    :old.minimal_quantity, 
    :old.unit_price, 
    :old.product_type_id); 
    from product, sale_order s 
    where product.product_id=s.product_id; 
END; 

OR

CREATE OR REPLACE 
TRIGGER UPDATE_QUANTITY_TRIGGER 
AFTER insert ON SALE_ORDER 
FOR EACH ROW 
BEGIN 
update product set 
p.quantity_on_stock= p.quantity_on_stock-s.quantity; 
    from product p , sale_order s 
    where p.product_id=s.product_id; 
END; 

sale_order表には、列sale_noquantity、およびproduct_idを持っています。

+0

この更新構文は、Oracle、トリガーまたはプレーンSQLでは無効です。 (サブクエリなしで)更新ステートメントに参加することはできません。 ':old'と':new'疑似コードの行の値をすでに持っているとき、なぜあなたは 'sale_order'に参加することを望みませんか?同時トランザクションが衝突する可能性があるため、このようなバランスを維持しようとすることは、マルチユーザ環境では実際には機能しません。 –

+0

私はちょうどプロダクトをアップデートしたいと思う、使用しないで回避するべきである:old? –

答えて

1

更新ステートメントに参加することはできません。あなたの2回目の試行は近いが、依然として参加しており、相関はない。また、セミコロンの迷いもあります。

CREATE OR REPLACE 
TRIGGER UPDATE_QUANTITY_TRIGGER 
AFTER insert ON SALE_ORDER 
FOR EACH ROW 
BEGIN 
update product p set 
    p.quantity_on_stock = p.quantity_on_stock - :new.quantity 
    where p.product_id = :new.product_id; 
END; 

これは、更新する製品レコードを特定し、によって在庫レベルを減少する量を得るために、両方に:new pseudorecordからの値を使用しています:私はあなたのような何かを探していると思います。とにかく許可されていないトリガーテーブルに再び参加する必要はありません。

マルチユーザー環境でこの種の更新を行うと予期しない動作や結果が出る可能性があります。

関連する問題