2017-11-04 7 views
1

シンプルなトリガーを作成しましたが、いくつか問題があります。トリガーの実行中にデータが見つかりません。

CREATE OR REPLACE TRIGGER trigger_nb_ing 
BEFORE INSERT ON RECETTE_INGREDIENT 
FOR EACH ROW 
DECLARE 
    cpt INT:=0; 
BEGIN 
    SELECT COUNT(idIngredient) INTO cpt 
    FROM RECETTE_INGREDIENT 
    WHERE idRecette=:new.idRecette 
    GROUP BY idRecette; 

    IF (cpt>=20) 
    THEN RAISE_APPLICATION_ERROR(-20010, 'Trop d''ingrédients dans la recette'); 
    END IF; 
END; 
/

ワーキング彼らは20の成分であるとき、私は1つの挿入を行う際に、しかし、ORA-04088と:トリガーも

の実行中にエラーが、私は私のデータを挿入するとき、私はトリガーをしようとしています、 'Recette_ingredient' 内の行ごと

ORA-01403: no data found 
ORA-06512: at "gg.TRIGGER_NB_ING", line 4 
ORA-04088: error during execution of trigger 'gg.TRIGGER_NB_ING'' 

:私はまた、メッセージを持っています。

あなたは

+0

NO_DATA_FOUND問題を解決するために 'GROUP BY idRecette'節を削除してください。私はORA-04088がこのトリガーによって引き起こされたのではないかと疑いますが、この表には挿入や更新を行っている別のトリガーがあります。 – krokodilko

+0

質問を編集し、エラーメッセージの全文を入力してください。 ORA-04088以外のメッセージはありますか?ありがとう。 –

+0

私は 'Group By'を削除しましたが、今は挿入に問題があります。ありがとうございます。しかし、トリガーがトリガーされたときに私は常にメッセージORA-04088を持っています。 – BaaLa

答えて

0

ノーデータエラーの近位の節がGROUP BYですありがとうございます。 GROUP BYがある場合、Oracleはグループごとに1つの行を戻します。グループがない場合、行はありません。無GROUP BYとは対照的に

は、Oracleはいつも、1行を返します。

SELECT COUNT(idIngredient) INTO cpt 
FROM RECETTE_INGREDIENT 
WHERE idRecette = :new.idRecette; 

しかし、それはあなたの他の問題を解決することはできません。あなたは変更されているテーブルを照会しています。これは通常、問題を引き起こします。 RECETTESテーブルに成分の数を保存することをお勧めします。番号が20未満であることを確認して更新するか、エラーを返します。次のように

0

OKは、あなたのトリガーを書き換える:

CREATE OR REPLACE TRIGGER trigger_nb_ing 
    BEFORE INSERT ON RECETTE_INGREDIENT 
    FOR EACH ROW 
DECLARE 
    cpt INT := 0; 
BEGIN 
    SELECT COUNT(idIngredient) 
    INTO cpt 
    FROM RECETTE_INGREDIENT 
    WHERE idRecette = :new.idRecette; 

    IF cpt >= 20 THEN 
    RAISE_APPLICATION_ERROR(-20010, 'Trop d''ingrédients dans la recette'); 
    END IF; 
EXCEPTION 
    WHEN NO_DATA_FOUND THEN 
    NULL; 
END; 

私は、これは「変異表」エラーをスローしませんやや驚いています。

幸運のベスト。

関連する問題