簡體   English   中英

如何鎖定並從Oracle函數返回多行?

[英]How can I lock and return multiple rows from an Oracle function?

我一直在嘗試解決Oracle如何處理ROWNUMSELECT ... FOR UPDATE SKIP LOCKED同時嘗試返回未鎖定的幾行。 我嘗試了以下幾種解決方案: 強制Oracle使用SKIP LOCKED返回TOP N行 ,以及其他一些看起來與該問題非常相似的示例。 我知道Oracle AQ可能是對此的最佳解決方案,但是我們對數據庫的控制很少,我對此想法頗有抵觸。

我遇到的問題是嘗試使用JDBC將結果返回給Java。 我已經嘗試過setFetchSize(20) ,但是遇到了僅將前20行分配給客戶端的問題。 我通常看到一個處理代理程序獲得全部20行,或者幾個處理器獲得一些行,它們全部加起來為20。這非常類似於人們將ROWNUMSELECT ... FOR UPDATE SKIP LOCKED結合使用時看到的行為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錯誤ORA-14551: cannot perform a DML operation inside a query ,我現在知道這是事務問題。 刪除鎖會使該函數返回行。

如何在保留鎖的同時從該函數中獲取多行到JDBC?

這行不通。 您在select語句中調用pl / sql函數,然后嘗試在該函數中啟動事務。 我認為錯誤很明顯。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM