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

时间:2012-06-21 15:21:55

标签: oracle jdbc plsql sys-refcursor oracle-cursor

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

我遇到的问题是尝试使用JDBC将结果返回给Java。我已经尝试了setFetchSize(20),但我遇到了只有前20行分发给客户端的问题。我经常看到一个处理代理获得所有20行或几个处理器获得一些行,所有这些行总共增加到20个。这非常类似于将ROWNUM与{{1}结合使用时所看到的行为}。

我尝试过的最有希望的解决方案是以下功能:

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) 错误,我现在明白这是一个交易问题。删除锁会导致函数返回行。

如何在保留锁定的同时从JDBC中获取多行代码?

1 个答案:

答案 0 :(得分:-1)

这不会奏效。您将pl / sql函数作为select语句的一部分进行调用,并尝试在该函数中启动事务。我认为错误很明显。