Oracle SQL: возможность запроса, сочетающего SELECT FOR UPDATE SKIP LOCKED с упорядочением и пределом rownum - PullRequest
2 голосов
/ 23 января 2020

Исходя из того, что я понимаю, ответ, в широком смысле, "нет", но вот проблема:

Мне нужно выполнить запрос, который должен сделать следующие вещи:

  1. Выберите строки в таблице, отсортированные по столбцу
  2. Из этих строк выберите и заблокируйте первую, пропуская другие заблокированные строки.

Пример запроса будет выглядеть примерно так это:

SELECT
    E.*
FROM
   polled_table E
WHERE 
    E.ID IN 
    (SELECT ID FROM
        (SELECT 
            ID
         FROM
            polled_table
         WHERE 
            condition = 'value'
         ORDER BY priority DESC)
     WHERE rownum < 2)
FOR UPDATE SKIP LOCKED;

Это, конечно, не работает в том смысле, что пропущенный блокированный по существу не работает, так как эта часть запроса только когда-либо видит одну строку.

Приведение «rownum <2» снаружи не представляется возможным (это вызывает ошибки, описанные, например, здесь: <em> ORA-00907 Отсутствует проблема с правой круглой скобкой - выберите по порядку с помощью внутреннего запроса вставки )

Я пробовал несколько комбинаций, но они либо не выполняют то, что я хочу, либо они прямо генерируют ошибки. Единственное, что может сработать, - это удалить условие rownum, но это заблокирует большое количество строк.

На данный момент, как я уже говорил, я думаю, что это будет сделано, а не как один запрос как минимум.

1 Ответ

1 голос
/ 23 января 2020

Если вы введете запрос sh в курсор, просто извлеките первую строку. Это должно выполнить sh эту задачу с заблокированным пропуском без изменений.

Что-то вроде (я не в своей БД, так что простите за любые незначительные синтаксические ошибки):

Cursor C is SELECT
    E.*
FROM
   polled_table E
WHERE
    E.ID IN
    (SELECT ID FROM
        (SELECT
            ID
         FROM
            polled_table
         WHERE
            condition = 'value'
         ORDER BY priority DESC))  for update skip locked;

var c%rowtype;

Open C
Fetch C into var;
close C;

Затем обработайте это первая строка извлечена в переменной VAR.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...