2013-10-18 49 views
1

我有表:團隊和匹配。Oracle PL/SQL約束觸發器

'團隊'存儲足球隊的信息,我特別感興趣的是國家/地區領域。

'Matches'存儲關於'Team'中列出的球隊之間發生的足球比賽的信息。我從這張表中感興趣的領域是比賽場地。根據比賽類型:「全英格蘭」或「全西班牙」等,所涉及的團隊應來自適當的國家。

我目前正在嘗試編寫一個約束觸發器來處理這個問題,但是在運行時即使編譯好的時候,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') 
); 
+0

在Oracle中,你使用'和'運營商,而不是''&&,所以你應該在你的代碼進行更改。另外,爲什麼你從'matches'表中選擇了'MatchID'等於新記錄ID的比賽?您應該使用':new.competition'來檢查新記錄的值。 –

+0

複合鍵外鍵可以讓你用聲明方式解決你的問題。 –

+0

嗯謝謝你的評論。我已經提出了你建議的修正,Przemyslaw。 但是,我仍然收到相同的錯誤。 – ScoopsaHaagenDazs

回答

1

你有3個錯誤:

  1. &&代替AND
  2. 訪問matches表而不是:new.competition
  3. Double 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; 
+1

我有很多東西需要學習。約束現在按預期工作。我需要重新組織我的牌桌,但這有助於給我一個模板來解決問題。再次感謝。 – ScoopsaHaagenDazs