2011-07-28 8 views
2

現在、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構文?
その場合、同じ効果を達成するための最良の方法(つまり、同じトランザクションで選択して更新すること)は何ですか?事前に

多くのおかげで、

答えて

5

はい。それはサポートされています。しかし構文は

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

であるあなたがより多くのここで見ることができます。

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

+0

をはい - それは動作します。実際には、SELECT文の一部として "table_name"列も指定しなければなりませんでした。そこで、更新された文がここにあります。 msgstr "" "table_name = 'JOB' FOR UPDATE OF SEQUENCE 'のシーケンスから値を選択してください。どうもありがとう。 – javauser71

関連する問題