我一直在尝试解决 Oracle 如何处理ROWNUM
以及SELECT ... FOR UPDATE SKIP LOCKED
尝试返回几行未锁定的问题。我尝试了以下一些解决方案:Force Oracle to return TOP N rows with SKIP LOCKED,以及其他几个看起来与该问题非常相似的示例。我知道 Oracle AQ 可能是最好的解决方案,但我们对数据库几乎没有控制权,而且我遇到了相当大的反对意见。
我遇到的问题是尝试使用 JDBC 将结果返回给 Java。我已经尝试过setFetchSize(20)
,但我遇到了只将前 20 行分发给客户端的问题。我通常会看到一个处理代理获得所有 20 行或几个处理器获得一些行,所有这些行加起来为 20。这非常类似于ROWNUM
与SELECT ... FOR UPDATE SKIP LOCKED
.
我尝试过的最有希望的解决方案是以下功能:
create type IND_ID as object
(
ID varchar2(200)
);
create type IND_ID_TABLE as table of IND_ID;
create or replace function SELECTIDS return IND_ID_TABLE
pipelined is
ST_CURSOR SYS_REFCURSOR;
ID_REC IND_ID := IND_ID(null);
begin
open ST_CURSOR for
select ID
from TABLE
/* where clause */
for update SKIP LOCKED;
loop
fetch ST_CURSOR
into ID_REC.ID;
exit when ST_CURSOR%rowcount > 20 or ST_CURSOR%notfound;
pipe row(ID_REC);
end loop;
close ST_CURSOR;
return;
end;
但是,当我尝试像这样调用它时:
select * from table(SELECTIDS)
我收到一个ORA-14551: cannot perform a DML operation inside a query
错误,我现在明白这是事务的问题。移除锁会导致函数返回行。
如何在保留锁的同时将此函数中的多行放入 JDBC?