我们知道Oracle10g在v$database视图中引入了current_scn,这个SCN来自底层表,代表当前的SCN,在Oracle9i中我们可以通过dbms_flashback.get_system_change_number来获得系统的SCN。我的版本是oracle11g的。
但是注意current_scn还是有所不同的,看一下一个查询:
SQL> col current_scn for 99999999999999999
SQL> select current_scn from v$database; CURRENT_SCN
------------------
1941617
SQL> select dbms_flashback.get_system_change_number current_scn from dual;
CURRENT_SCN
------------------
1941650
SQL> select dbms_flashback.get_system_change_number current_scn from dual;
CURRENT_SCN
------------------
1941675
SQL> select dbms_flashback.get_system_change_number current_scn from dual;
CURRENT_SCN
------------------
1941678
SQL> select current_scn from v$database;
CURRENT_SCN
------------------
1941683
SQL> select dbms_flashback.get_system_change_number current_scn from dual;
CURRENT_SCN
------------------
1941689
SQL> select dbms_flashback.get_system_change_number current_scn from dual;
CURRENT_SCN
------------------
1941691
SQL> select current_scn from v$database;
CURRENT_SCN
------------------
1941762
SQL> conn system/yang as sysdba
已连接。
SQL> select current_scn from v$database;
CURRENT_SCN
------------------
1941780
SQL> select current_scn from v$database;
CURRENT_SCN
------------------
1941794
SQL> select dbms_flashback.get_system_change_number current_scn from dual;
CURRENT_SCN
------------------
1941794
SQL> select dbms_flashback.get_system_change_number current_scn from dual;
CURRENT_SCN
------------------
1941795
SQL> select dbms_flashback.get_system_change_number current_scn from dual;
CURRENT_SCN
------------------
1941797
SQL> select dbms_flashback.get_system_change_number current_scn from dual;
CURRENT_SCN
------------------
1941797
SQL> select dbms_flashback.get_system_change_number current_scn from dual;
CURRENT_SCN
------------------
1941798
SQL> select dbms_flashback.get_system_change_number current_scn from dual;
CURRENT_SCN
------------------
1941799
SQL> select dbms_flashback.get_system_change_number current_scn from dual;
CURRENT_SCN
------------------
1941799
SQL> select dbms_flashback.get_system_change_number current_scn from dual;
CURRENT_SCN
------------------
1941799
SQL> select dbms_flashback.get_system_change_number current_scn from dual;
CURRENT_SCN
------------------
1941800
SQL> select dbms_flashback.get_system_change_number current_scn from dual;
CURRENT_SCN
------------------
1941800
SQL> select dbms_flashback.get_system_change_number current_scn from dual;
CURRENT_SCN
------------------
1941801
SQL> select dbms_flashback.get_system_change_number current_scn from dual;
CURRENT_SCN
------------------
1941801
SQL> select dbms_flashback.get_system_change_number current_scn from dual;
CURRENT_SCN
------------------
1941801
SQL> select dbms_flashback.get_system_change_number current_scn from dual;
CURRENT_SCN
------------------
1941802
SQL> select dbms_flashback.get_system_change_number current_scn from dual;
CURRENT_SCN
------------------
1941802
SQL> select dbms_flashback.get_system_change_number current_scn from dual;
CURRENT_SCN
------------------
1941802
SQL> select dbms_flashback.get_system_change_number current_scn from dual;
CURRENT_SCN
------------------
1941803
SQL> select current_scn from v$database;
CURRENT_SCN
------------------
1941806
SQL> select current_scn from v$database;
CURRENT_SCN
------------------
1941808
SQL> select current_scn from v$database;
CURRENT_SCN
------------------
1941809
SQL> select current_scn from v$database;
CURRENT_SCN
------------------
1941811
SQL> select current_scn from v$database;
CURRENT_SCN
------------------
1941812
SQL> select current_scn from v$database;
CURRENT_SCN
------------------
1941814
SQL> select current_scn from v$database;
CURRENT_SCN
------------------
1941815
SQL> select current_scn from v$database;
CURRENT_SCN
------------------
1941817
我们看到current_scn的查询会直接导致SCN的增进,而其他方式并不会,至少执行两次时不会。也就是说在这里的current_scn就像是一个Sequence一样,查询会导致增进。这也很好理解,v$database只能通过增进当前的SCN才能保证获得的SCN是Current的。可是如果不查询呢?这个值肯定是不会增长的。
这里 和盖国强大师 说点不一样。
http://www.eygle.com/archives/2007/06/oracle10g_current_scn.html
有点疑惑?那位朋友能给个解答!先谢谢了。。