首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >无法正确创建触发器

无法正确创建触发器
EN

Stack Overflow用户
提问于 2019-12-17 07:36:50
回答 1查看 65关注 0票数 0

甲骨文顶点,PL_Sql。这是我的触发器:

代码语言:javascript
复制
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。我想这是因为糟糕的语法

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-12-17 08:28:18

我不知道编译时的错误可能是什么-它对我来说编译得很好。但是在运行时,你可能会得到一个‘`ORA 04091表马匹正在变异,触发器看不到它’错误。你不能从在马表上定义的行触发器中的马匹中获取。

您需要做的是将其更改为AFTER语句触发器,方法是在触发器定义中保留FOR EACH ROW,并将触发点从BEFORE更改为AFTER。问题是,在语句触发器中,您不能访问:NEW:OLD数据,但您并不真正需要它。对于执行的每条语句,只调用一次语句触发器。所以你的触发器应该看起来像这样:

代码语言:javascript
复制
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;

你真的不关心哪个骑师被分配了太多的马,只关心有一个骑师被安排在不止一匹马上。

db<>fiddle here

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59365708

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档