L oop для удаления большого количества - PullRequest
0 голосов
/ 01 апреля 2020

Мне нужно как можно быстрее удалить 20 миллионов записей из 50 записей. Я попытался сделать эту работу, используя l oop ниже:

LOOP
  DELETE FROM dssoti.appt_purge WHERE to_date(substr(apntmt_dt,0,9)) < '01-JAN-17' AND ROWNUM < 200000;
  EXIT WHEN SQL%ROWCOUNT = 0;
  COMMIT;
END LOOP;

Но когда я выполняю это, он не l oop, он только удаляет 199,999 записей. Что я здесь не так делаю? Я работаю в oracle SQL версия разработчика 18

Ответы [ 2 ]

0 голосов
/ 08 апреля 2020

Моя проблема не включала begin и end до и после сценария

0 голосов
/ 01 апреля 2020

rownum = 200000 не менее 200 000, поэтому вы в конечном итоге удалили только 199 999 записей.

Вам необходимо использовать ROWNUM <= 200000 следующим образом:

Обновлен код для l oop выпуск

FOR I IN (SELECT trunc(count(1)/200000) +1 from dssoti.appt_purge 
   WHERE to_date(substr(apntmt_dt,0,9)) < '01-JAN-17')
LOOP
  DELETE FROM dssoti.appt_purge 
   WHERE to_date(substr(apntmt_dt,0,9)) < '01-JAN-17' AND ROWNUM <= 200000; -- change this
  --EXIT WHEN SQL%ROWCOUNT = 0;
  COMMIT;
END LOOP;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...