如何在游标循环中将变量作为表名动态执行ALTER TABLE语句
问题原因
报错的核心原因是静态SQL语句不支持将函数返回值直接作为表名这类标识符使用,QUOTE_IDENT是PL/pgSQL内置函数,不能直接嵌在ALTER TABLE的静态语法结构中,数据库解析SQL时会把QUOTE_IDENT(识别为表名的一部分,不符合语法规则,因此抛出语法错误。
解决方案
需要使用PL/pgSQL的EXECUTE语句执行动态拼接的SQL,有两种常用的安全写法:
写法1:使用format函数(更简洁)
format的%I占位符和QUOTE_IDENT作用完全一致,会自动将传入内容转换为合法标识符,避免SQL注入和特殊字符问题:
FOR _r IN curs1 LOOP EXECUTE format('ALTER TABLE %I ALTER COLUMN company_uuid SET NOT NULL', _r.table_name); END LOOP;
写法2:手动拼接QUOTE_IDENT返回值
如果你更习惯直接用QUOTE_IDENT,可以用字符串拼接的方式生成完整SQL再交给EXECUTE执行:
FOR _r IN curs1 LOOP EXECUTE 'ALTER TABLE ' || QUOTE_IDENT(_r.table_name) || ' ALTER COLUMN company_uuid SET NOT NULL'; END LOOP;
额外提示:执行前建议先校验所有遍历的表都存在
company_uuid字段,避免执行中途因字段不存在报错,出现部分表已修改约束、部分未修改的不一致问题。
内容的提问来源于stack exchange,提问作者Ben
相关产品推荐
相关产品推荐

