java.sql.SQLException: ORA-01002: извлечение из последовательности - PullRequest
0 голосов
/ 28 марта 2012

У меня есть одно демонстрационное приложение для проверки выбора для запроса на обновление

public class Test implements Runnable{

    public Test() {
    }

    public static void main(String[] args) {
        Thread t1 = new Thread(new Test());
        Thread t2 = new Thread(new Test());

        t1.start();
        t2.start();
    }

    public void run() {
        // TODO Auto-generated method stub
        try{
            String updateWith = "";
            String sel = "SELECT SIDNUMBERTO FROM tblmserialbatchdetail WHERE sidnumberto = ("+
            "SELECT max(sidnumberto) FROM tblmserialbatchdetail WHERE generationmode='A' and nvl(serialprefix,' ') = nvl('',' ') " +
            "and sidlengthwithoutprefix =12) FOR UPDATE";
            //System.out.println("SELECT QUERY ===: "+sel);
            String updatequery = "update tblmserialbatchdetail set sidnumberto = ? where serialbatchid = ?";
            System.out.println();
            Connection connection = Conn.getDBConnection();
            PreparedStatement pStatement = connection.prepareStatement(sel);

            ResultSet rSet = pStatement.executeQuery();

            while(rSet.next()){

                updateWith = rSet.getString(1);
                long value = Long.parseLong(updateWith)+1;
                updateWith = String.valueOf(value);
                System.out.println("resulet To be Updated ===> "+value);
            }
            connection.commit();
            connection.close();



        }catch (Exception e) {
            e.printStackTrace();
        }
    }

}

Это нормально работает, если я удаляю Для обновления из запроса на выборку, в противном случае выдайте мне ошибку

java.sql.SQLException: ORA-01002: fetch out of sequence

    at oracle.jdbc.dbaccess.DBError.throwSqlException(DBError.java:180)
    at oracle.jdbc.ttc7.TTIoer.processError(TTIoer.java:208)
    at oracle.jdbc.ttc7.Oall7.receive(Oall7.java:543)
    at oracle.jdbc.ttc7.TTC7Protocol.doOall7(TTC7Protocol.java:1451)
    at oracle.jdbc.ttc7.TTC7Protocol.fetch(TTC7Protocol.java:943)
    at oracle.jdbc.driver.OracleStatement.doExecuteQuery(OracleStatement.java:2119)
    at oracle.jdbc.driver.OracleStatement.doExecuteWithTimeout(OracleStatement.java:2324)
    at oracle.jdbc.driver.OraclePreparedStatement.executeUpdate(OraclePreparedStatement.java:421)
    at oracle.jdbc.driver.OraclePreparedStatement.executeQuery(OraclePreparedStatement.java:365)
    at com.response.Test.run(Test.java:47)
    at java.lang.Thread.run(Thread.java:595)

Ответы [ 3 ]

6 голосов
/ 28 марта 2012

SELCT ... FOR UPDATE имеет смысл только в контексте управляемой транзакции, поскольку она требует снятия блокировок на выбранных строках.

По умолчанию JDBC не использует управляемую транзакцию, она используетнеявно созданный, который фиксируется, как только запрос выполняется.Это нарушит семантику SELECT ... FOR UPDATE, и драйвер JDBC пожалуется.

Чтобы использовать управляемую транзакцию, добавьте

connection.setAutoCommit(false); 

перед выполнением запроса.Затем выполните connection.commit().

0 голосов
/ 03 июля 2013

вместо использования executeQuery, вы можете использовать функцию executeUpdate.Не используйте «выбрать для обновления», вместо этого попробуйте напрямую обновить строки в одной транзакции. Это даст вам количество обновленных строк.Таким образом, например, когда две транзакции пытаются обновить строку, первая выигрывает, другая возвращает ноль, и вы знаете, что сначала удастся обновить, так как она вернет обновленное количество строк.

0 голосов
/ 28 марта 2012

Попробуйте:

connection.setAutoCommit(false); 

Как общее примечание, "выбрать ... для обновления" - не лучшая стратегия блокировки.

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