2017-11-29 8 views
0

SALESORDERDETAILに挿入される各行の小計を計算するためのトリガーを作成したいとします。小計は数量*価格です。誰かがこれについてどうやって行くのか理解してもらえますか?pl SQLトリガー合計

私は必要な情報がすべてSALESORDERDETAILにあると考えています。前にシーケンスと組み合わせてトリガーを使用しましたが、トリガーを使用していません。毎回手続きと実行が必要ですか?どのようにそれらを書くのですか?私は最後の日にこれに固執してきたので、どんな助けもありがたいです。ありがとうございました!

drop table SALESORDERDETAIL; 

create table SALESORDERDETAIL (
SONo CHAR(9), -- sales order number 
ItemID char(8), -- item being ordered (finished goods) 
SOquantity number(5), -- quantity of the item being ordered 
Price Number(10,2), -- unit price of each item 
subtotal Number(10,2), -- sales order detail (line) subtotal 
constraint SOD_pk primary key(SONo,ItemID), 
constraint SOD_FG_FK foreign key(ItemID) references FinishedGoods(itemid), 
constraint SOD_SO_FK foreign key(SONo) references SalesOrders(SONo) 
); 

Insert into SALESORDERDETAIL (SONO,ITEMID,SOQUANTITY,PRICE,SUBTOTAL) values 
('SO1000001','FG000001',100,10,''); 
Insert into SALESORDERDETAIL (SONO,ITEMID,SOQUANTITY,PRICE,SUBTOTAL) values 
('SO1000001','FG000002',50,2,''); 

commit; 
+0

あなたの質問には関係ありませんが、何にも 'char'を使用しないことをお勧めします。文字列は長さ制限を超えていなければ 'varchar2'であり、' clob'である必要があります。 –

+0

ありがとうございます。知っておいてよかった!テーブルは、私が把握しようとしている講義の一部として事前に作成されています。 –

+0

'char'vs' varchar2':https://stackoverflow.com/a/42165653/230471 –

答えて

1

これはOracleと仮定しますか?その場合は、代わりにトリガの仮想列考える:

 

... 
subtotal  AS (soquantity * price), 
... 

を...しかし、あなたはまだトリガーをしたい場合、それはやや次のようになります。

CREATE OR REPLACE TRIGGER SALESORDERDETAIL_before 
BEFORE INSERT OR UPDATE 
ON SALESORDERDETAIL 
FOR EACH ROW 
BEGIN 
:new.subtotal := :new.soquantity * :new.price; 
END; 
/

私はのファンではありませんそれほどエレガントなソリューションではありませんが、それは教育のためのものであり、問​​題解決のためのものではありません。

+0

ありがとうございますが、この状況でトリガを利用したいと考えています。 –

+0

私はこれを持っていて、私が間違っていると思っていました。なぜなら、selectを実行するとnull値が下がってきたからです。 * from salesorderdetail; これ以外のテスト方法を教えてください。 –

+0

データを挿入する前にトリガーを作成しましたが、正しいですか?それは遡及的ではありません。 –

関連する問題