Поддерживает ли PostgreSQL SQL «SELECT ... FOR UPDATE OF ...»? - PullRequest
3 голосов
/ 28 июля 2011

В настоящее время я использую базу данных " PostgreSQL 9.0.4 " с драйвером JDBC: " postgresql-9.0-801.jdbc4.jar ".

У меня есть следующий JDBC SQL, использующий предложение " SELECT ... FOR UPDATE OF ... ", которое извлекает значение столбца (long) и обновляет значение путем увеличения в той же транзакции.
Мне нужно вернуть длинное значение , поэтому мне нужно использовать 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

У меня действительно есть таблица " sequence " с правильно созданным столбцом " value " - так что это не может быть печально известной проблемой чувствительности к регистру.

Означает ли это, что Postgres не поддерживает "SELECT ... FOR UPDATE OF .." Синтаксис SQL?
В таком случае, каков будет наилучший способ достижения того же эффекта (т. е. выбрать и обновить с помощью той же транзакции)?

Заранее большое спасибо,

1 Ответ

6 голосов
/ 28 июля 2011

Да.Это поддерживается.НО синтаксис:

FOR UPDATE [ OF table_name [, ...] ] [ NOWAIT ]

Вы можете увидеть больше здесь:

http://www.postgresql.org/docs/8.2/static/sql-select.html#SQL-FOR-UPDATE-SHARE

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...