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.