Valew Chiappa! Eu nao vi o erro apresentado pelo Oracle. Mas tenho certeza que o banco nao parou pq quem viu o erro nao teria como volta-lo rsrs Nao sei exatamento o que houver.
Vou seguir o conselho do Raul e do Eduardo Amaral em comitar a cada 1000 registros. Vamos ver o que acontece Em 12-07-2010 14:54, José Laurindo escreveu: > Oi, Samuel : primeiro de tudo, rigorosamente Não Existe isso de "o script > parar" quando redo log file enche : o que pode acontecer nesse sentido é , se > o banco est;a programado para arquivar/copiar os redo log files cheios > (archive mode) E não há espaço em disco não é a sessão, mas sim o banco > TODINHO que para - isso é Bem difícil de acontecer, mas o seu DBA é > Totalmente capaz de solucionar isso, uma mensagem BEM ESPECÍFICA é gerada no > alert do banco quando isso ocorre... COnsulte o seu DBA pra que isso seja > verificado. > Caso não seja esse o caso, aí pra mim o que está acontecendo é simples (e > esperada) ** LENTIDÃO ** por causa da (via de regra totalmente INAPROPRIADA) > programação e processamento uma iinha/registro por vez que vc está fazendo > (também conhecida como row-by-row, oo slow-by-slow, slow aqui por motivos > óbvios)... > Se vc quer performance máxima num SQL, dê os recursos necessários e deixa > o banco trabalhar : isso implicaria num primiro momento em acionar o DBA, > para que ele crie área de rollback/undo suficiente e (se adequado) ative > paralelismo e (se possível) desative eventuais triggers e índices (com > REBUILD em modo NOLOGGING posterior), E no segundo passo vc JOGA FORA esse > loop e faz o comando num UPDATE só, esse é o mantra, é o caminho, é a Melhor > Coisa quando vc quer máxima performance num SQL... > Dá uma pesquisada em http://asktom.oracle.com por SQL ROW BY ROW > PERFORMANCE que vc acha várias refs e dicas sobre isso... > > []s > > Chiappa > > > --- Em oracle_br@yahoogrupos.com.br, Samuel Corradi<corrad...@...> escreveu >> >> Ola pessoal! >> >> Tenho que faz update em um campo do tipo VARCHAR2. >> >> Para isso fiz um PL que abre um cursor e percorrer todas linhas >> alterando os valores. >> >> Agora, estou tendo um problema durante a atualizacao. Aparentemente, os >> redo logs enchem e o sript para. Nao sei dizer exatamente o que estah >> acontecendo, mas acredito que tenho que fazer um controle maior durante >> esse update. >> >> Alguem tem alguma sugestao do que pode estar acontecendo? Alguem jah >> passou por esse trabalho de atualizar muitos registros de uma tabela? >> >> Segue meu PL para referencia: >> >> ================================================ >> >> DECLARE >> CURSOR c1 IS select * from sadig.mod0046; >> flag BOOLEAN DEFAULT false; >> tamanho PLS_INTEGER DEFAULT 0; >> codigo VARCHAR2(45); >> nome VARCHAR2(85); >> BEGIN >> FOR registro IN C1 >> LOOP >> codigo := TRIM(SUBSTR(registro.f14, INSTR(registro.f14,'-',-1) >> + 2, >> LENGTH(registro.f14))); >> nome := TRIM(SUBSTR(registro.f14, 1, INSTR(registro.f14,'-',-1) >> - 2 )); >> UPDATE sadig.mod0046 SET f14=nome || '[' || codigo || ']' WHERE >> f1=registro.f1 and f6=registro.f6; >> END LOOP; >> END; >> >> ================================================= >> >> Obrigado! >> > > >