Usually I get it from the first row of V$MYSTAT, this is a good way.
SQL> SELECT SID FROM V$MYSTAT WHERE ROWNUM =1;
SID
----------
19949
In Oracle 10g or above, we can use a more simple way with the USERENV function
SQL> SELECT USERENV('SID') FROM DUAL;
USERENV('SID')
--------------
19949
Sometime I also use the following method, but in Oracle 10g, it does work but return 2 rows for you, so actually not work for you in Oracle 10g or above. We should not use it any more.
SQL> SELECT SID FROM V$SESSION WHERE AUDSID=USERENV('SESSIONID');
SID
----------
19949
19829
Are there any other ways?.