首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Postgresql函数执行格式动态DDL值错误

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

Stack Overflow用户
提问于 2021-09-17 11:28:08
回答 1查看 521关注 0票数 1

因此,我需要创建一个函数,该函数可以生成模式和表名依赖于参数send的模式&表名,称为_schema_name表示模式名,而表名依赖于_schema_name。

现在我的pgsql函数代码:

代码语言:javascript
运行
复制
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$
;

因此,我使用以下方法来运行这个函数:

代码语言:javascript
运行
复制
select addschema('newschema','new_tbl');

我犯了这样的错误:

代码语言:javascript
运行
复制
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

有什么线索吗?谢谢。。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-09-17 12:22:06

问题必须在客户端的某个地方。你的功能看起来很好。我在psqlpgAdmin4DBeaver 21.2.0.202108310918中测试了它(稍微格式化)。一切都很好:

代码语言:javascript
运行
复制
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()

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69222685

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档