Pular para o conteúdo
Visualizando 7 posts - 1 até 7 (de 7 do total)
  • Autor
    Posts
  • #97576
    DBA_LUCAS
    Participante

      Caros amigos,

      Estou com um problema que preciso resolver, estou precisando executar uma query com muitas linhas , porem eu preciso que seja feito um commit de tantas em tantas linhas.

      exemplo:

      Vou executar um insert apartir de um select , digamos que este select ira retornar 15000 linhas que serao inseridas , porem eu quero que de 3000 em 3000 linhas seja executado um commit.

      Alguem tem ideia de como eu faço isso ?

      #97577
      Avatar photoRegis Araujo
      Participante

        Fala Lucas, boa tarde..!

        Seguinte.. da uma pesquisada sobre BULK COLLECTION..

        Este processo pode ser agilizado fazendo BULK INSERT..!!

        Assim vc não vai precisar ficar fazendo COMMIT de X em X.. !!

        Da uma lida neste artigo do Leonardo Litz..!

        http://imasters.com.br/artigo/12960/ora … no_oracle/

        Abraços..!

        #97588
        DBA_LUCAS
        Participante

          Não intendi muito bem a ideia desse bulk insert , voce poderia me explicar ?

          #97589
          DBA_LUCAS
          Participante

            Na verdade ele ira inserir tudo de uma vez so ,mas no caso de ser uma inserção de 1 milhao de registros , pode estourar o segmento de rollback , entao queria saber se tem alguma forma do oracle ir commitando internamente , mas na interação com o usuario o insert sera feito de uma vez soh !!!

            #97591
            DBA_LUCAS
            Participante

              Vou tentar explicar melhor o que eu estou querendo:

              Eu vou ter dois bancos distintos X e Y, executar um insert em uma tabela no banco X , mas esse insert é atraves de um select no banco Y.

              ex: Insert into TABELAX (COD,NOME,CPF)
              values (SELECT COD,NOME,CPF from TABELAY)

              so que eu não vou fazer isso atraves de procedure , por isso nao posso ter loop , meu insert esta armazenado em uma tabela no banco y em um campo do tipo varchar(4000) ou texto …

              ai eu irei acionar essa tabela para que ela execute o insert na TABELAX fazendo um select na TABELAY , levando em consideração que estamos em bancos distintos.
              So que assim que eu acionar a tabela que ira fazer a inserção essa inserção pode ser de 1 milhao de registros , e para não estourar meu segmento de rollback precisava que o oracle commitasse internamente de x em x registros…

              o que eu vi uma vez foi algo parecido com este exemplo abaixo , mas eu não me lembro qual foi a clausula colocada pela dba que me mostrou isso na epoca:

              ex: Insert into TABELAX (COD,NOME,CPF)
              values (SELECT COD,NOME,CPF from TABELAY)
              where commit XXX and XXX ;//Alguma clausula que ira commitar de x em x//

              #97618
              Avatar photoRegis Araujo
              Participante

                Fala Lucas..!!

                Então..!! O Bulk Collection tem uma opção para vc fazer COMMIT de X em X..

                Ex..

                cMAXIMOCOMMIT CONSTANT NUMBER(7) := 100000;
                ...
                FETCH C1 BULK COLLECT INTO TABELA_AUX LIMIT cMAXIMOCOMMIT;
                ...

                Onde quando chegar ao valor informado, ele da COMMIT e continua o processo COMMITANDO a cada o limit especificado até o seu termino..!!

                Onde o ganho em tempo e performance com BULK é imensamente melhor..!!!

                De uma lida mais profunda sobre isto.. vc vai gostar..!

                Abraços..!

                #97625
                DBA_LUCAS
                Participante

                  Cara , muito obrigado , vai me ajudar bastante !! So mais uma coisa , tem como voce me falar um pouco dele(bulk collection) e como ele funciona , so pra eu saber sobre o que procurar … tipo aonde eu declaro a variavel e etc …

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