Postgresql 字符串连接:错误:“msg”处或附近的语法错误

Posted

技术标签:

【中文标题】Postgresql 字符串连接:错误:“msg”处或附近的语法错误【英文标题】:Postgresql string concatenation: error: syntax error at or near "msg" 【发布时间】:2014-03-20 08:33:20 【问题描述】:

我正在尝试使用串联消息在 Postgresql 函数中提出问题,但在运行时收到错误消息:

error: syntax error at or near "msg"

代码如下:

CREATE OR REPLACE FUNCTION insertUserAccount(
    id             bigint,
    nname          varchar(40),
    email          varchar(40),
    pwd            varchar,
    status         smallint,
    last_update  bigint,
    preferences    json,
    bits           integer,
    adm            json)
    RETURNS bigint AS $$
DECLARE
    rowc INTEGER;
    ret_id bigint;
    msg text;
BEGIN
    ...
    IF ( rowc > 0 ) THEN
        msg = 'User account already exists or name or email is unavailable (id=' || id
            || ', name=' || nname
            || ', email=' || email || ')';
        RAISE EXCEPTION msg USING ERRCODE = '23505';
    ELSE
    ...

【问题讨论】:

在 PL/pgSQL 中将:= 用于assignment。 谢谢,如果你创建一个答案,我会批准它。 虽然:= 是个好建议,但它无法解释错误。详情here。 Syntax options for RAISE 取决于您的 Postgres 版本。最近的版本有几个更新。 【参考方案1】:

实际问题是RAISE EXCEPTION 的语法错误。我会整体简化:

IF rowc > 0 THEN
   RAISE EXCEPTION 'User account already exists or name or email is unavailable (id=%,name=%,email=%)'
                 , id, nname, email  USING ERRCODE = '23505';
ELSE ...

那时可能根本不需要变量msg。通常最好将分配的数量保持在较低水平,因为这些在 PL/pgSQL 中相当昂贵(与其他编程语言相比)。没有戏剧性,但仍然......

【讨论】:

【参考方案2】:

在 PL/pgSQL 中将:= 用于assignment

【讨论】:

我不得不改变 RAISE EXCEPTION msg USING ERRCODE = '23505';进入 RAISE EXCEPTION '%', msg USING ERRCODE = '23505';让它也能工作。

以上是关于Postgresql 字符串连接:错误:“msg”处或附近的语法错误的主要内容,如果未能解决你的问题,请参考以下文章

Azure 函数创建太多与 PostgreSQL 的连接

Android上的Postgresql JDBC连接错误

如何解决 postgresql 错误“连接尝试失败”?

Postgresql 错误:无法建立连接

PostgreSQL - 带有错误计数输出的左连接

尝试从节点应用程序连接时出现 PostgreSQL 错误