0

私はしばらくの間、このトリガーを実装しようとしていて、進歩を遂げています (と思います!) が、現在、ミューテーション エラーが発生しています。

ここにあるのは、Customer_Order (合計など)、Order_Line (数量、小計など)、Products (在庫、価格) の 3 つのエンティティ (ここで関連) です。Order_line はリンク エンティティであるため、製品は多数の order_lines に含めることができ、customer_order には多数の order_lines を含めることができますが、order_line は注文で 1 回しか表示できず、1 つの製品しか含めることができません。トリガーの目的は、order_line (または実際には製品の価格) から小計を取得し、order_line から数量を乗算して、新しい order_line の小計を更新することです。

したがって、製品の外部キー、数量 3、価格 4.00 を使用して order_line を挿入すると、トリガーは 2 つを乗算して 12 にし、小計を更新します。ここで、変異エラーを修正するために、Order_line の小計の代わりにここで price を使用するのが正しいと考えています (トリガーステートメントによってアクセスされているテーブルを更新するようトリガーに要求しているために発生しますよね?)。数量の問題を解決できますか? 数量は常に在庫と同じ値になるとは限りません。在庫以下でなければならないので、製品から選択してorder_lineを更新するためにこれを修正する方法を知っている人はいますか? ありがとう。

CREATE OR REPLACE TRIGGER create_subtotal  
BEFORE INSERT OR UPDATE ON Order_Line 
for each row
DECLARE 
currentSubTotal order_line.subtotal%type;
currentQuantity order_line.quantity%type;
BEGIN 
select order_line.subtotal,order_line.quantity
into currentSubTotal,currentQuantity
from order_line
where product_no = :new.product_no;
IF (currentquantity>-1 ) then 

update order_line set subtotal= currentSubTotal * currentQuantity where     line_no=:new.line_no;

END IF;
END; 
. 
run

編集: :new 構文を使用して、トリガーステートメントからの数量値を使用できると思います。これを試してみますが、確認とサポートに感謝します。ありがとうございます。

4

2 に答える 2

1

次のようなものが欲しいようです

CREATE OR REPLACE TRIGGER create_subtotal
  BEFORE INSERT OR UPDATE ON order_line
  FOR EACH ROW
DECLARE
  l_price products.price%type;
BEGIN
  SELECT price
    INTO l_price
    FROM products
   WHERE product_no = :new.product_no;

  IF( :new.quantity > -1 )
  THEN
    :new.subtotal := :new.quantity * l_price;
  END IF;
END;

ただし、これが宿題以外の場合はPRODUCTS、このトリガーでテーブルから価格を引き出すことはあまり意味がありません。おそらく、製品の価格は時間の経過とともに変化します。ただし、特定の注文の価格は、注文時に確定されます。トリガーが でのみ定義されている場合はINSERT、現在の価格を取得するだけで十分でしょう。ただし、行が更新されたときに行の小計を再計算する場合は、注文が行われた時点での価格を取得する必要があります (これは、異なる顧客に異なる価格を同時に請求しないことを前提としています)。時間)。

正規化の観点からは、計算されたフィールドを最初から格納することも意味がない傾向があります。数量と価格をorder_lineテーブルに保存してから、ビューで行の小計を計算する方が理にかなっています (または、11g を使用している場合は、テーブルの仮想列として)。

于 2011-12-07T21:29:54.873 に答える