【发布时间】:2011-07-28 00:42:19
【问题描述】:
我目前正在使用带有 JDBC 驱动程序的“PostgreSQL 9.0.4”数据库:“postgresql-9.0-801.jdbc4.jar”。
我有以下 JDBC SQL 使用“SELECT...FOR UPDATE OF...”子句检索列值(长)并通过在同一事务中递增来更新该值。
我需要返回长值,因此我需要使用SELECT Sql。
final PreparedStatement preparedStatement = _connection.prepareStatement(
"select value from sequence where table_name='JOB' for update of value",
ResultSet.TYPE_FORWARD_ONLY, ResultSet.CONCUR_UPDATABLE);
long ret;
try {
final ResultSet resultSet = preparedStatement.executeQuery();
resultSet.next();
ret = resultSet.getLong(1);
resultSet.updateLong(1, ret + 1);
resultSet.updateRow();
} catch (SQLException ex) {
ex.printStackTrace();
}
finally {
resultSet.close();
preparedStatement.close();
}
return ret;
所有其他数据库,例如MySQL、Oracle、MS-SQL、Derby 与此类 SQL 配合良好 - 但 PostgreSQL 总是抛出以下异常。
org.postgresql.util.PSQLException: ERROR: relation "value" in FOR UPDATE/SHARE clause not found in FROM clause
Position: 68
我确实已经正确创建了带有“value”列的“sequence”表 - 所以这可能不是臭名昭著的区分大小写的问题。
这是否意味着 Postgres 不支持 "SELECT ...FOR UPDATE OF.." SQL 语法?
在这种情况下,实现相同效果的最佳方法是什么(即使用同一事务进行选择和更新)?
非常感谢,
【问题讨论】:
标签: postgresql