甲骨文顶点,PL_Sql。这是我的触发器:
CREATE OR REPLACE TRIGGER NoMoreThanOneHorse
BEFORE INSERT OR UPDATE OF Jockey_ID
ON Horses
FOR EACH ROW
DECLARE
NumOfHorsesForJockey NUMBER(4);
BEGIN
SELECT COUNT(*) INTO NumOfHorsesForJockey FROM Horses
WHERE Jockey_ID = :NEW.Jockey_ID AND Horse_ID <> :NEW.Horse_ID;
IF NumOfHorsesForJockey > 0
THEN RAISE_APPLICATION_ERROR (-20445, 'Нельзя закрепить за лошадью уже занятого жокея!');
END IF;
END NoMoreThanOneHorse;但每次我尝试创建它时,都会出现这样的错误:ORA-24344:成功,出现编译错误ORA-06512。我想这是因为糟糕的语法
发布于 2019-12-17 08:28:18
我不知道编译时的错误可能是什么-它对我来说编译得很好。但是在运行时,你可能会得到一个‘`ORA 04091表马匹正在变异,触发器看不到它’错误。你不能从在马表上定义的行触发器中的马匹中获取。
您需要做的是将其更改为AFTER语句触发器,方法是在触发器定义中保留FOR EACH ROW,并将触发点从BEFORE更改为AFTER。问题是,在语句触发器中,您不能访问:NEW或:OLD数据,但您并不真正需要它。对于执行的每条语句,只调用一次语句触发器。所以你的触发器应该看起来像这样:
CREATE OR REPLACE TRIGGER NoMoreThanOneHorse
AFTER INSERT OR UPDATE OF Jockey_ID
ON Horses
DECLARE
nMaxHorses NUMBER;
BEGIN
SELECT MAX(HORSE_COUNT)
INTO nMaxHorses
FROM (SELECT JOCKEY_ID, COUNT(*) AS HORSE_COUNT
FROM Horses
GROUP BY Jockey_ID);
IF nMaxHorses > 1 THEN
RAISE_APPLICATION_ERROR (-20445, 'Нельзя закрепить за лошадью уже занятого жокея!');
END IF;
END NoMoreThanOneHorse;你真的不关心哪个骑师被分配了太多的马,只关心有一个骑师被安排在不止一匹马上。
https://stackoverflow.com/questions/59365708
复制相似问题