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


Responder a