[英]How can I lock and return multiple rows from an Oracle function?
我一直在嘗試解決Oracle如何處理ROWNUM
和SELECT ... FOR UPDATE SKIP LOCKED
同時嘗試返回未鎖定的幾行。 我嘗試了以下幾種解決方案: 強制Oracle使用SKIP LOCKED返回TOP N行 ,以及其他一些看起來與該問題非常相似的示例。 我知道Oracle AQ可能是對此的最佳解決方案,但是我們對數據庫的控制很少,我對此想法頗有抵觸。
我遇到的問題是嘗試使用JDBC將結果返回給Java。 我已經嘗試過setFetchSize(20)
,但是遇到了僅將前20行分配給客戶端的問題。 我通常看到一個處理代理程序獲得全部20行,或者幾個處理器獲得一些行,它們全部加起來為20。這非常類似於人們將ROWNUM
與SELECT ... 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.