ver tablas multiple estadisticas ejemplos dinamico consultar columns 10g oracle oci

tablas - pivot oracle columns to rows



Cómo saber cuándo se actualizó una tabla de Oracle la última vez (10)

¿Puedo averiguar cuándo se realizó la última declaración INSERT, UPDATE o DELETE en una tabla en una base de datos Oracle y, de ser así, cómo?

Un pequeño trasfondo: la versión de Oracle es 10g. Tengo una aplicación por lotes que se ejecuta regularmente, lee datos de una sola tabla de Oracle y los escribe en un archivo. Me gustaría omitir esto si los datos no han cambiado desde la última vez que se ejecutó el trabajo.

La aplicación está escrita en C ++ y se comunica con Oracle a través de OCI. Se registra en Oracle con un usuario "normal", por lo que no puedo usar ningún administrador especial.

Editar: Bien, "Special Admin Stuff" no era exactamente una buena descripción. Lo que quiero decir es: no puedo hacer nada más que SELECCIONAR de tablas y llamar a procedimientos almacenados. Cambiar algo sobre la base de datos en sí (como agregar disparadores), lamentablemente no es una opción si quieres hacerlo antes de 2010.


¿Cuánto tiempo demora el proceso por lotes para escribir el archivo? Puede ser más fácil dejar que avance y luego comparar el archivo con una copia del archivo de la ejecución anterior para ver si son idénticos.



Debería agregar un desencadenador en insertar, actualizar, eliminar que establece un valor en otra tabla para sysdate.

Cuando ejecute la aplicación, leerá el valor y lo guardará en algún lugar para que la próxima vez que se ejecute tenga una referencia para comparar.

¿Considerarías ese "material especial de administración"?

Sería mejor describir lo que estás haciendo en realidad para obtener respuestas más claras.


Llego muy tarde a esta fiesta, pero así es como lo hice:

SELECT SCN_TO_TIMESTAMP(MAX(ora_rowscn)) from myTable;

Está lo suficientemente cerca para mis propósitos.


Oracle puede ver las tablas de cambios y, cuando se produce un cambio, puede ejecutar una función de devolución de llamada en PL / SQL u OCI. La devolución de llamada obtiene un objeto que es una colección de tablas que cambió, y que tiene una colección de rowid que cambió, y el tipo de acción, Ins, upd, del.

Entonces ni siquiera vas a la mesa, te sientas y esperas que te llamen. Solo irás si hay cambios para escribir.

Se llama Notificación de cambio de base de datos . Es mucho más simple que CDC como mencionó Justin, pero ambos requieren algunas cosas de administración sofisticadas. Lo bueno es que ninguno de estos requiere cambios en la APLICACIÓN.

La advertencia es que CDC está bien para tablas de alto volumen, DCN no lo es.


Por favor use la declaración a continuación

select * from all_objects ao where ao.OBJECT_TYPE = ''TABLE'' and ao.OWNER = ''YOUR_SCHEMA_NAME''


Pregúntele a su DBA acerca de la auditoría. Él puede comenzar una auditoría con un comando simple como:

AUDIT INSERT ON user.table

Luego puede consultar la tabla USER_AUDIT_OBJECT para determinar si ha habido una inserción en su tabla desde la última exportación.

google para la auditoría de Oracle para más información ...


Si alguien aún está buscando una respuesta, puede usar la función de notificación de cambio de la base de datos Oracle que viene con Oracle 10g. Requiere privilegio de sistema de CHANGE NOTIFICATION . Puede registrar oyentes cuando se activa una notificación de vuelta a la aplicación.


Dado que tiene 10g, podría utilizar la pseudocolumna ORA_ROWSCN . Eso le da un límite superior del último SCN (número de cambio del sistema) que causó un cambio en la fila. Como se trata de una secuencia creciente, puede almacenar el ORA_ROWSCN máximo que ha visto y luego buscar solo los datos con un SCN mayor que ese.

Por defecto, ORA_ROWSCN realidad se mantiene en el nivel de bloque, por lo que un cambio a cualquier fila en un bloque cambiará ORA_ROWSCN para todas las filas en el bloque. Esto probablemente sea suficiente si la intención es minimizar el número de filas que procesa varias veces sin cambios si hablamos de patrones de acceso a datos "normales". Puede reconstruir la tabla con ROWDEPENDENCIES que hará que se ORA_ROWSCN en el nivel de la fila, lo que le brinda más información granular pero requiere un esfuerzo de una sola vez para reconstruir la tabla.

Otra opción sería configurar algo así como Change Data Capture (CDC) y hacer que su aplicación OCI sea suscriptora de los cambios en la tabla, pero eso también requiere un esfuerzo por única vez para configurar CDC.


SELECT * FROM all_tab_modifications;