Оператор Callabe Обновление Oracle Пропустить заблокированную выборку из-за ошибки последовательности

Ниже приведена функция, которую я вызываю с помощью оператора Callabe. Состояние извлекает курсор, так как тип строки невозможен в java. Но я получаю ошибку вне последовательности. java.sql.SQLException: ORA-01002: извлечение из последовательности

    create or replace FUNCTION DEQUEUE
RETURN SYS_REFCURSOR
IS
  c_Result SYS_REFCURSOR;
BEGIN
  OPEN  c_Result FOR SELECT * FROM QUEUE_SKIP_LOCKED WHERE ROWNUM=1 FOR UPDATE SKIP LOCKED;
declare
  c_fdbQueuerow sys_refcursor;
  l_queueRow QUEUE_SKIP_LOCKED%rowtype;
  begin
  c_fdbQueuerow := c_Result;
loop
    fetch c_fdbQueuerow into l_queueRow;
     IF l_queueRow.key IS NOT NULL THEN
      UPDATE QUEUE_SKIP_LOCKED SET STATUS='WORKING' WHERE KEY=l_queueRow.key;
    END IF;
    exit when c_fdbQueuerow%notfound;
  end loop;
    RETURN c_fdbQueuerow;
end;
  EXCEPTION 
  WHEN OTHERS THEN 
  RAISE;
END dequeue;

Заявление Callabe выглядит следующим образом

session.connection().setAutoCommit(false);
    cs = session.connection().prepareCall("{?=call dequeue}");
    cs.registerOutParameter(1, OracleTypes.CURSOR);
    cs.executeUpdate();
    session.connection().commit();
    ResultSet rs = (ResultSet) cs.getObject(1);
    while(rs.next())

1 ответ

Решение

Вы получаете ошибку, потому что курсор возвращает одну строку, и эта строка уже выбрана.

Не используйте оператор извлечения после извлечения последней строки - больше нет строк для извлечения.

Лучше разбить функцию на:

1 Функция, которая возвращает идентификатор строки, которую необходимо обновить.

2 Процедура обновления

3 Дальнейшая обработка с использованием идентификатора.

Другие вопросы по тегам