-- Ejemplo de Uso de FlashBack Query -- Para ello se debe crear una tabla con la siguiente estructura -- es simplemente para las pruebas create table b (campo1 number); Table created. --Se le insertan datos y se procede a la ejecución del procedimiento adjunto --Código de la "Máquina del tiempo": PROMPT Datos para realizar el FlashBack PROMPT ____________________________________________________ PROMPT PROMPT --Se consulta por pantalla el rango de la TimeMachine , hasta cuanto hacía atrás vamos --a recorrer sus cambios ACCEPT var_horas PROMPT 'Ingrese cantidad de horas : ' ACCEPT var_minutos PROMPT 'Ingrese cantidad de minutos : ' ACCEPT var_segundos PROMPT 'Ingrese cantidad de segundos : ' set ver off set feed off set arraysize 5000 set maxdata 500 set term off spool l.txt declare --Se crear un cursor en donde se retornan las filas que son iguales entre la tabla --actual y la tabla con un FlashBack Query , hace tantas horas,minutos y segundos --según se hayan ingresado. --Un join hecho a través del ROWID y la llave para verifiar que son exactamente las --mismas filas filas y no borrados e inserciones de la misma fila cursor c1 is select b.rowid rowid_ahora, b.campo1 valor_ahora, bf.campo1 valor_antes from b , b as of timestamp sysdate - (1/24* &var_horas + 1/24/60* &var_minutos + 1/24/60/60* &var_segundos ) bf where b.rowid = bf.rowid and b.campo1 = bf.campo1 ; --Se crear un cursor en donde se retornan las filas que tienen igual rowid pero distinto --valor en el campo1 , con lo cual se esta indicando implicitamente que fue una modificación cursor c2 is select b.rowid rowid_ahora, b.campo1 valor_ahora, bf.campo1 valor_antes from b , b as of timestamp sysdate - (1/24* &var_horas + 1/24/60* &var_minutos + 1/24/60/60* &var_segundos ) bf where b.rowid = bf.rowid and b.campo1 <> bf.campo1 ; --Se crear un cursor en donde se retornan las filas que están en la tabla b --pero que no se encuentran en la consulta FlashBack de la misma tabla, por ende --estamos hablando de una inserción cursor c3 is select b.rowid row_id from b minus select b.rowid row_id from b as of timestamp sysdate - (1/24* &var_horas + 1/24/60* &var_minutos + 1/24/60/60* &var_segundos ) b ; --Se crear un cursor en donde se retornan las filas que están en la consulta --FlashBack de la misma tabla pero que no se encuentran en la tabla b , por ende --estamos hablando de una eliminación cursor c4 is select b.rowid row_id from b as of timestamp sysdate - (1/24* &var_horas + 1/24/60* &var_minutos + 1/24/60/60* &var_segundos ) b minus select b.rowid row_id from b ; var_campo1 b.campo1%type; var_contador number; begin dbms_output.put_line('Comparación de datos desde entre el : '|| to_char(sysdate - (1/24* &var_horas + 1/24/60* &var_minutos + 1/24/60/60* &var_segundos ), 'dd/mm/yyyy hh24:mi:ss') || ' y '||to_char(sysdate, 'dd/mm/yyyy hh24:mi:ss')); dbms_output.put_line('====================================================='); dbms_output.put_line(chr(11)); dbms_output.put_line(chr(11)); var_contador := 0; dbms_output.put_line('Campos que permanecen iguales'); dbms_output.put_line('============================='); for c1_aux in c1 loop dbms_output.put_line('Tabla B , Campo1 : '||c1_aux.valor_ahora); var_contador := var_contador + 1; end loop; dbms_output.put_line('Total registros : '||var_contador); dbms_output.put_line(chr(11)); dbms_output.put_line(chr(11)); dbms_output.put_line('Campo actualizados'); dbms_output.put_line('======================='); var_contador := 0; for c2_aux in c2 loop dbms_output.put_line('Tabla B , Campo1 valor antiguo : '||c2_aux.valor_antes ||' , valor nuevo : '||c2_aux.valor_ahora); var_contador := var_contador + 1; end loop; dbms_output.put_line('Total registros : '||var_contador); dbms_output.put_line(chr(11)); dbms_output.put_line(chr(11)); dbms_output.put_line('Campo insertados'); dbms_output.put_line('=================='); var_contador := 0; for c3_aux in c3 loop select campo1 into var_campo1 from b where rowid = c3_aux.row_id ; dbms_output.put_line('Tabla B , Campo1 valor insertado : '||var_campo1); var_contador := var_contador + 1; end loop; dbms_output.put_line('Total registros : '||var_contador); dbms_output.put_line(chr(11)); dbms_output.put_line(chr(11)); dbms_output.put_line('Campo borrados'); dbms_output.put_line('=================='); var_contador := 0; for c4_aux in c4 loop select campo1 into var_campo1 from b as of timestamp sysdate - 1/12 where rowid = c4_aux.row_id ; dbms_output.put_line('Tabla B , Campo1 Valor borrado : '||var_campo1); var_contador := var_contador + 1; end loop; dbms_output.put_line('Total registros : '||var_contador); exception when others then dbms_output.put_line('No existe registro de FlashBack al : '|| to_char(sysdate - (1/24* &var_horas + 1/24/60* &var_minutos + 1/24/60/60* &var_segundos ) , 'dd/mm/yyyy hh24:mi:ss')); end; / spool off set ver on set feed on set term on ed l.txt