执行触发期间未找到数据和错误

时间:2017-11-04 20:24:02

标签: sql oracle plsql

我创建了一个简单的触发器,但是我遇到了一些问题。

    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'中的每一行。

谢谢

2 个答案:

答案 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;

我有点惊讶这不会引发“变异表”错误。

祝你好运。