2016-10-18 46 views
1

這裏是我的PostgreSQL代碼創建觸發器的功能是psql的「語法錯誤或接近‘創建’」

CREATE FUNCTION connectedExhibitionFunction() 
RETURNS trigger AS 
$$ 
BEGIN 
     IF (SELECT COUNT("exName") FROM Exhibitions WHERE NEW."exName" = "exName") > 0 THEN 
       IF (SELECT Count(doorLoc1) FROM Doors, ExhibitionLocations WHERE (dorLoc1=NEW.elLocation AND dorLoc2=elLocations) OR (dorLoc2=NEW.elLocation AND dorLoc1=elLocations) > 0 THEN 
         RAISE EXCEPTION 'You can't have the exhibition there, the same exhibition is in an unconnected room'; 
       END IF; 
     END IF; 
END; 
$$ 
LANGUAGE plpgsql; 

CREATE TRIGGER connectedExhibitionTrigger 
     BEFORE INSERT 
     ON ExhibitionsLocations 
     EXECUTE PROCEDURE connectedExhibitionFunction(); 

這是我得到

psql:file.txt:62: ERROR: syntax error at or near "CREATE" 
LINE 8: CREATE FUNCTION connectedExhibitionFunction() 
     ^
psql:file.txt:67: ERROR: current transaction is aborted, commands ignored until end of transaction block 

我不能錯誤似乎找出錯誤,任何人都可以在這裏找到任何東西?

+1

錯誤說'行8'。我猜測它之前的語句缺少分號。 –

+0

對我而言,觸發器應該做什麼並不是100%清楚,但在我看來,您正試圖通過這種方式創建一個獨特的約束。爲什麼不簡單地創建一個唯一的索引?並且應該真正學會使用明確的'JOIN'運算符,而不是'where子句中古老的,過時的和脆弱的隱式連接 –

回答

2

我想你錯過了選擇「)」,並提出異常從句不能是「不能」 而你可以使用END而不是END IF。據我所知你的問題是這些。

請嘗試此操作。

IF (SELECT Count(doorLoc1) FROM Doors, ExhibitionLocations 
    WHERE (dorLoc1=NEW.elLocation AND dorLoc2=elLocations) OR 
    (dorLoc2=NEW.elLocation AND dorLoc1=elLocations)) > 0 THEN 
    RAISE EXCEPTION 'You cant have the exhibition there, the same exhibition is in an unconnected room'; 
END 
1

你不應該使用count()函數測試數據的情況下,使用PERFORM命令。您還應該從觸發器函數RETURN NEWRETURN NULL或您的插入將按定義失敗。隨着一些其他改進,你將最終與此:

CREATE FUNCTION connectedExhibitionFunction() RETURNS trigger AS $$ 
BEGIN 
    PERFORM * FROM Exhibitions WHERE "exName" = NEW."exName"; 
    IF FOUND THEN 
     PERFORM * FROM Doors, ExhibitionLocations 
     WHERE (dorLoc1 = NEW.elLocation AND dorLoc2 = elLocations) 
      OR (dorLoc2 = NEW.elLocation AND dorLoc1 = elLocations); 
     IF FOUND THEN 
      RAISE EXCEPTION 'You can''t have the exhibition there, the same exhibition is in an unconnected room'; 
      RETURN NULL; -- Make the INSERT fail 
     END IF; 
    END IF; 
    RETURN NEW; -- Make the INSERT succeed 
END; 
$$ LANGUAGE plpgsql;