> How to get current SCN number other than using dbms_flashback package.
In 8i where there's no dbms_flashback nor v$database.current_scn info, one could read the current SCN ouf from SGA memory directly. The following example displays SCN with all three mentioned techniques on a 32bit environment. )In 64bit environment the script would be even simpler as all 8 bytes of SCN are accessible on one word-size line from X$KSMMEM).
-- find where current SCN lives in SGA:
SQL> select ksmfsadr from x$ksmfsv where ksmfsnam = 'kcsgscn_';
KSMFSADR -------- 20009104
-- on 32bit environments this is the most significant half word of 8 byte SCN. To get the other, least significant half, you have to add 4 to the address and combine the results:
SQL> l 1 select dbms_flashback.get_system_change_number flashback_scn, 2 current_scn, 3 (select to_number(ksmmmval,'XXXXXXXX') 4 from x$ksmmem where addr = hextoraw('20009104')) * power(2,32) + 5 (select to_number(ksmmmval,'XXXXXXXX') 6 from x$ksmmem where addr = hextoraw('20009108')) direct_scn 7* from v$database SQL> /
FLASHBACK_SCN CURRENT_SCN DIRECT_SCN ------------- ----------- ---------- 2633692 2633692 2633692
The SCN lives in fixed part of SGA, thus its location doesn't change over instance bounces or SGA size changes. It might change only if you relink Oracle binary or change SGA mapped base address.