我有两张桌子:
合同(球员,球队)
比赛(球员,球队,比赛)
团队是从0到9的NUMBER(1)。
MATCHES中的属性团队必须与合同中的此玩家相同或少于或少于1。 (在比赛中,同一个玩家可能会出现不止一次)。
如果MATCHES中的所有玩家都符合我之前说过的条件,我必须用触发器检查
我试过了,但没找到:
CREATE TRIGGER trigA
BEFORE INSERT OR UPDATE OF team on matches
FOR EACH ROW
DECLARE error EXCEPTION;
BEGIN
IF (:NEW.team!=contracts.team OR :NEW.team!=contracts.team +1 OR :NEW.team!=contracts.team -1) AND (:NEW.player) = contracts.player
THEN error;
END IF;
EXCEPTION
WHEN error THEN DBMS_OUTPUT.PUT_LINE('Invalid Team');
END;
/
答案 0 :(得分:0)
在触发器中,您需要查询触发器中的CONTRACTS表,查找满足您所获得条件的CONTRACTS行。如果你发现至少一件事情都没问题。如果你不需要提出错误。
这样的事情:
CREATE TRIGGER MATCHES_BIU_TEAM
BEFORE INSERT OR UPDATE OF team on matches
FOR EACH ROW
DECLARE
nContract_count NUMBER;
BEGIN
SELECT COUNT(*)
INTO nContract_count
FROM CONTRACTS c
WHERE c.PLAYER = :NEW.PLAYER AND
c.TEAM BETWEEN :NEW.TEAM - 1
AND :NEW.TEAM + 1;
IF nContract_count = 0 THEN
RAISE_APPLICATION_ERROR(...);
END IF;
END MATCHES_BIU_TEAM;
查看如何使用RAISE_APPLICATION_ERROR
引发调用程序可以捕获的异常。这很重要,因为如果发生异常,你不想让它在触发器中的EXCEPTION处理程序中消失 - 需要引发它以便调用应用程序代码可以处理它
祝你好运。
答案 1 :(得分:0)
另一种方法是:
CREATE TRIGGER MATCHES_BIU_TEAM
BEFORE INSERT OR UPDATE OF team on matches
FOR EACH ROW
DECLARE
matchTeam NUMBER;
BEGIN
SELECT c.team
INTO matchTeam
FROM CONTRACTS c
WHERE c.player = :NEW.player;
IF matchTeam < :NEW.team - 1 OR matchTeam > :NEW.team + 1 THEN
RAISE_APPLICATION_ERROR(...);
END IF;
END MATCHES_BIU_TEAM;
这假定a)您要将contracts.team
的值与matches.team
的值进行比较(Bob Jarvis&#39; answer将contracts
中的记录数与matches.team
的值进行比较),b)每个玩家contracts
中只有一条记录。