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
有人有什么提示吗?谢谢..
问题一定出在客户端的某个地方。你的功能看起来很好。我已经在 psql
、pgAdmin4
和 DBeaver 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()
所以,我需要创建一个可以生成模式的函数 & 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
有人有什么提示吗?谢谢..
问题一定出在客户端的某个地方。你的功能看起来很好。我已经在 psql
、pgAdmin4
和 DBeaver 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()