Bonjour

Sous Oracle 11, sans utiliser de curseur, donc uniquement des SELECT.

Je récupére les rangées d'une table qui ne sont pas verrouillées, en les verrouillant toutes, ainsi :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
SELECT ROWNUM, ID FROM MaTable FOR UPDATE SKIP LOCKED ;
-- Avec un WHERE pour de vrai, évidemment.

Mais comment récupérer et surtout ne verrouiller que la première rangée ?

Pas de TOP 1 ou de LIMIT 1 comme sous Sql-server ou MySql... peut-être sous Oracle 12, mais non envisageable pour l'instant.

Un test sur ROWNUM ne va pas, parce que ROWNUM est incrémenté même pour les rangées "skippées".
Si la première est verrouillée, donc non listée, le premier ROWNUM retourné sera 2.

Et apparemment on ne peut pas mettre le FOR UPDATE ou le SKIP LOCKED dans une sous-requête du genre de celle-ci :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
SELECT ROWNUM,ID FROM MATABLE
WHERE ID = (SELECT MIN(ID) FROM MATABLE FOR UPDATE SKIP LOCKED)
FOR UPDATE SKIP LOCKED

Est-ce que vous auriez une idée pour y parvenir quand même ?

Merci !