Callabe声明Oracle Update Skip锁定了取出序列错误

时间:2016-12-21 07:29:59

标签: java oracle function cursor callable-statement

以下是我使用Callabe Statement.Statement调用的函数获取游标,因为java中的rowtype是不可能的。但是我得到了一个不按顺序的错误。 java.sql.SQLException:ORA-01002:fetch out of sequence

final TextView eSpinnerTV = (TextView)view.findViewById(android.R.id.text1);

Callabe声明如下

    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;

1 个答案:

答案 0 :(得分:1)

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

在检索到最后一行之后不要发出fetch语句 - 不再需要获取行。

最好将功能分为:

1一个函数,它返回必须更新的行的ID。

2执行更新的程序

3使用ID进行进一步处理。