Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

DBA_LUCAS

Executar COMMIT automatico

Recommended Posts

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 ?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Grosso modo

 

DECLARE
 VN NUMBER := 0;
BEGIN
 FOR R IN (SELECT CAMPO1 FROM TABELA1)
 LOOP
   INSERT INTO TABELA2 VALUES (R.CAMPO1);
   VN := VN + 1;
   IF VN > 100 THEN
     VN := 0;
     COMMIT;
   END IF;
 END LOOP;
 COMMIT;
END;

Compartilhar este post


Link para o post
Compartilhar em outros sites

Primeiramente, muito obrigado!

 

Infelizmente, desta maneira nao poderia ser feito porque meu comando e

um insert into select que fica gravado em uma tabela para ser aplicado

posteriormente.

 

Ou seja, precisaria que no insert ja tivesse algo que implicasse que a

cada x registros inseridos, seria dado um commit automatico.

 

Tem alguma outra ideia ?

 

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 !!!

Compartilhar este post


Link para o post
Compartilhar em outros sites

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*//

Compartilhar este post


Link para o post
Compartilhar em outros sites

Se é um comando de BD poderia estar armazenado.

 

BEGIN SP_MEU_INSERT END

 

Criaria-se uma SP com este nome

 

CREATE OR REPLACE PROCEDURE SP_MEU_INSERT IS
 VN NUMBER := 0;
BEGIN
 FOR R IN (SELECT CAMPO1 FROM TABELA1)
 LOOP
   INSERT INTO TABELA2 VALUES (R.CAMPO1);
   VN := VN + 1;
   IF VN > 100 THEN
     VN := 0;
     COMMIT;
   END IF;
 END LOOP;
 COMMIT;
END;

 

Meio gambiarra mas funcionaria.

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.