gpt4 book ai didi

sql - Oracle:如何限制 "select .. for update skip locked"中的行数

转载 作者:行者123 更新时间:2023-12-04 22:13:21 24 4
gpt4 key购买 nike

我有一张 table :

table foo{
bar number,
status varchar2(50)
}

我有多个线程/主机,每个线程/主机都在使用该表。每个线程更新状态,即悲观地锁定行。

在 Oracle 12.2 中。
select ... for update skip locked似乎可以完成这项工作,但我想限制行数。新款 FETCH NEXT听起来不错,但我无法正确使用语法:
SELECT * FROM foo ORDER BY bar 
OFFSET 20 ROWS FETCH NEXT 10 ROWS ONLY
FOR UPDATE SKIP LOCKED;

实现这一目标的最简单方法是什么,即使用最少的代码 1(理想情况下没有 pl/sql 函数)?

我想要这样的东西:
select * from (select * from foo 
where status<>'baz' order by bar
) where rownum<10 for update skip locked

聚苯乙烯
1. 我们正在考虑离开 oracle。

最佳答案

我建议创建 pl/sql 函数并使用动态 sql 来控制锁定记录的数量。在获取时间获取锁。所以获取 N 条记录会自动锁定它们。请记住,一旦完成事务 - 提交或回滚,记录就会解锁。
以下是锁定 N 条记录并将它们的 id 值作为数组返回的示例(假设您已在表中添加了主键 ID 列):

create or replace function get_next_unlocked_records(iLockSize number)
return sys.odcinumberlist
is
cRefCursor sys_refcursor;
aIds sys.odcinumberlist := sys.odcinumberlist();
begin
-- open cursor. No locks so far
open cRefCursor for
'select id from foo '||
'for update skip locked';

-- we fetch and lock at the same time
fetch cRefCursor bulk collect into aIds limit iLockSize;

-- close cursor
close cRefCursor;

-- return locked ID values,
-- lock is kept until the transaction is finished
return aIds;

end;
sys.odcinumberlist是内置的数字数组。

这是在数据库中运行的测试脚本:
declare 
aRes sys.odcinumberlist;
begin
aRes := get_next_unlocked_records(10);
for c in (
select column_value id
from table(aRes)
) loop
dbms_output.put_line(c.id);
end loop;
end;

关于sql - Oracle:如何限制 "select .. for update skip locked"中的行数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54766489/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com