Pular para o conteúdo

Fóruns SQL e PL/SQL bulk collect update limit bulk collect update limit

#93202
fsitja
Participante

    Se você realmente quer modificar 134 Bilhões de linhas, não faça com update. Forall mais update vai levar uma eternidade para concluir.

    Crie uma nova tabela já com os valores corretos, por meio de um “create table as select” (vulgo CTAS), de preferência usando direct-path insert (usando o hint /+APPEND/) e nologging para fazer o processo andar mais rápido. Depois renomeie a nova tabela com o nome da tabela antiga, recrie índices e constraints e drop na velha.

    Só para esclarecer o erro que você obteve, está trocado o local do índice do array. O correto seria algo como:


    v_arr(i).idlinha;

    Mesmo assim, se não estou enganado, ele vai dar um exception “PLS-00436: implementation restriction: cannot reference fields of BULK In-BIND table of records”. Para contornar teria que usar MULTISET e CAST no cursor, usando object types em vez de type no declare, e fazer um select INTO comum em vez de bulk collect.

    De qualquer forma, não se preocupe, essa solução com FORALL não é escalável para fazer um update dessa magnitude. Crie uma uma tabela nova que é o melhor caminho.