alias adm_NIHILUS='rlwrap sqlplus adm/"secret"@bakura:1521/NIHILUS as sysdba'


create pluggable database NIHILUS admin user NIHILUS$OWNER identified by secret;
alter pluggable database NIHILUS open;
alter pluggable database NIHILUS save state;


alter session set container=NIHILUS;

create bigfile tablespace LIVE_TS datafile size 32M autoextend on next 32M;
create bigfile tablespace ARCHIVE_TS datafile size 32M autoextend on next 32M;

create user adm identified by "secret";
grant sysdba to adm;


create user usr identified by "secret";
grant CONNECT,RESOURCE to usr;
grant alter session to usr;

alter user usr default tablespace LIVE_TS;

alter user usr quota unlimited on LIVE_TS;
alter user usr quota unlimited on ARCHIVE_TS;

alias adm_NIHILUS='rlwrap sqlplus adm/"secret"@bakura:1521/NIHILUS as sysdba'
alias usr_NIHILUS='rlwrap sqlplus usr/"secret"@bakura:1521/NIHILUS'


create flashback archive default ARCHIVE_7_DAY
	tablespace ARCHIVE_TS 
	quota 1G
	retention 7 DAY;

grant flashback archive on ARCHIVE_7_DAY to usr;
grant flashback archive administer to usr;
grant execute on dbms_flashback_archive to usr;


------------------------------------------------------------------------------
SET LINESIZE 150

COLUMN owner_name FORMAT A20
COLUMN flashback_archive_name FORMAT A22
COLUMN create_time FORMAT A20
COLUMN last_purge_time FORMAT A20

SELECT owner_name,
       flashback_archive_name,
       flashback_archive#,
       retention_in_days,
       TO_CHAR(create_time, 'YYYY-MM-DD HH24:MI:SS') AS create_time,
       TO_CHAR(last_purge_time, 'YYYY-MM-DD HH24:MI:SS') AS last_purge_time,
       status
FROM   dba_flashback_archive
ORDER BY owner_name, flashback_archive_name;
------------------------------------------------------------------------------


------------------------------------------------------------------------------
SET LINESIZE 150

COLUMN flashback_archive_name FORMAT A22
COLUMN tablespace_name FORMAT A20
COLUMN quota_in_mb FORMAT A11

SELECT flashback_archive_name,
       flashback_archive#,
       tablespace_name,
       quota_in_mb
FROM   dba_flashback_archive_ts
ORDER BY flashback_archive_name;
------------------------------------------------------------------------------


------------------------------------------------------------------------------
SET LINESIZE 150

COLUMN owner_name FORMAT A20
COLUMN table_name FORMAT A20
COLUMN flashback_archive_name FORMAT A22
COLUMN archive_table_name FORMAT A20

SELECT owner_name,
       table_name,
       flashback_archive_name,
       archive_table_name,
       status
FROM   dba_flashback_archive_tables
ORDER BY owner_name, table_name;
------------------------------------------------------------------------------


-- Example 1
-------------

create table TAB1 (
  ID           number,
  DESCRIPTION  varchar2(50),
  constraint TAB_1_PK primary key (id)
);

alter table TAB1 flashback archive ARCHIVE_7_DAY;

insert into TAB1 values (1, 'one');
commit;

update TAB1 set description = 'two' where  id = 1;
commit;

update TAB1 set description = 'three' where  id = 1;
commit;


------------------------------------------------------------------------------
SET LINESIZE 200

COLUMN versions_startscn FORMAT 99999999999999999
COLUMN versions_starttime FORMAT A32
COLUMN versions_endscn FORMAT 99999999999999999
COLUMN versions_endtime FORMAT A32
COLUMN versions_xid FORMAT A16
COLUMN versions_operation FORMAT A1
COLUMN description FORMAT A11

SELECT versions_startscn,
       versions_starttime, 
       versions_endscn,
       versions_endtime,
       versions_xid,
       versions_operation,
       description
FROM   tab1 
       VERSIONS BETWEEN TIMESTAMP SYSTIMESTAMP-(1/24) AND SYSTIMESTAMP
WHERE  id = 1
ORDER BY versions_startscn;
------------------------------------------------------------------------------


create table TAB1 (d date);
alter table TAB1 flashback archive ARCHIVE_7_DAY;

insert into TAB1 values (sysdate);
commit;

-- infinite_update1.sql
begin
   loop 
     update TAB1 set d=sysdate;
     commit; 
     dbms_session.sleep(1);
   end loop;
end;
/


alter session set NLS_DATE_FORMAT='YYYY-MM-DD HH24:MI:SS';

SET LINESIZE 200

COLUMN versions_startscn FORMAT 99999999999999999
COLUMN versions_starttime FORMAT A32
COLUMN versions_endscn FORMAT 99999999999999999
COLUMN versions_endtime FORMAT A32
COLUMN versions_xid FORMAT A16
COLUMN versions_operation FORMAT A1
COLUMN description FORMAT A25

SELECT 
	   versions_startscn,
       versions_starttime, 
       versions_endscn,
       versions_endtime,
       versions_xid,
       versions_operation,
       d
FROM   
	TAB1 
VERSIONS BETWEEN TIMESTAMP TIMESTAMP'2023-06-17 17:20:10' and  TIMESTAMP'2023-06-17 17:20:40'
ORDER BY versions_startscn;


SELECT * from TAB1 
AS OF TIMESTAMP TIMESTAMP'2023-06-17 17:05:10';


SELECT * from TAB1 
AS OF TIMESTAMP TIMESTAMP'2023-06-17 17:30:49';



EXEC DBMS_SYSTEM.set_ev(si=>163, se=>24797, ev=>10046, le=>8, nm=>'');


-- Example 2
-------------

alter table TAB2 no flashback archive;
drop table TAB2 purge;


create table TAB2 (
    n1 number,
    c1 varchar2(10),
    d1 DATE	
);

alter table TAB2 flashback archive ARCHIVE_7_DAY;

insert into TAB2 values(1,'One',TIMESTAMP'2023-01-01 00:00:00');
commit;
insert into TAB2 values(2,'Two',TIMESTAMP'2023-01-01 00:00:00');
commit;
insert into TAB2 values(3,'Three',TIMESTAMP'2023-01-01 00:00:00');
commit;








alter session set NLS_DATE_FORMAT='YYYY-MM-DD HH24:MI:SS';

SET LINESIZE 200
COLUMN versions_startscn FORMAT 99999999999999999
COLUMN versions_starttime FORMAT A32
COLUMN versions_endscn FORMAT 99999999999999999
COLUMN versions_endtime FORMAT A32
COLUMN versions_xid FORMAT A16
COLUMN versions_operation FORMAT A1
COLUMN description FORMAT A25

SELECT 
	   versions_startscn,
       versions_starttime, 
       versions_endscn,
       versions_endtime,
       versions_xid,
       versions_operation,
       T.*
FROM   
	TAB2 VERSIONS BETWEEN TIMESTAMP (systimestamp-3/24) and systimestamp T
where 
	N1=1
ORDER BY versions_startscn;

update TAB2 set d1=TIMESTAMP'2023-12-31 23:59:59' where n1=1;
commit;


select * from TAB2 as of timestamp TIMESTAMP'2023-06-18 08:47:20' where N1=1;

select * from TAB2 as of timestamp systimestamp where N1=1;
select * from TAB2 as of scn 4335762 where N1=1;
select * from TAB2 as of scn 4335824 where N1=1;

-> 
alter table TAB2 add C2 varchar2(3);

update TAB2 set C2='abc' where n1=1;
update TAB2 set C2='***' where n1=1;
commit;
update TAB2 set C2='def' where n1=1;
commit;


alter table TAB2 drop column C2;
alter table TAB2 rename column C1 to C3; 

update TAB2 set d1=systimestamp where n1=1;
commit;

update TAB2 set d1=TIMESTAMP'1973-10-05 10:00:00',C3='birthday' where n1=1;
commit;

update TAB2 set d1=systimestamp,C3='right now' where n1=1;
commit;


4336404 18-JUN-23 03.14.59
select * from TAB2 as of timestamp TIMESTAMP'2023-06-18 03:15:00' where N1=1;

select * from TAB2 as of scn 4336403 where N1=1;
select * from TAB2 as of scn 4336404 where N1=1;
select * from TAB2 as of scn 4337054 where N1=1;

select * from TAB2 as of scn 4282896 where N1=1;
select * from TAB2 as of scn 4283027 where N1=1;








-- cleanup
alter table TAB2 no flashback archive;
drop table TAB2 purge;

alter table TAB1 no flashback archive;
drop table TAB1 purge;

drop user USR cascade;

drop flashback archive ARCHIVE_7_DAY;

drop tablespace LIVE_TS including contents and datafiles;
drop tablespace ARCHIVE_TS including contents and datafiles;


-- cleanup
alter pluggable database NIHILUS close instances=ALL;
drop pluggable database NIHILUS including datafiles;
