Callabe 语句 Oracle Update Skip locked fetching out of sequence 错误

Callabe statement Oracle Update Skip locked fetching out of sequence error

以下是我使用 Callabe 调用的函数 Statement.Statement 获取游标,因为行类型在 java.But 中是不可能的,我收到一个乱序错误。 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())

您收到错误是因为游标 returns 一行,并且该行已被提取。

在检索到最后一行后不要发出提取语句 - 没有更多的行可以提取。

最好将函数拆分为:

1 一个函数,returns 必须更新的行的 ID。

2 执行更新的过程

3 使用 ID 进一步处理。