postgresql - 使用 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 中的第一个存储过程,我不确定为什么会出现此错误。
解决方案
之后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
用于标识符。
推荐阅读
- python - 无法在python中打印产品名称列表
- .net - 处理多个大文件时来自 HTTP 客户端的套接字异常
- javascript - JS中item的Y为0时碰撞检测条件不起作用
- typescript - Lerna monorepo - 从自身导入包作为别名/模块解析的替代方案是否“肮脏”?
- css - 如何在输入元素之间添加间距
- java - Path 的子路径中的驱动器号
- gcc - 从 GCC 4.8 迁移到 10 并且 -fpermissive 消失了?
- javascript - 使用 Heroku 发送邮件的 Gmail
- symfony - Symfony - 如何保存 xml 文件?
- excel - 旋转图片时VBA excel .Left .Top