Postgresql函数执行格式动态DDL值错误

Postgresql Function execute format dynamic DDL value error

所以,我需要创建一个可以生成模式的函数 & table 模式名称和 table 名称取决于参数发送调用 _schema_name 对于架构名称 & _tp_table_name 对于 table 名称。

我现在的 pgsql 函数代码:

CREATE OR REPLACE FUNCTION public.addschema(_schema_name character varying, _tp_table_name character varying )
 RETURNS character varying
 LANGUAGE plpgsql
AS $function$

begin 
    
    execute format('CREATE schema %I',_schema_name);

    execute format('CREATE TABLE %I.%I( id uuid NOT NULL DEFAULT uuid_generate_v4(),
                        raw_id uuid NULL)', _schema_name, _tp_table_name);

RETURN _schema_name;
END;

$function$
;

所以我 运行 这个函数 :

select addschema('newschema','new_tbl');

我遇到了这样的错误:

SQL Error [22023]: ERROR: unrecognized format() type specifier "I"
  Hint: For a single "%" use "%%".
  Where: PL/pgSQL function addschema(character varying,character varying) line 11 at EXECUTE

有人有什么提示吗?谢谢..

问题一定出在客户端的某个地方。你的功能看起来很好。我已经在 psqlpgAdmin4DBeaver 21.2.0.202108310918 中对其进行了测试(稍微格式化).. 一切正常:

CREATE OR REPLACE FUNCTION public.addschema(_schema_name text, _tp_table_name text )
 RETURNS text 
AS $$
BEGIN 
 EXECUTE format('CREATE SCHEMA %I;',_schema_name);
 EXECUTE format('CREATE TABLE %I.%I( id uuid NOT NULL DEFAULT uuid_generate_v4(),
                       raw_id uuid NULL)', _schema_name, _tp_table_name);
 RETURN _schema_name;
END
$$ LANGUAGE plpgsql;

DBeaver 屏幕截图:

或者,您可以查看数据库日志文件,了解查询实际上是如何发送到数据库的。此外,如果您使用的是较旧的 PostgreSQL 版本,则仅在 PostgreSQL 9.6+

之后才支持 format()