Oracle - Ayuda en UPDATE

 
Vista:

Ayuda en UPDATE

Publicado por Edward (1 intervención) el 19/11/2009 21:59:34
Buenas, espero me puedan ayudar.... Explico un poco el problema que tengo:

Tengo un query para hacer un update, lo que hago es que en el FOR selecciono la cantidad de registros en total que quiero actualizar (que en total son 600220) y que cumplen con la condicion.

Luego asigno a las variables los valores deseados y despues es donde viene
el update que se queda super pegado y no hace nada! ...le coloque un AND ROWNUM < 5 y AND ROWNUM < 100 en el SELECT y funciono fino, actualizo
en la tabla la cantidad de registros, pero cuando coloco AND ROWNUM < 50000
se queda guindado y no hace nada, si no hace 50000 pos mucho menos 600220 registros.

La idea que yo pense es poner una especie de segmentacion dentro del UPDATE
o al principio de query que me vaya haciendo que se yo, de 1000 en 1000 hasta completar los registros pero no tengo idea de como hacerlo (en el caso de que se pueda hacer)

Aqui envio el query completo para ver si me pueden ayudar:

DECLARE

v_movil VARCHAR2(30);
v_imsi VARCHAR2(20);
v_tec VARCHAR2(60);

BEGIN

FOR i IN (SELECT id_uso, esn, campo3 FROM cmcdb.TEMP_BLACKBERRY WHERE
cdominio = 'r2_gsm') LOOP

v_movil:= i.id_uso;
v_imsi := i.esn;
v_tec := i.campo3;

update cmcdb.temp_blackberry z
set z.campo4 = 'PREPAGO',
z.campo5 = v_tec,
z.id_uso = v_movil
where z.cdominio = 'r1_gsm'
and z.esn = v_imsi;

END LOOP;
EXCEPTION

WHEN OTHERS Then
null;
END;
/
commit;
exit
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

RE:Ayuda en UPDATE

Publicado por JORGE SANCHEZ (186 intervenciones) el 25/11/2009 18:41:12
Revisa que la tabla cmcdb.temp_blackberry tenga indices por

where z.cdominio
and z.esn

ya que son las columnas que utilizas para el UPDATE

Por otro lado, pon un contador y has commit cada 5% del volumen total de la informacion (Mas o menos cada 30 mil registros)

update cmcdb.temp_blackberry z
set z.campo4 = 'PREPAGO',
z.campo5 = v_tec,
z.id_uso = v_movil
where z.cdominio = 'r1_gsm'
and z.esn = v_imsi;

vtotal number(20) := 0;

Dentro del FOR
vtotal := vtotal + 1;

Despues del update

if mod(vtotal , 30000 ) = 0 then
commit;
end if;

Y tu commit del final se queda
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar