Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/68.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql Oracle:如何限制“选择..更新跳过锁定”中的行数_Sql_Oracle - Fatal编程技术网

Sql Oracle:如何限制“选择..更新跳过锁定”中的行数

Sql Oracle:如何限制“选择..更新跳过锁定”中的行数,sql,oracle,Sql,Oracle,我有一张桌子: table foo{ bar number, status varchar2(50) } 我有多个线程/主机,每个线程/主机使用表。每个线程更新状态,即悲观地锁定行 在oracle 12.2中 选择。。。对于更新,skip locked似乎可以完成这项工作,但我想限制行数。新的FETCH NEXT听起来不错,但语法不正确: SELECT * FROM foo ORDER BY bar OFFSET 20 ROWS FETCH NEXT 10 ROWS ONLY FO

我有一张桌子:

table foo{
  bar number,
  status varchar2(50)
}
我有多个线程/主机,每个线程/主机使用表。每个线程更新状态,即悲观地锁定行

在oracle 12.2中

选择。。。对于更新,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
PS
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是内置的数字数组

以下是要在db中运行的测试脚本:

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;

与java无关