- Este tópico contém 6 respostas, 2 vozes e foi atualizado pela última vez 15 anos, 2 meses atrás por
DBA_LUCAS.
-
AutorPosts
-
6 de janeiro de 2011 às 10:40 pm #97576
DBA_LUCAS
ParticipanteCaros 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 ?
6 de janeiro de 2011 às 10:54 pm #97577Regis Araujo
ParticipanteFala 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..!
7 de janeiro de 2011 às 4:51 pm #97588DBA_LUCAS
ParticipanteNão intendi muito bem a ideia desse bulk insert , voce poderia me explicar ?
7 de janeiro de 2011 às 6:54 pm #97589DBA_LUCAS
ParticipanteNa 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 !!!
7 de janeiro de 2011 às 11:26 pm #97591DBA_LUCAS
ParticipanteVou 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//11 de janeiro de 2011 às 12:22 am #97618Regis Araujo
ParticipanteFala 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..!
11 de janeiro de 2011 às 2:29 pm #97625DBA_LUCAS
ParticipanteCara , 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 …
-
AutorPosts
- Você deve fazer login para responder a este tópico.