我try 将值添加到Postgres枚举类型中,如下所示(删除值的循环):

      PreparedStatement stmt = conn.prepareStatement("ALTER TYPE my_enum_type ADD VALUE ?;");
      
      stmt.setString(1, "value");
      stmt.addBatch();
      stmt.executeBatch()
            

当我运行它时,我得到:

Batch entry 0 ALTER TYPE my_enum_type ADD VALUE 'value' was aborted: ERROR: syntax error at or near "$1"

我在谷歌上发现,这可能与选角有关.我将查询更改为:

ALTER TYPE my_enum_type ADD VALUE ?::my_enum_type

它会给出相同的错误.

ALTER TYPE my_enum_type ADD VALUE cast(? as my_enum_type)

cast上出现语法错误而失败

I worked around it by concatenating a string with the enum value 和 executing that, but there has to be a better way.

我是Postgres的新手,有什么简单的方法可以解决这个问题吗?

EDIT: In response to comments 和 to avoid confusion:

  1. How do I make Java & Postgres enums work together for update? is about executing updates 和 not ALTER. The solution there is to cast to the target type, which I tried 和 did not work.

解决方案:

在Laurenz Albe的 comments 之后,我最终将我的解决方案修改为:

        try (Statement stmt = conn.createStatement()) {

            PGConnection pgconn = conn.unwrap(PGConnection.class);

            for (String i : missingValues) { 

                stmt.addBatch("ALTER TYPE my_enum_type ADD VALUE '" + pgconn.escapeLiteral(i) + "'");
            }


            stmt.executeBatch();
        }

推荐答案

语句中的参数只能与INSERTSELECTUPDATEDELETEMERGEVALUES一起使用,不能与ALTER TYPE一起使用.

要在文档中找到这一限制,您必须知道JDBC预准备语句及时会导致"服务器端预准备语句",在PostgreSQL中可以使用SQL语句PREPARE创建该语句.The documentation for PREPARE表示:

statement

任何SELECTINSERTUPDATEDELETEMERGEVALUES语句.

您必须自己构造查询字符串.为避免SQL注入,请使用内置方法正确地将字符串引起来:

org.postgresql.PGConnection pgconn = conn.unwrap(org.postgresql.PGConnection.class);

String query = "ALTER TYPE my_enum_type ADD VALUE " + pgconn.escapeLiteral("value");

conn.createStatement().executeUpdate(query);

Java相关问答推荐

我们如何直接使用kerminldap服务票证来通过ldap进行身份验证并形成LDAP上下文

Selenium Java:无法访问IFRAME内部的元素

虚拟线程似乎在外部服务调用时阻止运营商线程

查找最大子数组的和

缩小画布比例后更改滚动窗格的内部大小

给定Java枚举类,通过值查找枚举

确定Java中Math.Ranb()输出的上限

在JavaFX项目中注册组合框的控件FX验证器时,模块系统出错

只需最少的代码更改即可将版本号标记添加到日志(log)

蒙蒂霍尔比赛结果不正确

具有阻塞方法的开源库是否应该为执行提供异步选项?

无法使用Java&;TestContainers获取AWS SQS队列的属性

格式中的特定回录键-值对

Spring Security不允许加载js

从ActiveMQ Classic迁移到ActiveMQ Artemis需要进行哪些客户端更改?

如何在一行中使用Dijkstra中的Java Stream

如何使用Java ZoneID的区域设置?

H2数据库仅支持%1个结果集?

Java 21保护模式的穷尽性

UuidGenerator Bean 类型不匹配?