patternMinor
Oracle flashback query syntax - all tables to same timestamp
Viewed 0 times
tablessameallquerysyntaxtimestampflashbackoracle
Problem
I'm not finding a lot of examples online of how to use Oracle Flashback Query and I'm hoping somebody can clarify syntax. I'm trying to execute a query with a large number of tables in it, but the syntax seems to require me to specify a timestamp for every single table involved in the query.
For example, the following query gets me consistent data, but it requires me to specify a timestamp for each table:
The following example (which is how most examples online look) gives past data for table1, but joined to current data from table2 - they don't line up:
Since I have a large number of tables, I'm hoping for a way I can execute the entire query against a flashback timestamp - something like this:
Anybody know if this is possible, or if the current syntax doesn't allow it? I'm using 11.2 if it matters, but nothing I see online suggests that this has changed in 12.
For example, the following query gets me consistent data, but it requires me to specify a timestamp for each table:
select t1.Field1, t2.Field2
from table1 as of timestamp to_timestamp('2016-11-01 02:00:00','yyyy-mm-dd hh24:mi:ss') t1
join table2 as of timestamp to_timestamp(2016-11-01 02:00:00','yyyy-mm-dd hh24:mi:ss') t2
on t1.somekey = t2.somekeyThe following example (which is how most examples online look) gives past data for table1, but joined to current data from table2 - they don't line up:
select t1.Field1, t2.Field2
from table1 as of timestamp to_timestamp('2016-11-01 02:00:00','yyyy-mm-dd hh24:mi:ss') t1
join table2 t2
on t1.somekey = t2.somekeySince I have a large number of tables, I'm hoping for a way I can execute the entire query against a flashback timestamp - something like this:
select (as of timestamp to_timestamp('2016-11-01 02:00:00','yyyy-mm-dd hh24:mi:ss'))
t1.Field1, t2.Field2
from table1 t1
join table2 t2
on t1.somekey = t2.somekeyAnybody know if this is possible, or if the current syntax doesn't allow it? I'm using 11.2 if it matters, but nothing I see online suggests that this has changed in 12.
Solution
Look at the DBMS_FLASHBACK package and the ENABLE_AT_TIME procedure (12.1 Documentation). This allows you to do something like the following:
The session will then run all queries as of the SCN most closely matching the provided timestamp.
To stop doing flashback queries as of the set timestamp, simply disable it.
execute DBMS_FLASHBACK.Enable_At_Time(TIMESTAMP '2016-11-01 02:00:00');The session will then run all queries as of the SCN most closely matching the provided timestamp.
SELECT t1.Field1, t2.Field2
FROM table1 t1
JOIN table2 t2 ON t1.somekey = t2.somekeyTo stop doing flashback queries as of the set timestamp, simply disable it.
execute DBMS_FLASHBACK.Disable;Code Snippets
execute DBMS_FLASHBACK.Enable_At_Time(TIMESTAMP '2016-11-01 02:00:00');SELECT t1.Field1, t2.Field2
FROM table1 t1
JOIN table2 t2 ON t1.somekey = t2.somekeyexecute DBMS_FLASHBACK.Disable;Context
StackExchange Database Administrators Q#153916, answer score: 5
Revisions (0)
No revisions yet.