2013-04-25 57 views
2

尊者是觸發PostgreSQL中8.4:SQL觸發器如果與其他然後建設

CREATE OR REPLACE FUNCTION updateMarkers() 
    RETURNS trigger AS 
    $$ 
    BEGIN 
IF NEW.status='Новый' THEN 
    UPDATE markers SET statusId=0; 
    RETURN NEW; 
ELSE IF NEW.status='В работе' THEN 
    UPDATE markers SET statusId=2; 
    RETURN NEW; 
ELSE IF NEW.status='Завершен' THEN 
    UPDATE markers SET statusId=3; 
    RETURN NEW; 
ESLE 
    UPDATE markers SET statusId=4; 
    RETURN NEW; 
END IF; 
END; 
$$ 
LANGUAGE plpgsql; 

,我得到語法錯誤在ESLE線。
什麼可能是錯的?

+1

+1非常有趣的問題 – skytz 2013-04-25 13:01:50

+0

@skytz:你的話讓我受傷。 ( – 2013-04-26 03:59:50

+0

它碰巧是我們最好的 – skytz 2013-04-26 07:20:56

回答

5

你已經寫ESLE代替ELSE .... 新的查詢應該是這樣的:

CREATE OR REPLACE FUNCTION updateMarkers() 
    RETURNS trigger AS 
    $$ 
    BEGIN 
IF NEW.status='Новый' THEN 
    UPDATE markers SET statusId=0; 
    RETURN NEW; 
ELSE IF NEW.status='В работе' THEN 
    UPDATE markers SET statusId=2; 
    RETURN NEW; 
ELSE IF NEW.status='Завершен' THEN 
    UPDATE markers SET statusId=3; 
    RETURN NEW; 
ELSE 
    UPDATE markers SET statusId=4; 
    RETURN NEW; 
END IF; 
END; 
$$ 
LANGUAGE plpgsql; 
+0

是的錯誤,但現在我在下一行出現錯誤 – 2013-04-25 07:09:10

+0

好吧,我發現錯誤:'ELSE IF - > ELSIF'。 – 2013-04-25 07:14:21

4

或者,更簡單,在你的情況下更快地使用"simple" CASE一個UPDATE命令:

CREATE OR REPLACE FUNCTION updatemarkers() 
    RETURNS trigger AS 
$$ 
BEGIN 

UPDATE markers 
SET statusid = 
    CASE NEW.status 
    WHEN 'Новый' THEN 0 
    WHEN 'В работе' THEN 2; 
    WHEN 'Завершен' THEN 3; 
    ELSE 4 
    END; 

RETURN NEW; 

END 
$$ LANGUAGE plpgsql; 

這種簡單的格式很好,因爲您在任何情況下都進行更新。也在Postgres 8.4中工作。

+0

這段代碼看起來很不錯。 – 2013-04-26 03:59:01