{"id":545,"date":"2013-01-03T03:34:39","date_gmt":"2013-01-03T02:34:39","guid":{"rendered":"http:\/\/www.salvis.com\/blog\/?p=545"},"modified":"2023-11-08T20:05:23","modified_gmt":"2023-11-08T19:05:23","slug":"loading-historical-data-into-flashback-archive-enabled-tables","status":"publish","type":"post","link":"https:\/\/www.salvis.com\/blog\/2013\/01\/03\/loading-historical-data-into-flashback-archive-enabled-tables\/","title":{"rendered":"Loading Historical Data Into Flashback Archive Enabled Tables"},"content":{"rendered":"\n<p>Oracle provides via <a title=\"OTN\" href=\"http:\/\/www.oracle.com\/technetwork\/indexes\/samplecode\/plsql-sample-522110.html\" rel=\"nofollow\">OTN<\/a> an import solution for FBA (Flashback Data Archive also known as Total Recall). The solution extends the SCN to TIMESTAMP mapping plus provides a wrapper to existing APIs to populate the history. However, issues like using a customized mapping period\/precision or ORA-1466 when using the AS OF TIMESTAMP clause are not addressed. I show in this post how to load historical data into flashback archive-enabled tables using the standard API. Unfortunately, there are still some experimental actions necessary to get a fully functional result, at least with version 11.2.0.3.4.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Test Scenario<\/h3>\n\n\n\n<p>There are various reasons why you may want to load historical data into a FBA enable table. E.g. for testing purposes, to move FBA-enabled tables from one database instance to another or to migrate conventionally historized tables. This example is based on a migration scenario. Table T1 has the following content and shall be migrated to FBA. You find the script to create and populate the table T1 <a href=\"\/\/www.salvis.com\/blog\/wp-content\/uploads\/2013\/01\/fba_t1_setup.sql_.txt\">here<\/a>.<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#D4D4D4;--cbp-line-number-width:calc(2 * 0.6 * .875rem);--cbp-line-highlight-color:rgba(234, 191, 191, 0.2);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#2b2b2b;color:#c7c7c7\">Table T1<\/span><span role=\"button\" tabindex=\"0\" data-code=\"SQL&gt; SELECT * FROM t1;\n\nVID OID CREATED_AT          OUTDATED_AT         C1 C2\n--- --- ------------------- ------------------- -- --\n  1   1 2012-12-19 13:00:57 2012-12-21 08:31:01 A  A1\n  2   1 2012-12-21 08:31:01 2012-12-23 20:58:05 A  A2\n  3   1 2012-12-23 20:58:05 2012-12-27 11:40:41 A  A3\n  4   1 2012-12-27 11:40:41 9999-12-31 23:59:59 A  A4\n  5   2 2012-12-20 13:51:55 9999-12-31 23:59:59 B  B1\n  6   4 2012-12-22 11:03:22 2012-12-23 19:36:08 C  C1\n  7   4 2012-12-28 14:25:50 2012-12-30 17:10:39 C  C1\n  8   4 2012-12-30 17:10:39 2012-12-31 12:05:40 C  C2\" style=\"color:#D4D4D4;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki dark-plus\" style=\"background-color: #1E1E1E\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #D4D4D4\">SQL&gt; SELECT * FROM t1;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\"><\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">VID OID CREATED_AT          OUTDATED_AT         C1 C2<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">--- --- ------------------- ------------------- -- --<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  1   1 2012-12-19 13:00:57 2012-12-21 08:31:01 A  A1<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  2   1 2012-12-21 08:31:01 2012-12-23 20:58:05 A  A2<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  3   1 2012-12-23 20:58:05 2012-12-27 11:40:41 A  A3<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  4   1 2012-12-27 11:40:41 9999-12-31 23:59:59 A  A4<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  5   2 2012-12-20 13:51:55 9999-12-31 23:59:59 B  B1<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #D4D4D4\">  6   4 2012-12-22 11:03:22 2012-12-23 19:36:08 C  C1<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  7   4 2012-12-28 14:25:50 2012-12-30 17:10:39 C  C1<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  8   4 2012-12-30 17:10:39 2012-12-31 12:05:40 C  C2<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<p>The column VID is the version identifier and the primary key. OID is the object identifier, which is unique at every point in time. CREATED_AT and OUTDATED_AT define the interval boundaries. Column C1 and C2 are the payload columns, which may change over time.<\/p>\n\n\n\n<p>The following queries return data valid at 2012-12-23 19:36:08&nbsp;and now.<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#D4D4D4;--cbp-line-number-width:calc(2 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#2b2b2b;color:#c7c7c7\">Point in Time Queries for T1<\/span><span role=\"button\" tabindex=\"0\" data-code=\"SQL&gt; SELECT * FROM t1\n  2   WHERE created_at <= TIMESTAMP '2012-12-23 19:36:08'\n  3     AND outdated_at &gt; TIMESTAMP '2012-12-23 19:36:08';\n\nVID OID CREATED_AT          OUTDATED_AT         C1 C2\n--- --- ------------------- ------------------- -- --\n  2   1 2012-12-21 08:31:01 2012-12-23 20:58:05 A  A2\n  5   2 2012-12-20 13:51:55 9999-12-31 23:59:59 B  B1\n\nSQL&gt; SELECT * FROM t1 WHERE outdated_at &gt; SYSDATE;\n\nVID OID CREATED_AT          OUTDATED_AT         C1 C2\n--- --- ------------------- ------------------- -- --\n  4   1 2012-12-27 11:40:41 9999-12-31 23:59:59 A  A4\n  5   2 2012-12-20 13:51:55 9999-12-31 23:59:59 B  B1\" style=\"color:#D4D4D4;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki dark-plus\" style=\"background-color: #1E1E1E\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #D4D4D4\">SQL&gt; SELECT * FROM t1<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  2   WHERE created_at &lt;= TIMESTAMP &#39;2012-12-23 19:36:08&#39;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  3     AND outdated_at &gt; TIMESTAMP &#39;2012-12-23 19:36:08&#39;;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\"><\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">VID OID CREATED_AT          OUTDATED_AT         C1 C2<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">--- --- ------------------- ------------------- -- --<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  2   1 2012-12-21 08:31:01 2012-12-23 20:58:05 A  A2<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  5   2 2012-12-20 13:51:55 9999-12-31 23:59:59 B  B1<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\"><\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">SQL&gt; SELECT * FROM t1 WHERE outdated_at &gt; SYSDATE;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\"><\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">VID OID CREATED_AT          OUTDATED_AT         C1 C2<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">--- --- ------------------- ------------------- -- --<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  4   1 2012-12-27 11:40:41 9999-12-31 23:59:59 A  A4<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  5   2 2012-12-20 13:51:55 9999-12-31 23:59:59 B  B1<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<p>It&#8217;s important to notice that OID 4 (see highlighted line above) is not part of the first query result, since OUTDATED_AT has an excluding semantic. I mention this fact because the column ENDSCN in the table SYS_FBA_HIST_&lt;object_id&gt; uses also an excluding semantic, which simplifies the migration process, at least in this area.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">From <a href=\"http:\/\/en.wikipedia.org\/wiki\/Coordinated_Universal_Time\">UTC<\/a>&nbsp;to <a href=\"http:\/\/docs.oracle.com\/cd\/E11882_01\/server.112\/e25789\/transact.htm#autoId6\">SCN<\/a><\/h3>\n\n\n\n<p>Oracle uses its own time standard SCN for FBA. The SCN is initialized during database creation and is valid for a single Oracle instance, even if synchronization mechanisms among database instances exist (see also <a href=\"https:\/\/support.oracle.com\/epmos\/faces\/DocContentDisplay?id=1376995.1\">MOS note 1376995.1<\/a>). An SCN may not represent a date-time value before 1988-01-01 00:00:00. The time spent between two SCNs is varying, it may be shorter when the database instance is executing a lot of transactions and it may be longer in more idle times or when the database instance is shut down. Oracle uses the table SYS.SMON_SCN_TIME to map SCN to TIMESTAMPs and vice versa and provides the functions SCN_TO_TIMESTAMP and TIMESTAMP_TO_SCN for that purpose.<\/p>\n\n\n\n<p>So what is the first date-time value which may be converted into an SCN?<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#D4D4D4;--cbp-line-number-width:calc(2 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#2b2b2b;color:#c7c7c7\">Min. Values in SMON_SCN_TIME<\/span><span role=\"button\" tabindex=\"0\" data-code=\"SQL&gt; SELECT MIN(time_dp) AS min_time_dp,\n  2         MIN(scn) AS min_scn,\n  3         CAST(scn_to_timestamp(MIN(scn)) AS DATE) AS min_scn_to_ts,\n  4         MAX(dbtimezone) AS dbtimezone,\n  5         sessiontimezone\n  6    FROM sys.smon_scn_time;\n\nMIN_TIME_DP            MIN_SCN MIN_SCN_TO_TS       DBTIMEZONE SESSIONTIMEZONE\n------------------- ---------- ------------------- ---------- ---------------\n2010-09-05 22:40:05      18669 2010-09-06 00:40:05 +00:00     +01:00\" style=\"color:#D4D4D4;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki dark-plus\" style=\"background-color: #1E1E1E\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #D4D4D4\">SQL&gt; SELECT MIN(time_dp) AS min_time_dp,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  2         MIN(scn) AS min_scn,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  3         CAST(scn_to_timestamp(MIN(scn)) AS DATE) AS min_scn_to_ts,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  4         MAX(dbtimezone) AS dbtimezone,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  5         sessiontimezone<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  6    FROM sys.smon_scn_time;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\"><\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">MIN_TIME_DP            MIN_SCN MIN_SCN_TO_TS       DBTIMEZONE SESSIONTIMEZONE<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">------------------- ---------- ------------------- ---------- ---------------<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">2010-09-05 22:40:05      18669 2010-09-06 00:40:05 +00:00     +01:00<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<p>The first value is 2010-09-06 00:40:05. You may notice the two-hour difference to MIN_TIME_DP. Oracle stores the date values in this table in UTC (DBTIMEZONE) and my database server&#8217;s time zone is CET (Central European Time) which is UTC+01:00 at the point of query (see SESSIONTIMEZONE). However, in September daylight saving time was active and back then CET was UTC+02:00. That explains the two-hour difference.<\/p>\n\n\n\n<p>Let&#8217;s test the boundary values.<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#D4D4D4;--cbp-line-number-width:calc(2 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#2b2b2b;color:#c7c7c7\">TIMESTAMP_TO_SCN<\/span><span role=\"button\" tabindex=\"0\" data-code=\"SQL&gt; SELECT timestamp_to_scn(TIMESTAMP '2010-09-06 00:40:05') AS SCN FROM dual;\n\n       SCN\n----------\n     18669\n\nSQL&gt; SELECT timestamp_to_scn(TIMESTAMP '2010-09-06 00:40:04') AS SCN FROM dual;\nSELECT timestamp_to_scn(TIMESTAMP '2010-09-06 00:40:04') AS SCN FROM dual\n       *\nERROR at line 1:\nORA-08180: no snapshot found based on specified time\nORA-06512: at &quot;SYS.TIMESTAMP_TO_SCN&quot;, line 1\" style=\"color:#D4D4D4;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki dark-plus\" style=\"background-color: #1E1E1E\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #D4D4D4\">SQL&gt; SELECT timestamp_to_scn(TIMESTAMP &#39;2010-09-06 00:40:05&#39;) AS SCN FROM dual;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\"><\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">       SCN<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">----------<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">     18669<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\"><\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">SQL&gt; SELECT timestamp_to_scn(TIMESTAMP &#39;2010-09-06 00:40:04&#39;) AS SCN FROM dual;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">SELECT timestamp_to_scn(TIMESTAMP &#39;2010-09-06 00:40:04&#39;) AS SCN FROM dual<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">       *<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">ERROR at line 1:<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">ORA-08180: no snapshot found based on specified time<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">ORA-06512: at &quot;SYS.TIMESTAMP_TO_SCN&quot;, line 1<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<p>As expected&nbsp;2010-09-06 00:40:05 works and&nbsp;2010-09-06 00:40:04 raises an ORA-8180 error.<\/p>\n\n\n\n<p>I expect that you get completely different values in your database since the SMON process deletes &#8220;old&#8221; values in SYS.SMON_SCN_TIME based on UNDO and FBA configuration. Since this table is solely used for timestamp-to-SCN conversion I assume it is safe to extend it manually. In fact, the PL\/SQL package DBMS_FDA_MAPPINGS provided by Oracle is exactly doing that but distributes the remaining SCNs between 1988-01-01 and the MIN(time_dp) in&nbsp;SYS.SMON_SCN_TIME uniformly. In my case there are only 18868 SCNs remaining to be assigned to timestamps before 2010-09-06 00:40:05. So if I know that I won&#8217;t need timestamps to be mapped to SCN let&#8217;s say before 2010-01-01 I may use the remaining values to improve the precision of timestamp to SCN mappings for this reduced period.<\/p>\n\n\n\n<p>In my case, I do not need to extend the mapping in&nbsp;SYS.SMON_SCN_TIME, but here is an example of how it can be done:<br \/><a name=\"extend_smon_scn_time_1\"><\/a><\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#D4D4D4;--cbp-line-number-width:calc(2 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#2b2b2b;color:#c7c7c7\">Extend SMON_SCN_TIME (1)<\/span><span role=\"button\" tabindex=\"0\" data-code=\"SQL&gt; INSERT INTO smon_scn_time (\n  2     thread,\n  3     orig_thread,\n  4     time_mp,\n  5     time_dp,\n  6     scn_wrp,\n  7     scn_bas,\n  8     scn,\n  9     num_mappings\n 10  )\n 11  SELECT 0 AS thread,\n 12         0 AS orig_thread,\n 13         (\n 14            CAST(\n 15               to_timestamp_tz(\n 16                  '2010-09-06 00:40:04 CET',\n 17                  'YYYY-MM-DD HH24:MI:SS TZR'\n 18               ) AT TIME ZONE 'UTC' AS DATE\n 19            ) - DATE '1970-01-01'\n 20         ) * 60 * 60 * 24 AS time_mp,\n 21         CAST(\n 22            to_timestamp_tz(\n 23               '2010-09-06 00:40:04 CET',\n 24               'YYYY-MM-DD HH24:MI:SS TZR'\n 25            ) at TIME ZONE 'UTC' AS DATE\n 26         ) AS time_dp,\n 27         FLOOR((MIN(scn) - 1) \/ POWER(2, 32)) AS scn_wrp,\n 28         MOD(MIN(scn) - 1, POWER(2, 32)) AS scn_bas,\n 29         MIN(scn) - 1 AS scn,\n 30         0 AS num_mappings\n 31    FROM sys.smon_scn_time;\n\n1 row created.\n\nSQL&gt; SELECT timestamp_to_scn(TIMESTAMP '2010-09-06 00:40:04') AS scn FROM dual;\n\n       SCN\n----------\n     18668\" style=\"color:#D4D4D4;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki dark-plus\" style=\"background-color: #1E1E1E\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #D4D4D4\">SQL&gt; INSERT INTO smon_scn_time (<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  2     thread,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  3     orig_thread,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  4     time_mp,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  5     time_dp,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  6     scn_wrp,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  7     scn_bas,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  8     scn,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  9     num_mappings<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\"> 10  )<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\"> 11  SELECT 0 AS thread,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\"> 12         0 AS orig_thread,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\"> 13         (<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\"> 14            CAST(<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\"> 15               to_timestamp_tz(<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\"> 16                  &#39;2010-09-06 00:40:04 CET&#39;,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\"> 17                  &#39;YYYY-MM-DD HH24:MI:SS TZR&#39;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\"> 18               ) AT TIME ZONE &#39;UTC&#39; AS DATE<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\"> 19            ) - DATE &#39;1970-01-01&#39;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\"> 20         ) * 60 * 60 * 24 AS time_mp,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\"> 21         CAST(<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\"> 22            to_timestamp_tz(<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\"> 23               &#39;2010-09-06 00:40:04 CET&#39;,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\"> 24               &#39;YYYY-MM-DD HH24:MI:SS TZR&#39;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\"> 25            ) at TIME ZONE &#39;UTC&#39; AS DATE<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\"> 26         ) AS time_dp,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\"> 27         FLOOR((MIN(scn) - 1) \/ POWER(2, 32)) AS scn_wrp,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\"> 28         MOD(MIN(scn) - 1, POWER(2, 32)) AS scn_bas,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\"> 29         MIN(scn) - 1 AS scn,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\"> 30         0 AS num_mappings<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\"> 31    FROM sys.smon_scn_time;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\"><\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">1 row created.<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\"><\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">SQL&gt; SELECT timestamp_to_scn(TIMESTAMP &#39;2010-09-06 00:40:04&#39;) AS scn FROM dual;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\"><\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">       SCN<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">----------<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">     18668<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<p>TIME_MP is the number of seconds since 1970-01-01. TIME_DP is the date value of TIME_MP. The calculation of these columns includes time zone conversion from CET to UTC which makes it a bit verbose. SCN_WRAP counts the number of times SCN_BASE has reached its 32-bit value maximum of&nbsp;4294967295.<\/p>\n\n\n\n<p>Alternatively, you may simply extend the&nbsp;SYS.SMON_SCN_TIME based on SYS.V$LOG_HISTORY.<br \/><a name=\"extend_smon_scn_time_2\"><\/a><\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#D4D4D4;--cbp-line-number-width:calc(2 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#2b2b2b;color:#c7c7c7\">Extend SMON_SCN_TIME (2)<\/span><span role=\"button\" tabindex=\"0\" data-code=\"INSERT INTO smon_scn_time\n   (thread,\n    orig_thread,\n    time_mp,\n    time_dp,\n    scn_wrp,\n    scn_bas,\n    scn,\n    num_mappings)\n   SELECT 0 AS thread,\n          0 AS orig_thread,\n          (first_time - DATE '1970-01-01') * 60 * 60 * 24 AS time_mp,\n          first_time AS time_dp,\n          floor(first_change# \/ power(2, 32)) AS scn_wrp,\n          MOD(first_change#, power(2, 32)) AS scn_bas,\n          first_change# AS scn,\n          0 AS num_mappings\n     FROM v$log_history\n    WHERE first_time < (SELECT MIN(time_dp)\n                          FROM smon_scn_time);\" style=\"color:#D4D4D4;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki dark-plus\" style=\"background-color: #1E1E1E\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #D4D4D4\">INSERT INTO smon_scn_time<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">   (thread,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    orig_thread,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    time_mp,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    time_dp,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    scn_wrp,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    scn_bas,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    scn,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    num_mappings)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">   SELECT 0 AS thread,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">          0 AS orig_thread,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">          (first_time - DATE &#39;1970-01-01&#39;) * 60 * 60 * 24 AS time_mp,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">          first_time AS time_dp,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">          floor(first_change# \/ power(2, 32)) AS scn_wrp,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">          MOD(first_change#, power(2, 32)) AS scn_bas,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">          first_change# AS scn,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">          0 AS num_mappings<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">     FROM v$log_history<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    WHERE first_time &lt; (SELECT MIN(time_dp)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">                          FROM smon_scn_time);<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<p>BTW: The TIMESTAMP_TO_SCN function uses its own kind of result cache. You may need to restart the database if you undo changes in SYS.SMON_SCN_TIME.<\/p>\n\n\n\n<p>Next, we should check if the mapping from timestamp to SCN is precise enough, which means an SCN should not be used by multiple timestamps. Here&#8217;s the query for T1:<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#D4D4D4;--cbp-line-number-width:calc(2 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#2b2b2b;color:#c7c7c7\">Check TIMESTAMP_TO_SCN Precision<\/span><span role=\"button\" tabindex=\"0\" data-code=\"SQL&gt; SELECT COUNT(DISTINCT ts) AS cnt_ts,\n  2         COUNT(DISTINCT timestamp_to_scn(ts)) AS cnt_ts_to_scn\n  3    FROM (SELECT created_at ts FROM t1\n  4          UNION\n  5          SELECT outdated_at FROM t1\n  6          MINUS\n  7          SELECT TIMESTAMP '9999-12-31 23:59:59' FROM dual);\n\n    CNT_TS CNT_TS_TO_SCN\n---------- -------------\n        10            10\" style=\"color:#D4D4D4;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki dark-plus\" style=\"background-color: #1E1E1E\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #D4D4D4\">SQL&gt; SELECT COUNT(DISTINCT ts) AS cnt_ts,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  2         COUNT(DISTINCT timestamp_to_scn(ts)) AS cnt_ts_to_scn<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  3    FROM (SELECT created_at ts FROM t1<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  4          UNION<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  5          SELECT outdated_at FROM t1<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  6          MINUS<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  7          SELECT TIMESTAMP &#39;9999-12-31 23:59:59&#39; FROM dual);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\"><\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    CNT_TS CNT_TS_TO_SCN<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">---------- -------------<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        10            10<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<p>T1 is ready to be migrated to a FBA-enabled table if CNT_TS and CNT_TS_TO_SCN are equal. If the values are different you have two options. a) amend T1 (e.g. change timestamps or merge intervals) or b) amend SYS.SMON_SCN_TIME as explained above.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Migration<\/h3>\n\n\n\n<p>The following script creates a flashback archive and the FBA-enabled table T2. At the end, a small PL\/SQL block is executed to create views for the 3 SYS_FBA_&#8230;_&lt;object_id&gt; tables.<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#D4D4D4;--cbp-line-number-width:calc(2 * 0.6 * .875rem);--cbp-line-highlight-color:rgba(234, 191, 191, 0.2);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#2b2b2b;color:#c7c7c7\">Create Table T2<\/span><span role=\"button\" tabindex=\"0\" data-code=\"-- create FBA\nCREATE FLASHBACK ARCHIVE fba TABLESPACE USERS QUOTA 10M RETENTION 10 YEAR;\n\n-- create FBA enabled table t2\nCREATE TABLE t2 (\n   oid         NUMBER(4,0)  NOT NULL PRIMARY KEY,\n   c1          VARCHAR2(10) NOT NULL,\n   c2          VARCHAR2(10) NOT NULL\n) FLASHBACK ARCHIVE fba;\n\n-- enforce visibility of SYS_FBA tables\nBEGIN\n   dbms_flashback_archive.disassociate_fba(owner_name =&gt; USER, table_name =&gt; 'T2');\n   dbms_flashback_archive.reassociate_fba(owner_name =&gt; USER, table_name =&gt; 'T2');\nEND;\n\/\n\n-- create views on SYS_FBA tables\nDECLARE\n   PROCEDURE create_view(in_view_name  IN VARCHAR2,\n                         in_table_name IN VARCHAR2) IS\n   BEGIN\n      EXECUTE IMMEDIATE 'CREATE OR REPLACE VIEW ' || in_view_name ||\n                        ' AS SELECT * FROM ' || in_table_name;\n   END create_view;\nBEGIN\n   FOR l_rec IN (SELECT object_id\n                   FROM user_objects\n                  WHERE object_name = 'T2')\n   LOOP\n      create_view('T2_DDL_COLMAP','SYS_FBA_DDL_COLMAP_' || l_rec.object_id);\n      create_view('T2_HIST', 'SYS_FBA_HIST_' || l_rec.object_id);\n      create_view('T2_TCRV', 'SYS_FBA_TCRV_' || l_rec.object_id);\n   END LOOP;\nEND;\n\/\" style=\"color:#D4D4D4;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki dark-plus\" style=\"background-color: #1E1E1E\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #6A9955\">-- create FBA<\/span><\/span>\n<span class=\"line\"><span style=\"color: #569CD6\">CREATE<\/span><span style=\"color: #D4D4D4\"> FLASHBACK ARCHIVE fba <\/span><span style=\"color: #569CD6\">TABLESPACE<\/span><span style=\"color: #D4D4D4\"> USERS QUOTA 10M RETENTION <\/span><span style=\"color: #B5CEA8\">10<\/span><span style=\"color: #D4D4D4\"> YEAR;<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\">-- create FBA enabled table t2<\/span><\/span>\n<span class=\"line\"><span style=\"color: #569CD6\">CREATE<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">TABLE<\/span><span style=\"color: #D4D4D4\"> t2 (<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">   oid         <\/span><span style=\"color: #569CD6\">NUMBER<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #B5CEA8\">4<\/span><span style=\"color: #D4D4D4\">,<\/span><span style=\"color: #B5CEA8\">0<\/span><span style=\"color: #D4D4D4\">)  <\/span><span style=\"color: #569CD6\">NOT<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">NULL<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">PRIMARY KEY<\/span><span style=\"color: #D4D4D4\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">   c1          <\/span><span style=\"color: #569CD6\">VARCHAR2<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #B5CEA8\">10<\/span><span style=\"color: #D4D4D4\">) <\/span><span style=\"color: #569CD6\">NOT<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">NULL<\/span><span style=\"color: #D4D4D4\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">   c2          <\/span><span style=\"color: #569CD6\">VARCHAR2<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #B5CEA8\">10<\/span><span style=\"color: #D4D4D4\">) <\/span><span style=\"color: #569CD6\">NOT<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">NULL<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">) FLASHBACK ARCHIVE fba;<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #6A9955\">-- enforce visibility of SYS_FBA tables<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #569CD6\">BEGIN<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #D4D4D4\">   <\/span><span style=\"color: #DCDCAA\">dbms_flashback_archive.<\/span><span style=\"color: #4EC9B0\">disassociate_fba<\/span><span style=\"color: #D4D4D4\">(owner_name =&gt; <\/span><span style=\"color: #DCDCAA\">USER<\/span><span style=\"color: #D4D4D4\">, table_name =&gt; <\/span><span style=\"color: #CE9178\">&#39;T2&#39;<\/span><span style=\"color: #D4D4D4\">);<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #D4D4D4\">   <\/span><span style=\"color: #DCDCAA\">dbms_flashback_archive.<\/span><span style=\"color: #4EC9B0\">reassociate_fba<\/span><span style=\"color: #D4D4D4\">(owner_name =&gt; <\/span><span style=\"color: #DCDCAA\">USER<\/span><span style=\"color: #D4D4D4\">, table_name =&gt; <\/span><span style=\"color: #CE9178\">&#39;T2&#39;<\/span><span style=\"color: #D4D4D4\">);<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #569CD6\">END<\/span><span style=\"color: #D4D4D4\">;<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #D4D4D4\">\/<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\">-- create views on SYS_FBA tables<\/span><\/span>\n<span class=\"line\"><span style=\"color: #569CD6\">DECLARE<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">   <\/span><span style=\"color: #569CD6\">PROCEDURE<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #DCDCAA\">create_view<\/span><span style=\"color: #D4D4D4\">(in_view_name  <\/span><span style=\"color: #569CD6\">IN<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">VARCHAR2<\/span><span style=\"color: #D4D4D4\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">                         in_table_name <\/span><span style=\"color: #569CD6\">IN<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">VARCHAR2<\/span><span style=\"color: #D4D4D4\">) <\/span><span style=\"color: #569CD6\">IS<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">   <\/span><span style=\"color: #569CD6\">BEGIN<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      <\/span><span style=\"color: #DCDCAA\">EXECUTE IMMEDIATE<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #CE9178\">&#39;CREATE OR REPLACE VIEW &#39;<\/span><span style=\"color: #D4D4D4\"> || in_view_name ||<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">                        <\/span><span style=\"color: #CE9178\">&#39; AS SELECT * FROM &#39;<\/span><span style=\"color: #D4D4D4\"> || in_table_name;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">   <\/span><span style=\"color: #569CD6\">END<\/span><span style=\"color: #D4D4D4\"> create_view;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #569CD6\">BEGIN<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">   <\/span><span style=\"color: #C586C0\">FOR<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #9CDCFE\">l_rec<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">IN<\/span><span style=\"color: #D4D4D4\"> (<\/span><span style=\"color: #569CD6\">SELECT<\/span><span style=\"color: #D4D4D4\"> object_id<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">                   <\/span><span style=\"color: #569CD6\">FROM<\/span><span style=\"color: #D4D4D4\"> user_objects<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">                  <\/span><span style=\"color: #569CD6\">WHERE<\/span><span style=\"color: #D4D4D4\"> object_name = <\/span><span style=\"color: #CE9178\">&#39;T2&#39;<\/span><span style=\"color: #D4D4D4\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">   <\/span><span style=\"color: #C586C0\">LOOP<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      create_view(<\/span><span style=\"color: #CE9178\">&#39;T2_DDL_COLMAP&#39;<\/span><span style=\"color: #D4D4D4\">,<\/span><span style=\"color: #CE9178\">&#39;SYS_FBA_DDL_COLMAP_&#39;<\/span><span style=\"color: #D4D4D4\"> || <\/span><span style=\"color: #9CDCFE\">l_rec<\/span><span style=\"color: #D4D4D4\">.object_id);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      create_view(<\/span><span style=\"color: #CE9178\">&#39;T2_HIST&#39;<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #CE9178\">&#39;SYS_FBA_HIST_&#39;<\/span><span style=\"color: #D4D4D4\"> || <\/span><span style=\"color: #9CDCFE\">l_rec<\/span><span style=\"color: #D4D4D4\">.object_id);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      create_view(<\/span><span style=\"color: #CE9178\">&#39;T2_TCRV&#39;<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #CE9178\">&#39;SYS_FBA_TCRV_&#39;<\/span><span style=\"color: #D4D4D4\"> || <\/span><span style=\"color: #9CDCFE\">l_rec<\/span><span style=\"color: #D4D4D4\">.object_id);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">   <\/span><span style=\"color: #C586C0\">END LOOP<\/span><span style=\"color: #D4D4D4\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #569CD6\">END<\/span><span style=\"color: #D4D4D4\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">\/<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<p>Flashback Query (since Oracle9i) and Flashback Data Archive (since Oracle 11g) are tightly coupled. The SYS_FBA_&#8230;&lt;object_id&gt; tables are created and delayed by the FBDA background process. DML and querying table T2 is possible anyway with the help of UNDO and Flashback Query. The highlighted lines show the PL\/SQL block to enforce the creation of the SYS_FBA&#8230;&lt;object_id&gt; tables. This step is necessary to create the views T2_DDL_COLMAP, T2_HIST and T2_TCRV. These views simplify the access to the underlying tables in my SQL scripts.<\/p>\n\n\n\n<p>The next script copies data from table T1 to T2. Basically, that&#8217;s what the PL\/SQL package DBMS_FDA_IMPORT provided by Oracle does.<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#D4D4D4;--cbp-line-number-width:calc(2 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#2b2b2b;color:#c7c7c7\">Migration<\/span><span role=\"button\" tabindex=\"0\" data-code=\"-- migrate current rows\nINSERT INTO t2 (OID, c1, c2)\n   SELECT OID, c1, c2\n     FROM t1\n    WHERE outdated_at &gt; SYSDATE;\nCOMMIT;\n\n-- enable DML on FBA tables\nBEGIN\n   dbms_flashback_archive.disassociate_fba(owner_name =&gt; USER, table_name =&gt; 'T2');\nEND;\n\/\n\n-- migrate T1 rows into T2\nINSERT INTO t2_hist (RID, STARTSCN, ENDSCN, XID, OPERATION, OID, C1, C2)\n-- outdated INSERTs (simulating INSERT\/DELETE logic)\nSELECT NULL AS rid,\n       timestamp_to_scn(created_at) AS startscn,\n       timestamp_to_scn(outdated_at) AS endscn,\n       NULL AS XID,\n       'I' AS operation,\n       OID,\n       c1,\n       c2\n  FROM t1\n WHERE outdated_at < SYSDATE\n-- current INSERTs (workaround for ORA-55622 on insert into T2_TRCV)\nUNION ALL\nSELECT t2.rowid AS rid,\n       timestamp_to_scn(t1.created_at) AS startscn,\n       h.startscn AS endscn,\n       NULL AS XID,\n       'I' AS operation,\n       t2.OID,\n       t2.c1,\n       t2.c2\n  FROM t1 t1\n INNER JOIN t2\n    ON t2.oid = t1.oid\n INNER JOIN t2_tcrv h\n    ON h.RID = t2.rowid\n WHERE t1.outdated_at &gt; SYSDATE;\n\nCOMMIT;\n\n-- disable DML on FBA tables\nBEGIN\n   dbms_flashback_archive.reassociate_fba(owner_name =&gt; USER, table_name =&gt; 't2');\nEND;\n\/\" style=\"color:#D4D4D4;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki dark-plus\" style=\"background-color: #1E1E1E\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #6A9955\">-- migrate current rows<\/span><\/span>\n<span class=\"line\"><span style=\"color: #569CD6\">INSERT<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">INTO<\/span><span style=\"color: #D4D4D4\"> t2 (OID, c1, c2)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">   <\/span><span style=\"color: #569CD6\">SELECT<\/span><span style=\"color: #D4D4D4\"> OID, c1, c2<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">     <\/span><span style=\"color: #569CD6\">FROM<\/span><span style=\"color: #D4D4D4\"> t1<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #569CD6\">WHERE<\/span><span style=\"color: #D4D4D4\"> outdated_at &gt; <\/span><span style=\"color: #DCDCAA\">SYSDATE<\/span><span style=\"color: #D4D4D4\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #DCDCAA\">COMMIT<\/span><span style=\"color: #D4D4D4\">;<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\">-- enable DML on FBA tables<\/span><\/span>\n<span class=\"line\"><span style=\"color: #569CD6\">BEGIN<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">   <\/span><span style=\"color: #DCDCAA\">dbms_flashback_archive.<\/span><span style=\"color: #4EC9B0\">disassociate_fba<\/span><span style=\"color: #D4D4D4\">(owner_name =&gt; <\/span><span style=\"color: #DCDCAA\">USER<\/span><span style=\"color: #D4D4D4\">, table_name =&gt; <\/span><span style=\"color: #CE9178\">&#39;T2&#39;<\/span><span style=\"color: #D4D4D4\">);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #569CD6\">END<\/span><span style=\"color: #D4D4D4\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">\/<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\">-- migrate T1 rows into T2<\/span><\/span>\n<span class=\"line\"><span style=\"color: #569CD6\">INSERT<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">INTO<\/span><span style=\"color: #D4D4D4\"> t2_hist (RID, STARTSCN, ENDSCN, XID, OPERATION, OID, C1, C2)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\">-- outdated INSERTs (simulating INSERT\/DELETE logic)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #569CD6\">SELECT<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">NULL<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">AS<\/span><span style=\"color: #D4D4D4\"> rid,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">       <\/span><span style=\"color: #DCDCAA\">timestamp_to_scn<\/span><span style=\"color: #D4D4D4\">(created_at) <\/span><span style=\"color: #569CD6\">AS<\/span><span style=\"color: #D4D4D4\"> startscn,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">       <\/span><span style=\"color: #DCDCAA\">timestamp_to_scn<\/span><span style=\"color: #D4D4D4\">(outdated_at) <\/span><span style=\"color: #569CD6\">AS<\/span><span style=\"color: #D4D4D4\"> endscn,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">       <\/span><span style=\"color: #569CD6\">NULL<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">AS<\/span><span style=\"color: #D4D4D4\"> XID,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">       <\/span><span style=\"color: #CE9178\">&#39;I&#39;<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">AS<\/span><span style=\"color: #D4D4D4\"> operation,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">       OID,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">       c1,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">       c2<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #569CD6\">FROM<\/span><span style=\"color: #D4D4D4\"> t1<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">WHERE<\/span><span style=\"color: #D4D4D4\"> outdated_at &lt; <\/span><span style=\"color: #DCDCAA\">SYSDATE<\/span><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\">-- current INSERTs (workaround for ORA-55622 on insert into T2_TRCV)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #569CD6\">UNION<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">ALL<\/span><\/span>\n<span class=\"line\"><span style=\"color: #569CD6\">SELECT<\/span><span style=\"color: #D4D4D4\"> t2.<\/span><span style=\"color: #569CD6\">rowid<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">AS<\/span><span style=\"color: #D4D4D4\"> rid,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">       <\/span><span style=\"color: #DCDCAA\">timestamp_to_scn<\/span><span style=\"color: #D4D4D4\">(t1.created_at) <\/span><span style=\"color: #569CD6\">AS<\/span><span style=\"color: #D4D4D4\"> startscn,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">       h.startscn <\/span><span style=\"color: #569CD6\">AS<\/span><span style=\"color: #D4D4D4\"> endscn,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">       <\/span><span style=\"color: #569CD6\">NULL<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">AS<\/span><span style=\"color: #D4D4D4\"> XID,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">       <\/span><span style=\"color: #CE9178\">&#39;I&#39;<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">AS<\/span><span style=\"color: #D4D4D4\"> operation,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">       t2.OID,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">       t2.c1,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">       t2.c2<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #569CD6\">FROM<\/span><span style=\"color: #D4D4D4\"> t1 t1<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\"> INNER <\/span><span style=\"color: #569CD6\">JOIN<\/span><span style=\"color: #D4D4D4\"> t2<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #569CD6\">ON<\/span><span style=\"color: #D4D4D4\"> t2.oid = t1.oid<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\"> INNER <\/span><span style=\"color: #569CD6\">JOIN<\/span><span style=\"color: #D4D4D4\"> t2_tcrv h<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #569CD6\">ON<\/span><span style=\"color: #D4D4D4\"> h.RID = t2.<\/span><span style=\"color: #569CD6\">rowid<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">WHERE<\/span><span style=\"color: #D4D4D4\"> t1.outdated_at &gt; <\/span><span style=\"color: #DCDCAA\">SYSDATE<\/span><span style=\"color: #D4D4D4\">;<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #DCDCAA\">COMMIT<\/span><span style=\"color: #D4D4D4\">;<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\">-- disable DML on FBA tables<\/span><\/span>\n<span class=\"line\"><span style=\"color: #569CD6\">BEGIN<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">   <\/span><span style=\"color: #DCDCAA\">dbms_flashback_archive.<\/span><span style=\"color: #4EC9B0\">reassociate_fba<\/span><span style=\"color: #D4D4D4\">(owner_name =&gt; <\/span><span style=\"color: #DCDCAA\">USER<\/span><span style=\"color: #D4D4D4\">, table_name =&gt; <\/span><span style=\"color: #CE9178\">&#39;t2&#39;<\/span><span style=\"color: #D4D4D4\">);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #569CD6\">END<\/span><span style=\"color: #D4D4D4\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">\/<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<p>The following queries return data valid at 2012-12-23 19:36:08&nbsp;and now (as for T1 above).<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#D4D4D4;--cbp-line-number-width:calc(2 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#2b2b2b;color:#c7c7c7\">Point in Time Queries for T2<\/span><span role=\"button\" tabindex=\"0\" data-code=\"SQL&gt; SELECT * FROM t2 AS OF SCN timestamp_to_scn(TIMESTAMP '2012-12-23 19:36:08');\n\nOID C1 C2\n--- -- --\n  1 A  A2\n  2 B  B1\n\nSQL&gt; SELECT * FROM t2;\n\nOID C1 C2\n--- -- --\n  1 A  A4\n  2 B  B1\" style=\"color:#D4D4D4;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki dark-plus\" style=\"background-color: #1E1E1E\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #D4D4D4\">SQL&gt; SELECT * FROM t2 AS OF SCN timestamp_to_scn(TIMESTAMP &#39;2012-12-23 19:36:08&#39;);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\"><\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">OID C1 C2<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">--- -- --<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  1 A  A2<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  2 B  B1<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\"><\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">SQL&gt; SELECT * FROM t2;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\"><\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">OID C1 C2<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">--- -- --<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  1 A  A4<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  2 B  B1<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<p>As you see the results are identical with the ones of T1.&nbsp;The script <a href=\"\/\/www.salvis.com\/blog\/wp-content\/uploads\/2013\/01\/fba_as_of_compare_t1_and_t2.sql_.txt\">here<\/a>&nbsp;compares the result for every single point in time in T1 with T2. I&#8217;ve run it without detecting differences.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Migration Issue 1 &#8211; ORA-1466 When Using AS OF TIMESTAMP Clause<\/h3>\n\n\n\n<p>In the examples above I avoided the use of the AS OF TIMESTAMP clause and used the AS OF SCN clause instead. The reason becomes apparent when executing the following query:<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#D4D4D4;--cbp-line-number-width:calc(1 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#2b2b2b;color:#c7c7c7\">ORA-1466<\/span><span role=\"button\" tabindex=\"0\" data-code=\"SQL&gt; SELECT * FROM t2 AS OF TIMESTAMP TIMESTAMP '2012-12-23 19:36:08';\nSELECT * FROM t2 AS OF TIMESTAMP TIMESTAMP '2012-12-23 19:36:08'\n              *\nERROR at line 1:\nORA-01466: unable to read data - table definition has changed\" style=\"color:#D4D4D4;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki dark-plus\" style=\"background-color: #1E1E1E\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #D4D4D4\">SQL&gt; SELECT * FROM t2 AS OF TIMESTAMP TIMESTAMP &#39;2012-12-23 19:36:08&#39;;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">SELECT * FROM t2 AS OF TIMESTAMP TIMESTAMP &#39;2012-12-23 19:36:08&#39;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">              *<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">ERROR at line 1:<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">ORA-01466: unable to read data - table definition has changed<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<p>Ok, we have not changed the table definition, but was the table definition for T2 valid on 2012-12-23 19:36:08?<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#D4D4D4;--cbp-line-number-width:calc(2 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#2b2b2b;color:#c7c7c7\">Validity of DDL_COLMAP<\/span><span role=\"button\" tabindex=\"0\" data-code=\"SQL&gt; SELECT column_name,\n  2         startscn,\n  3         endscn,\n  4         CAST(scn_to_timestamp(startscn) AS DATE) AS start_ts\n  5    FROM t2_ddl_colmap;\n\nCOLUMN_NAME       STARTSCN     ENDSCN START_TS\n----------- -------------- ---------- -------------------\nOID           161382016632            2013-01-03 00:17:42\nC1            161382016632            2013-01-03 00:17:42\nC2            161382016632            2013-01-03 00:17:42\" style=\"color:#D4D4D4;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki dark-plus\" style=\"background-color: #1E1E1E\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #D4D4D4\">SQL&gt; SELECT column_name,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  2         startscn,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  3         endscn,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  4         CAST(scn_to_timestamp(startscn) AS DATE) AS start_ts<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  5    FROM t2_ddl_colmap;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\"><\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">COLUMN_NAME       STARTSCN     ENDSCN START_TS<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">----------- -------------- ---------- -------------------<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">OID           161382016632            2013-01-03 00:17:42<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">C1            161382016632            2013-01-03 00:17:42<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">C2            161382016632            2013-01-03 00:17:42<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<p>Since I created the table on 2013-01-03 00:17:42 Oracle assumes that no columns exist before this point in time. However, the AS OF SCN clause is not that picky.<\/p>\n\n\n\n<p>To fix the problem we need to update T2_DDL_COLMAP but unfortunately DBMS_FLASHBACK_ARCHIVE.DISASSOCIATE_FBA&nbsp;does not allow us to change the content of the DDL_COLMAP directly (it is possible indirectly by altering the HIST table, but this is not helpful in this case).<\/p>\n\n\n\n<p>I&#8217;ve written a PL\/SQL package&nbsp;<a href=\"\/\/www.salvis.com\/blog\/wp-content\/uploads\/2013\/01\/tvd_fba_helper.sql_.txt\">TVD_FBA_HELPER<\/a> which updates SYS.TAB$ behind the scenes to overcome this restriction. Please consult Oracle Support on how to proceed if you plan to use it in productive environments. The package is provided as is and of course, you are using it at your own risk.<\/p>\n\n\n\n<p>Here is the script to fix the validity of the DDL_COLMAP:<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#D4D4D4;--cbp-line-number-width:calc(2 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#2b2b2b;color:#c7c7c7\">Fix Validity of DDL_COLMAP<\/span><span role=\"button\" tabindex=\"0\" data-code=\"-- enable DML FBA table\nBEGIN\n   tvd_fba_helper.disassociate_col_map(in_owner_name =&gt; USER, in_table_name =&gt; 'T2');\nEND;\n\/\n\n-- enforce ddl colmap consistentcy (valid for first entries)\nUPDATE t2_ddl_colmap\n   SET startscn =\n       (SELECT MIN(startscn)\n          FROM t2_hist);\nCOMMIT;\n\n-- disable DML an FBA tables\nBEGIN\n   tvd_fba_helper.reassociate_col_map(in_owner_name =&gt; USER, in_table_name =&gt; 'T2');\nEND;\n\/\" style=\"color:#D4D4D4;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki dark-plus\" style=\"background-color: #1E1E1E\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #6A9955\">-- enable DML FBA table<\/span><\/span>\n<span class=\"line\"><span style=\"color: #569CD6\">BEGIN<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">   tvd_fba_helper.disassociate_col_map(in_owner_name =&gt; <\/span><span style=\"color: #DCDCAA\">USER<\/span><span style=\"color: #D4D4D4\">, in_table_name =&gt; <\/span><span style=\"color: #CE9178\">&#39;T2&#39;<\/span><span style=\"color: #D4D4D4\">);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #569CD6\">END<\/span><span style=\"color: #D4D4D4\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">\/<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\">-- enforce ddl colmap consistentcy (valid for first entries)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #569CD6\">UPDATE<\/span><span style=\"color: #D4D4D4\"> t2_ddl_colmap<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">   <\/span><span style=\"color: #569CD6\">SET<\/span><span style=\"color: #D4D4D4\"> startscn =<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">       (<\/span><span style=\"color: #569CD6\">SELECT<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #DCDCAA\">MIN<\/span><span style=\"color: #D4D4D4\">(startscn)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">          <\/span><span style=\"color: #569CD6\">FROM<\/span><span style=\"color: #D4D4D4\"> t2_hist);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #DCDCAA\">COMMIT<\/span><span style=\"color: #D4D4D4\">;<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\">-- disable DML an FBA tables<\/span><\/span>\n<span class=\"line\"><span style=\"color: #569CD6\">BEGIN<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">   tvd_fba_helper.reassociate_col_map(in_owner_name =&gt; <\/span><span style=\"color: #DCDCAA\">USER<\/span><span style=\"color: #D4D4D4\">, in_table_name =&gt; <\/span><span style=\"color: #CE9178\">&#39;T2&#39;<\/span><span style=\"color: #D4D4D4\">);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #569CD6\">END<\/span><span style=\"color: #D4D4D4\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">\/<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<p>Now the AS OF TIMESTAMP clause works as well:<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#D4D4D4;--cbp-line-number-width:calc(1 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#2b2b2b;color:#c7c7c7\">No ORA-1466 anymore<\/span><span role=\"button\" tabindex=\"0\" data-code=\"SQL&gt; SELECT * FROM t2 AS OF TIMESTAMP TIMESTAMP '2012-12-23 19:36:08';\n\nOID C1 C2\n--- -- --\n  1 A  A2\n  2 B  B1\" style=\"color:#D4D4D4;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki dark-plus\" style=\"background-color: #1E1E1E\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #D4D4D4\">SQL&gt; SELECT * FROM t2 AS OF TIMESTAMP TIMESTAMP &#39;2012-12-23 19:36:08&#39;;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\"><\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">OID C1 C2<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">--- -- --<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  1 A  A2<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  2 B  B1<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<h3 class=\"wp-block-heading\">Migration Issue 2 &#8211; Different Number of Intervals<\/h3>\n\n\n\n<p>If you query the full history of T2 you get 10 rows, but T1 contains 8 rows only.<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#D4D4D4;--cbp-line-number-width:calc(2 * 0.6 * .875rem);--cbp-line-highlight-color:rgba(234, 191, 191, 0.2);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#2b2b2b;color:#c7c7c7\">T2 Versions<\/span><span role=\"button\" tabindex=\"0\" data-code=\"SQL&gt; SELECT ROWNUM AS vid, OID, created_at, outdated_at, c1, c2\n  2    FROM (SELECT OID,\n  3                 TO_DATE(TO_CHAR(versions_starttime, 'YYYY-MM-DD HH24:MI:SS'),\n  4                         'YYYY-MM-DD HH24:MI:SS') AS created_at,\n  5                 NVL(TO_DATE(TO_CHAR(versions_endtime, 'YYYY-MM-DD HH24:MI:SS'),\n  6                             'YYYY-MM-DD HH24:MI:SS'),\n  7                     TIMESTAMP '9999-12-31 23:59:59') AS outdated_at,\n  8                 c1,\n  9                 c2\n 10            FROM t2 VERSIONS BETWEEN TIMESTAMP TIMESTAMP '2012-12-19 13:00:57'\n 11                                     AND SYSTIMESTAMP\n 12           ORDER BY 1, 2);\n\nVID OID CREATED_AT          OUTDATED_AT         C1 C2\n--- --- ------------------- ------------------- -- --\n  1   1 2012-12-19 13:00:53 2012-12-21 08:20:19 A  A1\n  2   1 2012-12-21 08:20:19 2012-12-23 20:58:03 A  A2\n  3   1 2012-12-23 20:58:03 2012-12-27 11:40:40 A  A3\n  4   1 2012-12-27 11:40:40 2013-01-03 00:50:19 A  A4\n  5   1 2013-01-03 00:50:19 9999-12-31 23:59:59 A  A4\n  6   2 2012-12-20 13:51:54 2013-01-03 00:50:19 B  B1\n  7   2 2013-01-03 00:50:19 9999-12-31 23:59:59 B  B1\n  8   4 2012-12-22 10:26:35 2012-12-23 19:36:07 C  C1\n  9   4 2012-12-28 14:25:50 2012-12-30 17:10:38 C  C1\n 10   4 2012-12-30 17:10:38 2012-12-31 12:05:39 C  C2\" style=\"color:#D4D4D4;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki dark-plus\" style=\"background-color: #1E1E1E\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #D4D4D4\">SQL&gt; SELECT ROWNUM AS vid, OID, created_at, outdated_at, c1, c2<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  2    FROM (SELECT OID,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  3                 TO_DATE(TO_CHAR(versions_starttime, &#39;YYYY-MM-DD HH24:MI:SS&#39;),<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  4                         &#39;YYYY-MM-DD HH24:MI:SS&#39;) AS created_at,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  5                 NVL(TO_DATE(TO_CHAR(versions_endtime, &#39;YYYY-MM-DD HH24:MI:SS&#39;),<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  6                             &#39;YYYY-MM-DD HH24:MI:SS&#39;),<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  7                     TIMESTAMP &#39;9999-12-31 23:59:59&#39;) AS outdated_at,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  8                 c1,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  9                 c2<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\"> 10            FROM t2 VERSIONS BETWEEN TIMESTAMP TIMESTAMP &#39;2012-12-19 13:00:57&#39;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\"> 11                                     AND SYSTIMESTAMP<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\"> 12           ORDER BY 1, 2);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\"><\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">VID OID CREATED_AT          OUTDATED_AT         C1 C2<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">--- --- ------------------- ------------------- -- --<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  1   1 2012-12-19 13:00:53 2012-12-21 08:20:19 A  A1<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  2   1 2012-12-21 08:20:19 2012-12-23 20:58:03 A  A2<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  3   1 2012-12-23 20:58:03 2012-12-27 11:40:40 A  A3<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #D4D4D4\">  4   1 2012-12-27 11:40:40 2013-01-03 00:50:19 A  A4<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #D4D4D4\">  5   1 2013-01-03 00:50:19 9999-12-31 23:59:59 A  A4<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #D4D4D4\">  6   2 2012-12-20 13:51:54 2013-01-03 00:50:19 B  B1<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #D4D4D4\">  7   2 2013-01-03 00:50:19 9999-12-31 23:59:59 B  B1<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  8   4 2012-12-22 10:26:35 2012-12-23 19:36:07 C  C1<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  9   4 2012-12-28 14:25:50 2012-12-30 17:10:38 C  C1<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\"> 10   4 2012-12-30 17:10:38 2012-12-31 12:05:39 C  C2<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<p>The highlighted rows for OID 1 and 2 could be merged. The content is not really wrong it&#8217;s just different to T1. The reason is, that&nbsp;DBMS_FLASHBACK_ARCHIVE.DISASSOCIATE_FBA does not allow us to modify T2_TCRV (SYS_FBA_TCRV&#8230;&lt;object_id&gt; table). This table contains validity information for the current rows in T2.<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#D4D4D4;--cbp-line-number-width:calc(2 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#2b2b2b;color:#c7c7c7\">Validity of TCRV<\/span><span role=\"button\" tabindex=\"0\" data-code=\"SQL&gt; SELECT rid,\n  2         startscn,\n  3         CAST(scn_to_timestamp(startscn) AS DATE) AS start_ts,\n  4         endscn,\n  5         op\n  6    FROM t2_tcrv;\n\nRID                      STARTSCN START_TS                ENDSCN O\n------------------ -------------- ------------------- ---------- -\nAAAZ1PAAIAAAAb0AAA   161382018095 2013-01-03 00:50:19            I\nAAAZ1PAAIAAAAb0AAB   161382018095 2013-01-03 00:50:19            I\" style=\"color:#D4D4D4;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki dark-plus\" style=\"background-color: #1E1E1E\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #D4D4D4\">SQL&gt; SELECT rid,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  2         startscn,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  3         CAST(scn_to_timestamp(startscn) AS DATE) AS start_ts,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  4         endscn,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  5         op<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  6    FROM t2_tcrv;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\"><\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">RID                      STARTSCN START_TS                ENDSCN O<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">------------------ -------------- ------------------- ---------- -<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">AAAZ1PAAIAAAAb0AAA   161382018095 2013-01-03 00:50:19            I<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">AAAZ1PAAIAAAAb0AAB   161382018095 2013-01-03 00:50:19            I<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<p>That&#8217;s why&nbsp;I had to insert the actual rows in T2_HIST.<\/p>\n\n\n\n<p>But with the help of the&nbsp;PL\/SQL package&nbsp;<a href=\"\/\/www.salvis.com\/blog\/wp-content\/uploads\/2013\/01\/fba_tvd_fba_helper.sql_.txt\">TVD_FBA_HELPER<\/a>&nbsp;the data may be fixed as follows:<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#D4D4D4;--cbp-line-number-width:calc(2 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#2b2b2b;color:#c7c7c7\">Fix Validity of TCRV<\/span><span role=\"button\" tabindex=\"0\" data-code=\"-- enable DML on FBA tables\nBEGIN\n   dbms_flashback_archive.disassociate_fba(owner_name =&gt; USER, table_name =&gt; 'T2');\n   tvd_fba_helper.disassociate_tcrv(in_owner_name =&gt; USER, in_table_name =&gt; 'T2');\nEND;\n\/\n\n-- extend begin of validity in TCRV table and fix HIST table accordingly\nMERGE INTO t2_tcrv t\nUSING (SELECT rid, startscn FROM t2_hist b) s\n   ON (s.rid = t.rid)\n WHEN MATCHED THEN\n    UPDATE SET t.startscn = s.startscn;\nDELETE FROM t2_hist WHERE rid IN (SELECT rid FROM t2_tcrv);\nCOMMIT;\n\n-- disable DML an FBA tables\nBEGIN\n   tvd_fba_helper.reassociate_tcrv(in_owner_name =&gt; USER, in_table_name =&gt; 'T2');\n   dbms_flashback_archive.reassociate_fba(owner_name =&gt; USER, table_name =&gt; 'T2');\nEND;\n\/\" style=\"color:#D4D4D4;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki dark-plus\" style=\"background-color: #1E1E1E\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #6A9955\">-- enable DML on FBA tables<\/span><\/span>\n<span class=\"line\"><span style=\"color: #569CD6\">BEGIN<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">   <\/span><span style=\"color: #DCDCAA\">dbms_flashback_archive.<\/span><span style=\"color: #4EC9B0\">disassociate_fba<\/span><span style=\"color: #D4D4D4\">(owner_name =&gt; <\/span><span style=\"color: #DCDCAA\">USER<\/span><span style=\"color: #D4D4D4\">, table_name =&gt; <\/span><span style=\"color: #CE9178\">&#39;T2&#39;<\/span><span style=\"color: #D4D4D4\">);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">   tvd_fba_helper.disassociate_tcrv(in_owner_name =&gt; <\/span><span style=\"color: #DCDCAA\">USER<\/span><span style=\"color: #D4D4D4\">, in_table_name =&gt; <\/span><span style=\"color: #CE9178\">&#39;T2&#39;<\/span><span style=\"color: #D4D4D4\">);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #569CD6\">END<\/span><span style=\"color: #D4D4D4\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">\/<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\">-- extend begin of validity in TCRV table and fix HIST table accordingly<\/span><\/span>\n<span class=\"line\"><span style=\"color: #569CD6\">MERGE<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">INTO<\/span><span style=\"color: #D4D4D4\"> t2_tcrv t<\/span><\/span>\n<span class=\"line\"><span style=\"color: #569CD6\">USING<\/span><span style=\"color: #D4D4D4\"> (<\/span><span style=\"color: #569CD6\">SELECT<\/span><span style=\"color: #D4D4D4\"> rid, startscn <\/span><span style=\"color: #569CD6\">FROM<\/span><span style=\"color: #D4D4D4\"> t2_hist b) s<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">   <\/span><span style=\"color: #569CD6\">ON<\/span><span style=\"color: #D4D4D4\"> (s.rid = t.rid)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">WHEN<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">MATCHED<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">THEN<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #569CD6\">UPDATE<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">SET<\/span><span style=\"color: #D4D4D4\"> t.startscn = s.startscn;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #569CD6\">DELETE<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">FROM<\/span><span style=\"color: #D4D4D4\"> t2_hist <\/span><span style=\"color: #569CD6\">WHERE<\/span><span style=\"color: #D4D4D4\"> rid <\/span><span style=\"color: #569CD6\">IN<\/span><span style=\"color: #D4D4D4\"> (<\/span><span style=\"color: #569CD6\">SELECT<\/span><span style=\"color: #D4D4D4\"> rid <\/span><span style=\"color: #569CD6\">FROM<\/span><span style=\"color: #D4D4D4\"> t2_tcrv);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #DCDCAA\">COMMIT<\/span><span style=\"color: #D4D4D4\">;<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\">-- disable DML an FBA tables<\/span><\/span>\n<span class=\"line\"><span style=\"color: #569CD6\">BEGIN<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">   tvd_fba_helper.reassociate_tcrv(in_owner_name =&gt; <\/span><span style=\"color: #DCDCAA\">USER<\/span><span style=\"color: #D4D4D4\">, in_table_name =&gt; <\/span><span style=\"color: #CE9178\">&#39;T2&#39;<\/span><span style=\"color: #D4D4D4\">);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">   <\/span><span style=\"color: #DCDCAA\">dbms_flashback_archive.<\/span><span style=\"color: #4EC9B0\">reassociate_fba<\/span><span style=\"color: #D4D4D4\">(owner_name =&gt; <\/span><span style=\"color: #DCDCAA\">USER<\/span><span style=\"color: #D4D4D4\">, table_name =&gt; <\/span><span style=\"color: #CE9178\">&#39;T2&#39;<\/span><span style=\"color: #D4D4D4\">);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #569CD6\">END<\/span><span style=\"color: #D4D4D4\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">\/<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<p>Now the query returns 8 rows:<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#D4D4D4;--cbp-line-number-width:calc(2 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#2b2b2b;color:#c7c7c7\">Plaintext<\/span><span role=\"button\" tabindex=\"0\" data-code=\"SQL&gt; SELECT ROWNUM AS vid, OID, created_at, outdated_at, c1, c2\n  2    FROM (SELECT OID,\n  3                 TO_DATE(TO_CHAR(versions_starttime, 'YYYY-MM-DD HH24:MI:SS'),\n  4                         'YYYY-MM-DD HH24:MI:SS') AS created_at,\n  5                 NVL(TO_DATE(TO_CHAR(versions_endtime, 'YYYY-MM-DD HH24:MI:SS'),\n  6                             'YYYY-MM-DD HH24:MI:SS'),\n  7                     TIMESTAMP '9999-12-31 23:59:59') AS outdated_at,\n  8                 c1,\n  9                 c2\n 10            FROM t2 VERSIONS BETWEEN TIMESTAMP TIMESTAMP '2012-12-19 13:00:57'\n 11                                     AND SYSTIMESTAMP\n 12           ORDER BY 1, 2);\n\nVID OID CREATED_AT          OUTDATED_AT         C1 C2\n--- --- ------------------- ------------------- -- --\n  1   1 2012-12-19 13:00:53 2012-12-21 08:20:19 A  A1\n  2   1 2012-12-21 08:20:19 2012-12-23 20:58:03 A  A2\n  3   1 2012-12-23 20:58:03 2012-12-27 11:40:40 A  A3\n  4   1 2012-12-27 11:40:40 9999-12-31 23:59:59 A  A4\n  5   2 2012-12-20 13:51:54 9999-12-31 23:59:59 B  B1\n  6   4 2012-12-22 10:26:35 2012-12-23 19:36:07 C  C1\n  7   4 2012-12-28 14:25:50 2012-12-30 17:10:38 C  C1\n  8   4 2012-12-30 17:10:38 2012-12-31 12:05:39 C  C2\" style=\"color:#D4D4D4;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki dark-plus\" style=\"background-color: #1E1E1E\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #D4D4D4\">SQL&gt; SELECT ROWNUM AS vid, OID, created_at, outdated_at, c1, c2<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  2    FROM (SELECT OID,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  3                 TO_DATE(TO_CHAR(versions_starttime, &#39;YYYY-MM-DD HH24:MI:SS&#39;),<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  4                         &#39;YYYY-MM-DD HH24:MI:SS&#39;) AS created_at,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  5                 NVL(TO_DATE(TO_CHAR(versions_endtime, &#39;YYYY-MM-DD HH24:MI:SS&#39;),<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  6                             &#39;YYYY-MM-DD HH24:MI:SS&#39;),<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  7                     TIMESTAMP &#39;9999-12-31 23:59:59&#39;) AS outdated_at,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  8                 c1,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  9                 c2<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\"> 10            FROM t2 VERSIONS BETWEEN TIMESTAMP TIMESTAMP &#39;2012-12-19 13:00:57&#39;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\"> 11                                     AND SYSTIMESTAMP<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\"> 12           ORDER BY 1, 2);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\"><\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">VID OID CREATED_AT          OUTDATED_AT         C1 C2<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">--- --- ------------------- ------------------- -- --<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  1   1 2012-12-19 13:00:53 2012-12-21 08:20:19 A  A1<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  2   1 2012-12-21 08:20:19 2012-12-23 20:58:03 A  A2<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  3   1 2012-12-23 20:58:03 2012-12-27 11:40:40 A  A3<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  4   1 2012-12-27 11:40:40 9999-12-31 23:59:59 A  A4<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  5   2 2012-12-20 13:51:54 9999-12-31 23:59:59 B  B1<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  6   4 2012-12-22 10:26:35 2012-12-23 19:36:07 C  C1<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  7   4 2012-12-28 14:25:50 2012-12-30 17:10:38 C  C1<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  8   4 2012-12-30 17:10:38 2012-12-31 12:05:39 C  C2<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<p>The timestamps are slightly different to the ones in T1, but that&#8217;s expected behaviour since the precision of TIMESTAMP_TO_SCN conversion is limited to around 3 seconds.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Conclusion<\/h3>\n\n\n\n<p>Loading historical data into FBA enable tables requires a strategy to populate historical mappings in&nbsp;SYS.SMON_SCN_TIME. Afterwards, you may load the associated SYS_FBA_HIST_&lt;object_id&gt; table with the help of the Oracle-supplied PL\/SQL package DBMS_FLASHBACK_ARCHIVE and its procedures&nbsp;DISASSOCIATE_FBA and&nbsp;REASSOCIATE_FBA. I recommend this approach for 11gR2 Database environments.<\/p>\n\n\n\n<p>The solutions to fix migration issue 1 (ORA-1466 when using AS OF TIMESTAMP clause) and migration issue 2 (different number of intervals) are considered experimental. I suggest contacting Oracle Support to discuss how to proceed if you need a solution in this area.<\/p>\n\n\n\n<p><em>Updated on 2014-04-10, changed the calculation of SCN_WRP and SCN_BAS in <a href=\"#extend_smon_scn_time_1\">Extend SMON_SCN_TIME (1)<\/a> and <a href=\"#extend_smon_scn_time_2\">Extend SMON_SCN_TIME (2)<\/a>, changed link to new version of <a href=\"\/\/www.salvis.com\/blog\/wp-content\/uploads\/2013\/01\/tvd_fba_helper.sql_.txt\">TVD_FBA_HELPER<\/a>.<\/em><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Oracle provides via OTN an import solution for FBA (Flashback Data Archive also known as Total Recall). The solution extends the SCN to TIMESTAMP mapping plus provides a wrapper to existing APIs to populate the history. However, issues like using a customized mapping period\/precision or ORA-1466 when using the AS OF TIMESTAMP<span class=\"excerpt-hellip\"> [\u2026]<\/span><\/p>\n","protected":false},"author":1,"featured_media":9543,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[5],"tags":[50,68,42,49],"class_list":["post-545","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-oracle","tag-flashback","tag-flashback-data-archive","tag-temporal-database","tag-transaction-time"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.3 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Loading Historical Data Into Flashback Archive Enabled Tables - Philipp Salvisberg&#039;s Blog<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.salvis.com\/blog\/2013\/01\/03\/loading-historical-data-into-flashback-archive-enabled-tables\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Loading Historical Data Into Flashback Archive Enabled Tables - Philipp Salvisberg&#039;s Blog\" \/>\n<meta property=\"og:description\" content=\"Oracle provides via OTN an import solution for FBA (Flashback Data Archive also known as Total Recall). The solution extends the SCN to TIMESTAMP mapping plus provides a wrapper to existing APIs to populate the history. However, issues like using a customized mapping period\/precision or ORA-1466 when using the AS OF TIMESTAMP [\u2026]\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.salvis.com\/blog\/2013\/01\/03\/loading-historical-data-into-flashback-archive-enabled-tables\/\" \/>\n<meta property=\"og:site_name\" content=\"Philipp Salvisberg&#039;s Blog\" \/>\n<meta property=\"article:published_time\" content=\"2013-01-03T02:34:39+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2023-11-08T19:05:23+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2013\/01\/flight_recorder.png\" \/>\n\t<meta property=\"og:image:width\" content=\"231\" \/>\n\t<meta property=\"og:image:height\" content=\"172\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"author\" content=\"Philipp Salvisberg\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@phsalvisberg\" \/>\n<meta name=\"twitter:site\" content=\"@phsalvisberg\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Philipp Salvisberg\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"12 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/www.salvis.com\\\/blog\\\/2013\\\/01\\\/03\\\/loading-historical-data-into-flashback-archive-enabled-tables\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.salvis.com\\\/blog\\\/2013\\\/01\\\/03\\\/loading-historical-data-into-flashback-archive-enabled-tables\\\/\"},\"author\":{\"name\":\"Philipp Salvisberg\",\"@id\":\"https:\\\/\\\/www.salvis.com\\\/blog\\\/#\\\/schema\\\/person\\\/34352245c48678b1a5a05d4bc1339515\"},\"headline\":\"Loading Historical Data Into Flashback Archive Enabled Tables\",\"datePublished\":\"2013-01-03T02:34:39+00:00\",\"dateModified\":\"2023-11-08T19:05:23+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/www.salvis.com\\\/blog\\\/2013\\\/01\\\/03\\\/loading-historical-data-into-flashback-archive-enabled-tables\\\/\"},\"wordCount\":1638,\"commentCount\":7,\"publisher\":{\"@id\":\"https:\\\/\\\/www.salvis.com\\\/blog\\\/#\\\/schema\\\/person\\\/34352245c48678b1a5a05d4bc1339515\"},\"image\":{\"@id\":\"https:\\\/\\\/www.salvis.com\\\/blog\\\/2013\\\/01\\\/03\\\/loading-historical-data-into-flashback-archive-enabled-tables\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/www.salvis.com\\\/blog\\\/wp-content\\\/uploads\\\/2013\\\/01\\\/flight_recorder.png\",\"keywords\":[\"Flashback\",\"Flashback Data Archive\",\"Temporal Database\",\"Transaction Time\"],\"articleSection\":[\"Oracle\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/www.salvis.com\\\/blog\\\/2013\\\/01\\\/03\\\/loading-historical-data-into-flashback-archive-enabled-tables\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/www.salvis.com\\\/blog\\\/2013\\\/01\\\/03\\\/loading-historical-data-into-flashback-archive-enabled-tables\\\/\",\"url\":\"https:\\\/\\\/www.salvis.com\\\/blog\\\/2013\\\/01\\\/03\\\/loading-historical-data-into-flashback-archive-enabled-tables\\\/\",\"name\":\"Loading Historical Data Into Flashback Archive Enabled Tables - Philipp Salvisberg&#039;s Blog\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.salvis.com\\\/blog\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/www.salvis.com\\\/blog\\\/2013\\\/01\\\/03\\\/loading-historical-data-into-flashback-archive-enabled-tables\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/www.salvis.com\\\/blog\\\/2013\\\/01\\\/03\\\/loading-historical-data-into-flashback-archive-enabled-tables\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/www.salvis.com\\\/blog\\\/wp-content\\\/uploads\\\/2013\\\/01\\\/flight_recorder.png\",\"datePublished\":\"2013-01-03T02:34:39+00:00\",\"dateModified\":\"2023-11-08T19:05:23+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/www.salvis.com\\\/blog\\\/2013\\\/01\\\/03\\\/loading-historical-data-into-flashback-archive-enabled-tables\\\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/www.salvis.com\\\/blog\\\/2013\\\/01\\\/03\\\/loading-historical-data-into-flashback-archive-enabled-tables\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/www.salvis.com\\\/blog\\\/2013\\\/01\\\/03\\\/loading-historical-data-into-flashback-archive-enabled-tables\\\/#primaryimage\",\"url\":\"https:\\\/\\\/www.salvis.com\\\/blog\\\/wp-content\\\/uploads\\\/2013\\\/01\\\/flight_recorder.png\",\"contentUrl\":\"https:\\\/\\\/www.salvis.com\\\/blog\\\/wp-content\\\/uploads\\\/2013\\\/01\\\/flight_recorder.png\",\"width\":231,\"height\":172},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/www.salvis.com\\\/blog\\\/2013\\\/01\\\/03\\\/loading-historical-data-into-flashback-archive-enabled-tables\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/www.salvis.com\\\/blog\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Loading Historical Data Into Flashback Archive Enabled Tables\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/www.salvis.com\\\/blog\\\/#website\",\"url\":\"https:\\\/\\\/www.salvis.com\\\/blog\\\/\",\"name\":\"Philipp Salvisberg&#039;s Blog\",\"description\":\"Database-centric development\",\"publisher\":{\"@id\":\"https:\\\/\\\/www.salvis.com\\\/blog\\\/#\\\/schema\\\/person\\\/34352245c48678b1a5a05d4bc1339515\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/www.salvis.com\\\/blog\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":[\"Person\",\"Organization\"],\"@id\":\"https:\\\/\\\/www.salvis.com\\\/blog\\\/#\\\/schema\\\/person\\\/34352245c48678b1a5a05d4bc1339515\",\"name\":\"Philipp Salvisberg\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/www.salvis.com\\\/blog\\\/wp-content\\\/uploads\\\/2010\\\/11\\\/phs_trivadis4.jpg\",\"url\":\"https:\\\/\\\/www.salvis.com\\\/blog\\\/wp-content\\\/uploads\\\/2010\\\/11\\\/phs_trivadis4.jpg\",\"contentUrl\":\"https:\\\/\\\/www.salvis.com\\\/blog\\\/wp-content\\\/uploads\\\/2010\\\/11\\\/phs_trivadis4.jpg\",\"width\":400,\"height\":400,\"caption\":\"Philipp Salvisberg\"},\"logo\":{\"@id\":\"https:\\\/\\\/www.salvis.com\\\/blog\\\/wp-content\\\/uploads\\\/2010\\\/11\\\/phs_trivadis4.jpg\"},\"sameAs\":[\"http:\\\/\\\/www.salvis.com\\\/\"]}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Loading Historical Data Into Flashback Archive Enabled Tables - Philipp Salvisberg&#039;s Blog","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.salvis.com\/blog\/2013\/01\/03\/loading-historical-data-into-flashback-archive-enabled-tables\/","og_locale":"en_US","og_type":"article","og_title":"Loading Historical Data Into Flashback Archive Enabled Tables - Philipp Salvisberg&#039;s Blog","og_description":"Oracle provides via OTN an import solution for FBA (Flashback Data Archive also known as Total Recall). The solution extends the SCN to TIMESTAMP mapping plus provides a wrapper to existing APIs to populate the history. However, issues like using a customized mapping period\/precision or ORA-1466 when using the AS OF TIMESTAMP [\u2026]","og_url":"https:\/\/www.salvis.com\/blog\/2013\/01\/03\/loading-historical-data-into-flashback-archive-enabled-tables\/","og_site_name":"Philipp Salvisberg&#039;s Blog","article_published_time":"2013-01-03T02:34:39+00:00","article_modified_time":"2023-11-08T19:05:23+00:00","og_image":[{"width":231,"height":172,"url":"https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2013\/01\/flight_recorder.png","type":"image\/png"}],"author":"Philipp Salvisberg","twitter_card":"summary_large_image","twitter_creator":"@phsalvisberg","twitter_site":"@phsalvisberg","twitter_misc":{"Written by":"Philipp Salvisberg","Est. reading time":"12 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.salvis.com\/blog\/2013\/01\/03\/loading-historical-data-into-flashback-archive-enabled-tables\/#article","isPartOf":{"@id":"https:\/\/www.salvis.com\/blog\/2013\/01\/03\/loading-historical-data-into-flashback-archive-enabled-tables\/"},"author":{"name":"Philipp Salvisberg","@id":"https:\/\/www.salvis.com\/blog\/#\/schema\/person\/34352245c48678b1a5a05d4bc1339515"},"headline":"Loading Historical Data Into Flashback Archive Enabled Tables","datePublished":"2013-01-03T02:34:39+00:00","dateModified":"2023-11-08T19:05:23+00:00","mainEntityOfPage":{"@id":"https:\/\/www.salvis.com\/blog\/2013\/01\/03\/loading-historical-data-into-flashback-archive-enabled-tables\/"},"wordCount":1638,"commentCount":7,"publisher":{"@id":"https:\/\/www.salvis.com\/blog\/#\/schema\/person\/34352245c48678b1a5a05d4bc1339515"},"image":{"@id":"https:\/\/www.salvis.com\/blog\/2013\/01\/03\/loading-historical-data-into-flashback-archive-enabled-tables\/#primaryimage"},"thumbnailUrl":"https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2013\/01\/flight_recorder.png","keywords":["Flashback","Flashback Data Archive","Temporal Database","Transaction Time"],"articleSection":["Oracle"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.salvis.com\/blog\/2013\/01\/03\/loading-historical-data-into-flashback-archive-enabled-tables\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.salvis.com\/blog\/2013\/01\/03\/loading-historical-data-into-flashback-archive-enabled-tables\/","url":"https:\/\/www.salvis.com\/blog\/2013\/01\/03\/loading-historical-data-into-flashback-archive-enabled-tables\/","name":"Loading Historical Data Into Flashback Archive Enabled Tables - Philipp Salvisberg&#039;s Blog","isPartOf":{"@id":"https:\/\/www.salvis.com\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.salvis.com\/blog\/2013\/01\/03\/loading-historical-data-into-flashback-archive-enabled-tables\/#primaryimage"},"image":{"@id":"https:\/\/www.salvis.com\/blog\/2013\/01\/03\/loading-historical-data-into-flashback-archive-enabled-tables\/#primaryimage"},"thumbnailUrl":"https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2013\/01\/flight_recorder.png","datePublished":"2013-01-03T02:34:39+00:00","dateModified":"2023-11-08T19:05:23+00:00","breadcrumb":{"@id":"https:\/\/www.salvis.com\/blog\/2013\/01\/03\/loading-historical-data-into-flashback-archive-enabled-tables\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.salvis.com\/blog\/2013\/01\/03\/loading-historical-data-into-flashback-archive-enabled-tables\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.salvis.com\/blog\/2013\/01\/03\/loading-historical-data-into-flashback-archive-enabled-tables\/#primaryimage","url":"https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2013\/01\/flight_recorder.png","contentUrl":"https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2013\/01\/flight_recorder.png","width":231,"height":172},{"@type":"BreadcrumbList","@id":"https:\/\/www.salvis.com\/blog\/2013\/01\/03\/loading-historical-data-into-flashback-archive-enabled-tables\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.salvis.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Loading Historical Data Into Flashback Archive Enabled Tables"}]},{"@type":"WebSite","@id":"https:\/\/www.salvis.com\/blog\/#website","url":"https:\/\/www.salvis.com\/blog\/","name":"Philipp Salvisberg&#039;s Blog","description":"Database-centric development","publisher":{"@id":"https:\/\/www.salvis.com\/blog\/#\/schema\/person\/34352245c48678b1a5a05d4bc1339515"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.salvis.com\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":["Person","Organization"],"@id":"https:\/\/www.salvis.com\/blog\/#\/schema\/person\/34352245c48678b1a5a05d4bc1339515","name":"Philipp Salvisberg","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2010\/11\/phs_trivadis4.jpg","url":"https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2010\/11\/phs_trivadis4.jpg","contentUrl":"https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2010\/11\/phs_trivadis4.jpg","width":400,"height":400,"caption":"Philipp Salvisberg"},"logo":{"@id":"https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2010\/11\/phs_trivadis4.jpg"},"sameAs":["http:\/\/www.salvis.com\/"]}]}},"_links":{"self":[{"href":"https:\/\/www.salvis.com\/blog\/wp-json\/wp\/v2\/posts\/545","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.salvis.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.salvis.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.salvis.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.salvis.com\/blog\/wp-json\/wp\/v2\/comments?post=545"}],"version-history":[{"count":10,"href":"https:\/\/www.salvis.com\/blog\/wp-json\/wp\/v2\/posts\/545\/revisions"}],"predecessor-version":[{"id":12751,"href":"https:\/\/www.salvis.com\/blog\/wp-json\/wp\/v2\/posts\/545\/revisions\/12751"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.salvis.com\/blog\/wp-json\/wp\/v2\/media\/9543"}],"wp:attachment":[{"href":"https:\/\/www.salvis.com\/blog\/wp-json\/wp\/v2\/media?parent=545"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.salvis.com\/blog\/wp-json\/wp\/v2\/categories?post=545"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.salvis.com\/blog\/wp-json\/wp\/v2\/tags?post=545"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}