首页 > 解决方案 > 使用 alter table 时无法连接字符串

问题描述

错误:'(' 第 8 行或附近的语法错误

CREATE OR REPLACE PROCEDURE schema.testprocedure()
    LANGUAGE plpgsql
AS $procedure$
    declare 
        counter integer := 1; 
    begin
        ALTER TABLE schema.test 
        RENAME TO CONCAT('test', counter);
        -- tried SELECT concat as well..
        counter++;

    END;
$procedure$

这是我在 postgres 中的第一个存储过程,我不确定为什么会出现此错误。

标签: postgresqlplpgsql

解决方案


之后RENAME TO必须是一个 SQL 标识符(一个名称),而不是一个字符串。

由于您只能将参数用于数据值,而不能用于标识符,而且参数只能SELECT与 DML 语句一起使用,因此您不能那样做。

相反,您必须构造一个 SQL 字符串并使用EXECUTE(动态 SQL)执行它。小心避免 SQL 注入问题 - 使用format

BEGIN
   EXECUTE format(
              'ALTER TABLE myschema.test RENAME TO %I',
              CONCAT('test', counter)
           );
END;

占位符%I用于标识符。


推荐阅读