2016-12-06 9 views
1

ブックの最低価格を引き出し、新しい価格が最小値の5倍の場合にトリガーされるトリガーを作成したいとします。私は私のSELECTステートメントでエラーが発生します。私はトリガーが発射された同じテーブルから選択しているからだと思います。同じテーブルのSELECTを使用してトリガーする

CREATE OR REPLACE TRIGGER check 
BEFORE INSERT OR UPDATE ON book_type 
FOR EACH ROW 

DECLARE 
newPrice number; 
lowestPrice number; 
topPrice number; 

BEGIN 
newPrice := NEW.price; 
lowestPrice := (SELECT MIN(price) FROM book_type); 
topPrice := (5 * lowestPrice); 

IF (topPrice < newPrice) THEN 
    dbms_output.put_line('Error. Price too high.'); 
END IF; 
END; 
/
+1

エラーは何ですか? – LordBaconPants

+0

これは宿題ですか?一般に、トリガーはこの種の問題を解決する最も適切な方法ではありません。トリガーが必要な宿題であれば、複合トリガーについて学んだことがありますか?単一の非複合トリガが必要な場合は、複数のトリガ(または複合トリガ)よりも効率的ではないが、はるかに複雑ではない文レベルのトリガが必要になります。 –

+0

エラー:次のいずれかを予期しているときにシンボル "select"が検出されました:(+; – Nik

答えて

1

まず、値を割り当てることはできません。あなたは、トリガーが定義されているのと同じテーブルから選択をしようとしているので、しかし、あなたが表示されます、次の問題は、変異表エラー(ORA-4091)である

select min(price) into lowestPrice from book_type; 

:あなたのようなものが必要だろう。つまり、トリガーはbook_typeテーブルで定義されており、トリガーでbook_typeテーブルから選択しようとしています。オラクルでは、文のトリガーでこれを許可しません。

最後に、出力を表示する端末がないため、dbms_outputはトリガーではあまり役に立ちません。通常、代わりに例外を発生させます。

+0

私は変更を加え、提案したように例外を発生させましたが、私はMutating Table Errorを取得しません。私のトリガーは完全に今働いています。トリガーテストが合格するまで(?) – Nik

関連する問題