1

私はテーブルを持っています:チームとマッチ。

「Teams」にはサッカー チームに関する情報が保存されており、私が特に興味を持っているのは Country フィールドです。

「Matches」には、「Teams」にリストされているチーム間で行われるサッカーの試合に関する情報が保存されます。このテーブルから私が興味を持っているフィールドは、コンペティション フィールドです。競技の種類に応じて、「全イングランド」または「全スペイン」など、参加するチームは適切な国の出身である必要があります。

私は現在、これを処理するための制約トリガーを作成しようとしていますが、コンパイルが正常に実行されていても、実行時に 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. matchesの代わりにテーブルにアクセスしています: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 に答える