PostgreSQL触发语法错误

时间:2012-12-25 19:49:03

标签: postgresql exception-handling triggers plpgsql

我想知道如何使用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;

它不起作用。

2 个答案:

答案 0 :(得分: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>)

答案 1 :(得分: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;

成为:

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;

我们似乎无法将%USING MESSAGE声明一起使用。