首页 > 解决方案 > PostgreSQL {call Update Set ...} 得到“SET 处或附近的语法错误”

问题描述

我正在将查询从 Oracle 数据库更改为 PostgreSQL,在此查询中我收到此错误:

 ERROR: syntax error at or near "SET"

查询是:

{call UPDATE alarm_instance SET last_update_time=default, wait_expire_time=null, core_number=nextval(SEQ_ALRM_NUMBR) 
where wait_time <= current_date RETURNING alarm_instance_id bulk collect INTO ?}

我正在使用 JDBC 连接到数据库,这是调用代码

try (CallableStatement cs = super.prepareCall_(query)) {
    cs.registerOutParameter(1, Types.ARRAY);
    cs.execute();
    ...

我仔细查看了 Postgres 文档,找不到问题所在,也没有找到针对这种特定情况的任何答案

标签: postgresqljdbc

解决方案


UPDATE不能使用 CallableStatement 执行语句。CallableStatement 本质上只是用于调用存储过程。如果 Oracle 包含匿名 PL/SQL 块。

并且bulk collect一开始在 Postgres 中是无效的。

看来你想要这样的东西:

String sql = 
  "UPDATE alarm_instance " + 
  "   SET last_update_time=default, " +
  "       wait_expire_time=null, "
  "       core_number=nextval('SEQ_ALRM_NUMBR') " + 
  " where wait_time <= current_date RETURNING alarm_instance_id";

Statement stmt = connection.createStatement();
stmt.execute(sql);
int rowsUpdated = stmt.getUpdateCount();
ResultSet rs = stmt.getResultSet();
while (rs.next() {
  // do something with the returned IDs
}

推荐阅读