Resizing and reclaiming free space on Tablespaces
I know I am late for the party, but this script was gold for me at the time I found it:
set verify off
column file_name format a50 word_wrapped
column smallest format 999,990 heading &quot;Smallest|Size|Poss.&quot;
column currsize format 999,990 heading &quot;Current|Size&quot;
column savings  format 999,990 heading &quot;Poss.|Savings&quot;
break on report
compute sum of savings on report
column value new_val blksize
select value from v$parameter where name = 'db_block_size';
/
select file_name,
       ceil( (nvl(hwm,1)*&amp;&amp;blksize)/1024/1024 ) smallest,
       ceil( blocks*&amp;&amp;blksize/1024/1024) currsize,
       ceil( blocks*&amp;&amp;blksize/1024/1024) -
       ceil( (nvl(hwm,1)*&amp;&amp;blksize)/1024/1024 ) savings
from dba_data_files a,
     ( select file_id, max(block_id+blocks-1) hwm
         from dba_extents
        group by file_id ) b
where a.file_id = b.file_id(+) order by savings desc
/

It will tell you smallest and current size of each datafile and it will tell you how much
storage you may gain by shrinking a datafile(s combined).
Once you find the smallest possible size of a datafile, you may simply shrink it with:
ALTER DATABASE DATAFILE 'Datafile_name_bla_bla' RESIZE 20M;