私はテーブルを持っています:チームとマッチ。
「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')
);