Операторы HSQLDB-updatable не работают с "SELECT TOP" или " ORDER BY"
Я использую HSQLDB и preparedStatements просто отлично, но если я включаю либо "SELECT TOP", либо "ORDER BY" в мою инструкцию SQL, когда я вызываю updateBoolean (или UpdateInt и т. д.), Я попадаю в исключение:
java.sql.SQLException: attempt to assign to non-updatable column
Этот пример кода отлично работает:
preparedStatement = connection.prepareUpdatable(
"SELECT " + MyTable.COL_ID + ", " +
MyTable.COL_READ +
" FROM " + MyTable.NAME +
" WHERE " + MyTable.COL_LOCAL +
" =? AND " + MyTable.COL_REMOTE +
" =?",
ResultSet.TYPE_FORWARD_ONLY,
ResultSet.CONCUR_UPDATABLE);
preparedStatement.setString(1, localAddress);
preparedStatement.setString(2, remoteAddress);
ResultSet rs = connection.query(preparedStatement);
if (rs.next())
{
rs.updateBoolean(MyTable.COL_READ, isRead);
rs.updateRow();
}
Я получаю исключение, если меняю "SELECT "на"SELECT TOP". Или если я добавлю это к инструкции SQL:
" ORDER BY " + MyTable.COL_RECEIVED_TIMESTAMP + " DESC"
Спасибо за любую помощь.
Никб
1 ответ:
Обновляемый оператор SELECT не может иметь
TOP n
,LIMIT
илиORDER BY
. Это ограничение накладывается стандартом SQL. Ваш выбор становится недоступным для обновления, когда вы добавляете одно из этих ключевых слов.Можно использовать подзапрос в предложении WITH с указанными выше ключевыми словами, и SELECT можно обновить.
CREATE TABLE t (a int, b int, PRIMARY KEY(a)); WITH SUBQ(COL) AS (SELECT TOP 1 a FROM t) SELECT * FROM t WHERE a IN (SELECT * FROM SUBQ)