Pular para o conteúdo
Visualizando 4 posts - 1 até 4 (de 4 do total)
  • Autor
    Posts
  • #107363
    Avatar de C-S-RC-S-R
    Participante

      Boa tarde,

      Existe uma carga de dados que le todos os registros de uma tabela e transfere para outra.

      Hoje esta assim: for x in (select..) loop

      Porém esta demorando 2 horas para excutar.

      Pensei em usar o forall. É a melhor maneira?

      No for all estou com um problema que não consigo chamar a procedure que faz os insert.

      CREATE OR REPLACE PROCEDURE TESTE_FORALL IS
      TYPE TOBJECTTABLE IS TABLE OF TABELA%ROWTYPE;
      T TOBJECTTABLE;
      BEGIN
      SELECT * BULK COLLECT INTO T FROM TABELA;
      FORALL X IN T.FIRST..T.LAST
      TESTE_INSERT(T(X).COLUNA1, T(X).COLUNA2, T(X).COLUNA3); -- ISSO É UMA PROCEDURE QUE FAZ O INSERT
      END;
      /

      At
      Cesar Moraes

      #107364
      Avatar de rmanrman
      Participante

        @C-S-R

        Detalhe importante é onde será feito o COMMIT. É interessante que seja feito a cada X registros.

        #107365
        Avatar de C-S-RC-S-R
        Participante

          @rman

          Os commits são feitos após o bloco.

          Tentei resolver com um Merge, mas merge não faz insert em outra tabela.
          Seria uma solução linda maaass. 🙁 🙁

          Alguma ideia alguém.

          To pensando em fazer 2 forall

          1 para as atualizações e outro para os inserts e colocar tOdas as validações da proc no próprio select.

          O problema disso é que vai demorar o dobro do tempo

          #107366
          Avatar de rmanrman
          Participante

            @C-S-R

            É feito apenas 1 COMMIT? Se a carga for muito grande você poderia ter problemas no UNDO.

            Em relação ao MERGE é o mesmo problema. Mas o MERGE faz INSERT/UPDATE.

          Visualizando 4 posts - 1 até 4 (de 4 do total)
          • Você deve fazer login para responder a este tópico.
          plugins premium WordPress