如何从 Oracle 函数锁定和返回多行



我一直在尝试解决 Oracle 如何处理ROWNUMSELECT ... FOR UPDATE SKIP LOCKED的问题,同时尝试返回几行未锁定的行。我已经尝试了以下许多解决方案:强制 Oracle 返回带有 SKIP LOCK 的前 N 行,以及其他几个看起来与该问题上发现的示例非常相似的示例。我知道Oracle AQ可能是最好的解决方案,但是我们对数据库的控制很少,而且我对这个想法遇到了相当大的阻力。

我遇到的问题是试图使用 JDBC 将结果返回给 Java。我已经尝试了setFetchSize(20),但是我遇到了仅将前20行分配给客户端的问题。我通常看到一个处理代理获取所有 20 行,或者几个处理器获取一些行,所有这些行加起来都是 20 行。这非常类似于将ROWNUMSELECT ... 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?

这是行不通的。将 pl/sql 函数作为 select 语句的一部分调用,并尝试在该函数中启动事务。我认为错误很清楚。

最新更新