この混乱しやすい質問、壁面、ひどいトリガーについては、事前にお詫びします。私は小売店の小規模なデータベースを設計しており、店内で注文を受け取り、オンサイトの倉庫/在庫室から製品を配送します。オラクル製品からの在庫数量を削除し、オーダーラインに追加する
今度は、注文エンティティはorder_lineエンティティと1対多の関係にあり、商品との関係が多岐にわたります(在庫自体に保存されます)。 order_lineエンティティはリンクエンティティであり、多対多の関係を解決するので、それはすべて良いことです。明確にするために、それは製品ごとに1つの注文ラインです。
私がしたいのは、order_line(数量属性を持つ)が作成されたときに、適切な商品に十分な在庫があることを最初に確認するようにしたい場合です(数量が3の場合、在庫は少なくとも3でなければなりません)それ以外の場合は、エラーをスローする必要があります。
成功した場合は、それに応じて数量と在庫属性を更新したいと思います。 order_lineに小計の値を追加することもできます(私はこれをまだ試していません)。次にorderエンティティの合計値を計算するために使用できます。
だから私はこれとかなり混乱しているので、私は少しガイダンスを探しています。
CREATE OR REPLACE TRIGGER check_order_line
BEFORE INSERT OR UPDATE ON order_line
for each row
BEGIN
select order_line.quantity, products.stock from order_lines right join products on order_line.product_no=products.product_no;
if(order_line.quantity>products.stock) then
RAISE_APPLICATION_ERROR(-20103, 'Insufficient Stock');
ELSE
products.stock := products.stock - quantity;
dbms_output.put('Successful');
END IF;
END;
.
run
エラー私は取得しています:私が試した何
2/1 PL/SQL: SQL Statement ignored
2/49 PL/SQL: ORA-00942: table or view does not exist
3/1 PL/SQL: Statement ignored
3/15 PLS-00357: Table,View Or Sequence reference 'ORDER_LINE.QUANTITY'
not allowed in this context
:
- 私は最初の2つのエラーについてはよく分かりません。問題のテーブルは となっていますが、明らかにorder_lineと呼ばれています。
- また、最後のエラーを解決するためにproducts.stockとorder_line 数量の変数を宣言しようとしました。これはIIRCをコンパイルしますが、 は実際にはテーブルを更新していないと思われます。
- 私は他のアクションについてあまり心配していません、私はおそらく、 テーブルのステートメントを更新する必要がありますが、今のところ私はちょうど トリガー条件を取得することに焦点を当てています。
いずれかが右の の方向を指すことができ、何か面白いエラーを指摘したら、私はそれを感謝します。
ありがとうございます。このトリガーの怪物で目を傷つけることをお詫びします。
を提案
CHECK
制約を必要とする理由です最後に 'run'コマンドいることは何ですか?どのツールでCREATE TRIGGERを実行していますか? –