如何从Oracle检索下一个n个未锁定的行?

时间:2015-06-23 04:15:34

标签: sql oracle

假设我有Oracle表books存储包含id列和title列的n个书籍信息。一些元组被SELECT ... FOR UPDATE子句锁定。

假设这些行((1,2,4,5,6,9)中的id被锁定。

现在我想编写一个SQL来实现它,在执行它时返回 next 2个已解锁的记录。并且SQL可以由多个进程同时调用。

也就是说,第一次调用将返回id = 3和id = 7的记录;第二个调用将返回id = 8和id = 10个记录。

我认为SELECT ... FOR UPDATE SKIP LOCKED会有所帮助,它会自动跳过锁定的行并同时解决多个进程调用问题。但是如何获得 next 2条记录?我认为rownum不起作用,因为我不知道哪些行被锁定了。

有人可以分享你的想法吗?非常感谢!

2 个答案:

答案 0 :(得分:1)

在12c中你可以使用row_limiting_clause,记录在这里:http://docs.oracle.com/database/121/SQLRF/statements_10002.htm#SQLRF01702

一般语法是:

[ OFFSET offset { ROW | ROWS } ]
[ FETCH { FIRST | NEXT } [ { rowcount | percent PERCENT } ]
    { ROW | ROWS } { ONLY | WITH TIES } ]

或者,使用此处记录的Oracle Streams Advanced Queuing API:http://docs.oracle.com/database/121/ADQUE/aq_opers.htm#ADQUE2835

答案 1 :(得分:0)

我没有oracle专家(或用户甚至;))但这可能有用吗? (如this answer中所述):

SELECT * FROM  MYTABLE FOR UPDATE SKIP LOCKED        
OFFSET 0 ROWS FETCH NEXT 1 ROWS ONLY