Оператор 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 Дальнейшая обработка с использованием идентификатора.