假设我有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不起作用,因为我不知道哪些行被锁定了。
有人可以分享你的想法吗?非常感谢!
答案 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