現在、JDBCドライバを使用している "PostgreSQL 9.0.4"データベース: "postgresql-9.0-801.jdbc4.jar"を使用しています。PostgreSQLは "SELECT ... FOR UPDATE OF ..." SQLをサポートしていますか?
"SELECT ... FOR UPDATE OF ..."句を使用して、次のJDBC SQLを使用して、同じトランザクションで列の値(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;
他のすべてのデータベース。このようなSQLでは、MySQL、Oracle、MS-SQL、Derbyは正常に動作しますが、PostgreSQLは常に例外をスローします。
org.postgresql.util.PSQLException: ERROR: relation "value" in FOR UPDATE/SHARE clause not found in FROM clause
Position: 68
私が正しく作成され、「値」欄で「シーケンスを」テーブルを持っていない - これは悪名高い場合、感度の問題ではないかもしれません。
これは、Postgresが"SELECT ... FOR UPDATE OF .."をサポートしていないことを意味しますか? SQL構文?
その場合、同じ効果を達成するための最良の方法(つまり、同じトランザクションで選択して更新すること)は何ですか?事前に
多くのおかげで、
をはい - それは動作します。実際には、SELECT文の一部として "table_name"列も指定しなければなりませんでした。そこで、更新された文がここにあります。 msgstr "" "table_name = 'JOB' FOR UPDATE OF SEQUENCE 'のシーケンスから値を選択してください。どうもありがとう。 – javauser71