PostgreSQL执行format动态DDL提示无法识别类型说明符I如何解决
报错原因
- 核心原因是你当前使用的PostgreSQL版本低于9.1:
%I是PostgreSQL 9.1版本才新增的标识符格式化占位符,用于自动转义SQL标识符(比如模式名、表名)避免注入风险,低版本无法识别这个格式说明符。 - 次要排查点:确认你写的是大写字母
I,不是小写字母l或者数字1,拼写错误也会触发该报错。
解决方法
方案1(推荐):升级PostgreSQL版本
将数据库版本升级到9.1及以上,原有函数代码无需修改即可正常运行。
方案2(兼容低版本):替换%I为quote_ident()手动转义
如果无法升级版本,可以用quote_ident()函数实现相同的标识符转义效果,修改后的函数代码如下:
CREATE OR REPLACE FUNCTION public.addschema(_schema_name character varying, _tp_table_name character varying ) RETURNS character varying LANGUAGE plpgsql AS $function$ begin -- 用quote_ident转义模式名 execute 'CREATE SCHEMA ' || quote_ident(_schema_name); -- 分别转义模式名和表名后拼接 execute 'CREATE TABLE ' || quote_ident(_schema_name) || '.' || quote_ident(_tp_table_name) || '( id uuid NOT NULL DEFAULT uuid_generate_v4(), raw_id uuid NULL)'; RETURN _schema_name; END; $function$;
额外注意:函数中用到了
uuid_generate_v4()函数,需要提前安装uuid-ossp扩展才能正常使用,执行以下语句开启扩展:CREATE EXTENSION IF NOT EXISTS "uuid-ossp";
内容的提问来源于stack exchange,提问作者WildanVEP
相关产品推荐
相关产品推荐

