ДЛЯ ОБНОВЛЕНИЯ Пропустить заблокирован с ROWNUM на ORACLE 12C - PullRequest
0 голосов
/ 31 августа 2018

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

SELECT ID_MESSAGE
FROM TB_STAGE_IN S 
WHERE S.CD_STATUS = 0 
AND S.ID_JOB_SCHEDULE IS NULL 
AND ROWNUM <= 10000 
FOR UPDATE SKIP LOCKED; 

Работает нормально, но потоки не достигают максимум 10000 строк. Это как:

  • Тема 1: 5000
  • Тема 2: 3000
  • Тема 2: 2000

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

Я пытался использовать ТОЛЬКО FETCH FIRST 10000 ROWS, но я получаю сообщение ниже: ORA-02014: невозможно выбрать FOR UPDATE из вида с помощью DISTINCT, GROUP BY и т. Д.

Не могли бы вы все, пожалуйста, помогите мне?

Спасибо за добро.

1 Ответ

0 голосов
/ 01 ноября 2018

Спросите, у Тома есть предложение , которое выглядит так

open C;  -- cursor C is select ... for update skip locked;

loop
  fetch C bulk collect into :my_array limit 100;
  append :my_array to :to_be_processed_array;
  exit when c%notfound or :to_be_processed_array.count >= 10000;
end loop;

-- process any rows in :to_be_processed_array

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