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 :
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 :
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 !
Partager