我创建了一个简单的触发器,但是我遇到了一些问题。
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种成分进行一次插入时工作,但使用ORA-04088:执行触发时出错
另外,当我在插入数据时尝试触发时,我还有消息:
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''
为'Recette_ingredient'中的每一行。
谢谢
答案 0 :(得分:0)
无数据错误的近端子句是GROUP BY
。当您拥有GROUP BY
时,Oracle会为每个组返回一行。如果没有组,则没有行。
相比之下,如果没有GROUP BY
,Oracle总会返回一行,所以:
SELECT COUNT(idIngredient) INTO cpt
FROM RECETTE_INGREDIENT
WHERE idRecette = :new.idRecette;
然而,这不会解决您的其他问题。您正在查询正在修改的表。这通常会导致问题。我建议你在RECETTES
表中保留成分的数量。检查数字是否小于20并更新它 - 或返回错误。
答案 1 :(得分:0)
好的,按如下方式重写你的触发器:
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;
我有点惊讶这不会引发“变异表”错误。
祝你好运。