2012-12-25 138 views
0

我不知道如何在PostgreSQL中使用觸發器與RAISE SQLSTATE動態指令?PostgreSQL觸發語法錯誤

IF i>0 THEN 
    RAISE SQLSTATE '23505' USING MESSAGE = 'la planète est déjà occupée (planet_non_free)=(%, %, %)', NEW.galaxie, NEW.systeme_solaire, NEW.position; 
END IF; 

它不起作用。

+1

「不起作用」 不是問題描述。 – melpomene

+0

好吧,我剛剛找到解決方案......用圓括號包圍MESSAGE值,就像這樣:'MESSAGE =('laplanète...,NEW.position);' –

+0

你應該把它寫成答案並接受它。 :-) – melpomene

回答

0

好的,我找到了解決方案。我只有圍繞MESSAGE值與括號:

所以:

IF i>0 THEN 
    RAISE SQLSTATE '23505' USING MESSAGE = 'la planète est déjà occupée (planet_non_free)=(%, %, %)', NEW.galaxie, NEW.systeme_solaire, NEW.position; 
END IF; 

變成了:在網絡上的動態MESSAGE

IF i>0 THEN 
    RAISE SQLSTATE '23505' USING MESSAGE = ('la planète est déjà occupée (planet_non_free)=(%, %, %)', NEW.galaxie, NEW.systeme_solaire, NEW.position); 
END IF; 

簡單,但我並沒有看到明顯的例子。

希望這有助於

編輯:

好對不起,正確的語法是這樣的一個:

IF i>0 THEN 
    RAISE SQLSTATE '23505' USING MESSAGE = 'la planète est déjà occupée (planet_non_free)=(' || NEW.galaxie || ',' || NEW.systeme_solaire || ',' || NEW.position || ')'; 
END IF; 

看來,我們不能USING MESSAGE語句中使用%

1

我建議使用:

IF i > 0 THEN 
    RAISE SQLSTATE '23505' 
    USING MESSAGE = format('la planète est déjà occupée (planet_non_free)=(%s, %s, %s)', NEW.galaxie, NEW.systeme_solaire, NEW.position); 
END IF; 

那麼你的錯誤信息上寫着:

la planète est déjà occupée (planet_non_free)=(<g>, <s>, <p>) 

..代替:

("la planète est déjà occupée (planet_non_free)=(%, %, %)",<g>, <s>, <p>)