Как мне понять были ли удаленны строки delet-ом или строки, которые нужно удалить закончились?

Как мне понять были ли удаленны строки delet-ом или строки, которые нужно удалить закончились. Если строки кончились и delete ничего не удалил, мне нужно выйти из цикла for

begin
for i in 1..100000
    loop
        delete from BpmsHistoricDetailEntityImpl where id in
        (select HD.id from BpmsHistoricDetailEntityImpl HD
        inner join BpmsHistoricProcessInstanceEntityImpl HPI on HD.processInstanceId = 
HPI.id
        where HPI.endTime is not null and HPI.endTime <= sysdate -${depth}
        fetch next ${batchSize} rows only);
        commit;
    end loop;
end;

Мне заранее не известно сколько select вернет строк и batchSize задается пользователем, поэтому, если строк для удаления больше не осталось мне нужно прервать for. Отдельно count искать не хочу, так как итераций может быть много и будут много раз выполняться запросы.

СУБД Oracle 12c.


Ответы (1 шт):

Автор решения: Sergey Bekmambetov
begin
    loop
        delete from BpmsHistoricDetailEntityImpl where id in
        (select HD.id from BpmsHistoricDetailEntityImpl HD
        inner join BpmsHistoricProcessInstanceEntityImpl HPI on 
HD.processInstanceId = HPI.id
        where HPI.endTime is not null and HPI.endTime <= sysdate -${depth}
        fetch next ${batchSize} rows only);
        EXIT WHEN sql%ROWCOUNT = 0;
        commit;
    end loop;
end;

 Сделал так, но может можно быстрее сделать? 10 миллионов записей удаляю, а batchSize размером со 100 тысяч. 100 раз выполняется в итоге данный запрос

→ Ссылка