Can I find out when the last INSERT, UPDATE or DELETE statement was performed on a table in an Oracle database and if so, how?
A little background: The Oracle version is 10g. I have a batch application that runs regularly, reads data from a single Oracle table and writes it into a file. I would like to skip this if the data hasn’t changed since the last time the job ran.
The application is written in C++ and communicates with Oracle via OCI. It logs into Oracle with a ‘normal’ user, so I can’t use any special admin stuff.
Edit: Okay, ‘Special Admin Stuff’ wasn’t exactly a good description. What I mean is: I can’t do anything besides SELECTing from tables and calling stored procedures. Changing anything about the database itself (like adding triggers), is sadly not an option if want to get it done before 2010.
Since you are on 10g, you could potentially use the
ORA_ROWSCNpseudocolumn. That gives you an upper bound of the last SCN (system change number) that caused a change in the row. Since this is an increasing sequence, you could store off the maximumORA_ROWSCNthat you’ve seen and then look only for data with an SCN greater than that.By default,
ORA_ROWSCNis actually maintained at the block level, so a change to any row in a block will change theORA_ROWSCNfor all rows in the block. This is probably quite sufficient if the intention is to minimize the number of rows you process multiple times with no changes if we’re talking about ‘normal’ data access patterns. You can rebuild the table withROWDEPENDENCIESwhich will cause theORA_ROWSCNto be tracked at the row level, which gives you more granular information but requires a one-time effort to rebuild the table.Another option would be to configure something like Change Data Capture (CDC) and to make your OCI application a subscriber to changes to the table, but that also requires a one-time effort to configure CDC.