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 进一步处理。
以下是我使用 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 进一步处理。