Neste Post http://dbaduarte.blogspot.com.br/2014/05/commit-cada-bloco-de-delete.html demonstrei como efetuar um DELETE em massa com COMMIT, porém há outra forma muito mais rápida, sendo eficiente para tabelas com milhares de registros.
O Desempenho da codificação do FORALL é extremamente mais veloz que um LOOP, pois a declaração é executada apenas uma vez para cada entrada da coleção.
No exemplo, a cada 1 Milhão de DELETES será feito um commit:
DECLARE
c_limit PLS_INTEGER := 1000000;
TYPE urowid_table IS TABLE OF UROWID INDEX BY BINARY_INTEGER;
rowids urowid_table;
CURSOR CUR IS
Select rowid from TABELA
where ID > 20;
BEGIN
OPEN CUR;
LOOP
FETCH CUR
BULK COLLECT INTO ROWIDS
LIMIT c_limit;
FORALL i in 1..ROWIDS.count
delete from TABELA
where ROWID = ROWIDS(i);
EXIT WHEN ROWIDS.COUNT = 0;
DBMS_OUTPUT.PUT_LINE(TO_CHAR(SQL%ROWCOUNT) || ' Linhas Deletadas');
COMMIT;
END LOOP;
CLOSE CUR;
END;
Valeu,
Bruno Duarte.
Bruno Duarte.
Parabéns pelo Blog, conteúdo muito interessante e resoluções muito práticas.
ResponderExcluirGiorgio muito obrigado pelo Feedback.
ExcluirTento fazer os meus posts de uma maneira bem fácil e explicativa.
Não estou conseguindo atualizar o blog, porque o local que trabalho atualmente o blogger é bloqueado, porém vou pegar um dia para fazer novas publicações - estou com muitas coisas legais.
Valeu,
Bruno Duarte.