2014-03-30 64 views
0

我有以下表格。Oracle觸發器錯誤 - 無效的

create table player (
    player_id int, 
    firstname varchar(32), 
    lastname varchar(32), 
    birthdate date, 
    country varchar(3), 
    constraint pk_player primary key (player_id) 
); 

create table team (
    team_id int, 
    name varchar(32), 
    city_id int, 
    manager_id int, 
    coach_id int, 
    constraint pk_team primary key (team_id), 
    constraint fk_team_city foreign key (city_id) 
     references city (city_id), 
    constraint fk_team_manager foreign key (manager_id) 
     references manager (manager_id), 
    constraint fk_team_coach foreign key (coach_id) 
     references coach (coach_id) 
); 

create table play_in_team (
    player_id int, 
    team_id int, 
    from_date date, 
    to_date date, 
    position varchar(5), 
    squad_number int, 
    is_captain char(1), 
    constraint pk_play_in_team primary key (player_id, team_id, from_date), 
    constraint fk_play_player foreign key (player_id) 
     references player (player_id), 
    constraint fk_play_team foreign key (team_id) 
     references team (team_id) 
); 

create table violations (
    team_id int, 
    violation_text varchar(200), 
    constraint fk_vio_team foreign key (team_id) 
     references team (team_id) 
); 

我已經被分配了以下問題。

創建一個觸發器,每當 團隊在任何時間點上有多個隊長時都會插入違規消息。違反 消息應該包括那句「侵犯 - 多長」,並 隊長的名字。您可以在每個 違反郵件中插入對隊長的名字。

當我試圖編譯我的觸發器時,我總是收到語法錯誤,並希望有人可以指出我在正確的方向。現在,我的觸發器被定義爲...

CREATE OR REPLACE TRIGGER one_captain_check 
    AFTER INSERT OR UPDATE OF player_id, team_id, from_date, to_date, is_captain ON play_in_team 
    FOR EACH ROW 
     WHEN(new.is_captain = '1') 
    BEGIN 
     MERGE INTO violations 
     USING (
      SELECT 
       play_in_team.team_id, 
       ('VIOLATION - Multiple Captains - ' || existing_captain.firstname || ' ' || existing_captain.lastname || ', ' || new_captain.firstname || ' ' || new_captain.lastname) "violation_text" 
      FROM play_in_team 
      JOIN player existing_captain 
       ON existing_captain.player_id = play_in_team.player_id 
      JOIN player new_captain 
       ON new_captain.player_id = :new.player_id 
      WHERE 
       play_in_team.team_id = :new.team_id AND 
       play_in_team.player_id != :new.player_id AND 
       play_in_team.is_captain = '1' AND 
       -- overlapping date ranges from http://tonyandrews.blogspot.com/2010/06/sql-overlap-test.html 
       NVL(:new.to_date, from_date) >= from_date AND 
       :new.from_date <= NVL(to_date, :new.from_date) 
     ) new_violations 
     ON (violations.team_id = new_violations.team_id AND violations.violation_text = new_violations.violation_text) 
     WHEN NOT MATCHED THEN 
      INSERT VALUES(new_violations.team_id, new_violations.violation_text); 
    END; 
/

當我嘗試運行它時,在sqlplus中出現以下錯誤。

LINE/COL ERROR


2/3 PL/SQL:SQL語句忽略

八十三分之二十PL/SQL:ORA-00904: 「NEW_VIOLATIONS」 「VIOLATION_TEXT」:無效的標識符

我是Oracle和PL/SQL的新手,一直在嘗試使用上述觸發器的變體,但無法將其編譯。我正在使用Oracle數據庫11g企業版版本11.2.0.4.0。任何想法如何修復語法?

回答

2

我沒有一個Oracle安裝在這裏進行測試 - 但請你不要把引號內的「violation_text」在10日線,或者把它以大寫字母引號內?

甲骨文默認的變化,是不是引號內爲大寫(對於表和列名)每低的情況下, 所以實際上你的列是new_violations「violation_text」,這不等於new_violations .violation_text - 這是new_violations 「VIOLATION_TEXT」 ......

+0

太謝謝你了。那是我的問題。一旦我大寫列別名,觸發器安裝就好了。 –