DBA_LUCAS 0 Denunciar post Postado Janeiro 6, 2011 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
Motta 645 Denunciar post Postado Janeiro 6, 2011 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
DBA_LUCAS 0 Denunciar post Postado Janeiro 7, 2011 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
Motta 645 Denunciar post Postado Janeiro 7, 2011 Creio que não dá, só via plsql mesmo. Compartilhar este post Link para o post Compartilhar em outros sites
caduribeiro13 0 Denunciar post Postado Janeiro 7, 2011 Veja se este forum lhe ajuda: http://forums.oracle.com/forums/thread.jspa?threadID=850946 Compartilhar este post Link para o post Compartilhar em outros sites
DBA_LUCAS 0 Denunciar post Postado Janeiro 7, 2011 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
supernoi 0 Denunciar post Postado Janeiro 7, 2011 Nao poderia fazer um Expdp do banco Y e um Impdp no banco X da tabela? :huh: Compartilhar este post Link para o post Compartilhar em outros sites
Motta 645 Denunciar post Postado Janeiro 7, 2011 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