Cursor PL/SQL que pega una marca de una tabla a otra

De Wiki Oxtli
Saltar a: navegación, buscar

Este es un cursor de PL/SQL para Oracle donde se actualiza un campo de una tabla a traves de un cursor.

Ventajas:

  • Se tiene control de la actualización registro a registro
  • Se puede aplicar los cambios de manera gradual (se aplica commit cada 500 mil registros) que optimiza el uso de logs de sistema, bueno para bases de datos grandes.

Desventajas

  • No se aprovechan las características de paralelismo que la base de datos podría ocupar para el caso de un update o un merge.


set    SERVEROUTPUT on SIZE 3000
declare
cursor c1 is
select t1.ROWID ROW_ID, campo_recuperado
  from tabla_para_actualizar t1, 
       tabla_orogen_dato_nuevo t2
 where t1.llave_id = T2.llave_id;
v_cont number :=0; 
t1 integer; 
t2 integer;
v_key  varchar2(18):='X';
BEGIN
t1 := dbms_utility.get_time;
commit;
for r1 in c1 loop    
       UPDATE tabla_para_actualizar 
       SET    campo_actualizar = R1.campo_recuperado
        where rowid = r1.row_id;    
       if sql%found = true then v_cont := v_cont + sql%rowcount;
       end if;
       if mod(c1%rowcount,500000) = 0 then         
          commit;
       end if;    
end loop;
commit;
t2 := dbms_utility.get_time;
dbms_output.put_line (chr(10) || '-- Tiempo:       '||to_char( ((t2-t1)/100/60), '999,999.9' ) || ' minutos' );
dbms_output.put_line ('-- Actualizados: '||to_char(v_cont,'999,999,999'));
END; 
/