1

我有表格:团队和比赛。

'Teams' 存储有关足球队的信息,我特别感兴趣的是 Country 字段。

“比赛”存储“球队”中列出的球队之间发生的足球比赛的信息。这张表中我感兴趣的领域是竞争领域。根据比赛类型:“全英”或“全西班牙”等,参赛队伍应来自相应国家。

我目前正在尝试编写一个约束触发器来处理这个问题,但是即使编译正常,SQL Developer 在运行时也会抛出一个非常神秘的错误“无效且重新验证失败”。有人愿意帮忙吗?关于以更好的方式做事的建议也会很棒。下面的 PL/SQL 块,如果下面的代码让你们中的任何人哭泣,我深表歉意。我知道我在这方面很糟糕

CREATE OR REPLACE TRIGGER matchcountry_BIR
BEFORE INSERT ON matches
FOR EACH ROW

DECLARE
invalidEng EXCEPTION;
invalidSpa EXCEPTION;
team1 teams.Country%type;
team2 teams.Country%type;
comp matches.Competition%type;

BEGIN
SELECT Country INTO team1 FROM teams WHERE TeamID = :new.TeamID_A;
SELECT Country INTO team2 FROM teams WHERE TeamID = :new.TeamID_B;
comp:=:new.Competition;

IF (comp='All England') AND (team1!='England' AND team2!='England') THEN
RAISE invalidEng;
END IF;

IF (comp='All Spain') AND (team1!='Spain' AND team2!='Spain') THEN
RAISE invalidSpa;
END IF;

EXCEPTION
WHEN invalidEng THEN
RAISE_APPLICATION_ERROR(-20005, 'Countries are invalid for a English competition.');
END;

EXCEPTION
WHEN invalidSpa THEN
RAISE_APPLICATION_ERROR(-20006, 'Countries are invalid for a Spanish competition.');
END;

如果问题出在表上,我还包括了他们的 Create 语句。同样,非常欢迎对这些提出任何建议或批评。

CREATE TABLE teams
(
  TeamID number(2) PRIMARY KEY,
  TeamName varchar2(50),
  Country varchar2(30),
  CHECK (Country='Spain' OR Country='England')
);

CREATE TABLE matches
(
  MatchID number(2) PRIMARY KEY,
  TeamID_A number(2),
  TeamID_B number(2),
  Goal_A number(2),
  Goal_B number(2),
  Competition varchar2(50),
  CONSTRAINT fk_TeamA FOREIGN KEY(TeamID_A) REFERENCES teams,
  CONSTRAINT fk_TeamB FOREIGN KEY(TeamID_B) REFERENCES teams,
  CHECK (Goal_A >= 0),
  CHECK (Goal_B >= 0),
  CHECK (Competition='Champions League' OR Competition='Europa League' OR Competition='All England' OR Competition='All Spain')
);
4

1 回答 1

1

你犯了3个错误:

  1. &&而不是AND.
  2. 访问matchestable 而不是:new.competition.
  3. EXCEPTION关键字。

试试下面的代码:

-- Trigger will not let an insert on the Match table with invalid countries for the competition
CREATE OR REPLACE TRIGGER matchcountry_BIR
BEFORE INSERT ON matches
FOR EACH ROW

DECLARE
  invalidEng EXCEPTION;
  invalidSpa EXCEPTION;
  team1 teams.Country%type;
  team2 teams.Country%type;
  comp matches.Competition%type;

BEGIN
  SELECT Country INTO team1 FROM teams WHERE TeamID = :new.TeamID_A;
  SELECT Country INTO team2 FROM teams WHERE TeamID = :new.TeamID_B;
  --SELECT Competition INTO comp FROM matches WHERE MatchID = :new.MatchID;
  comp := :new.competition;

  IF (comp='All England') AND (team1!='England' AND team2!='England') THEN
    RAISE invalidEng;
  END IF;

  IF (comp='All Spain') AND (team1!='Spain' AND team2!='Spain') THEN
    RAISE invalidSpa;
  END IF;

EXCEPTION
  WHEN invalidEng THEN
    RAISE_APPLICATION_ERROR(-20005, 'Countries are invalid for a English competition.');

  WHEN invalidSpa THEN
    RAISE_APPLICATION_ERROR(-20006, 'Countries are invalid for a Spanish competition.');
END;
于 2013-10-18T09:09:55.670 回答