SQL-更新表之前先对表中的行数进行计数

我在Oracle SQL上做一个大学项目,尝试更新表时,不断出现错误“表(...)正在变异,触发器/函数可能看不到它”。我的partialTeams表具有3列(eventName varchar(),teamId号,teamPlace号)。

目的是在事件中更新给定团队的teamPlace时,该位置必须小于或等于同一事件中参与者团队的数量。

我的触发器如下:

Before update on participateTeams
for each row
Declare participants number;
Begin
     select count(*) into participants from participateteams where :New.eventName = participateteams.eventName;

        if(:NEW.teamplace>participants) then
            RAISE_APPLICATION_ERROR(-20250,'O lugar da equipa é inválido');
        end if;
End;
/

根据我的研究,这是因为我正在尝试读取与调用触发器相同的表。 我也尝试将代码的选择部分导出到函数中,但是问题仍然存在。

有小费吗?谢谢。

评论
  • 何弃疗
    何弃疗 回复

    变异表错误只是一个痛苦。而您想要做的是相当棘手的。这是一种方法:

    1. Add a column to teams with the count of participants.
    2. Maintain this column with insert/update, and delete triggers on participateteams.
    3. Write a user-defined function to fetch the count for a given team.
    4. Add a check constraint in participateteams using the user-defined function.