We can compose the execution statement for getting the definition of all tablespaces by DBMS_METADATA.GET_DDL, just like we do for getting DDL of a table.
SQL> select 'exec dbms_output.put_line(dbms_metadata.get_ddl(''TABLESPACE'',''' || tablespace_name || '''));' ddl from dba_tablespaces;
But, we are usually not interested in SYSTEM, SYSAUX and TEMP, so we narrow down the scope to PERMANENT like this:
SQL> set serveroutput on feedback off;
SQL> select 'exec dbms_output.put_line(dbms_metadata.get_ddl(''TABLESPACE'',''' || tablespace_name || '''));' ddl from dba_tablespaces where tablespace_name not in ('SYSTEM', 'SYSAUX') and contents = 'PERMANENT';
DDL
--------------------------------------------------------------------------------
exec dbms_output.put_line(dbms_metadata.get_ddl('TABLESPACE','USERS'));
exec dbms_output.put_line(dbms_metadata.get_ddl('TABLESPACE','EXAMPLE'));
...
Let's take a look at one output of these tablespaces.
SQL> exec dbms_output.put_line(dbms_metadata.get_ddl('TABLESPACE','EXAMPLE'));
CREATE TABLESPACE "EXAMPLE" DATAFILE
'/u01/app/oracle/oradata/orcl/example01.dbf' SIZE 104857600
AUTOEXTEND ON NEXT
655360 MAXSIZE 32767M
NOLOGGING ONLINE PERMANENT BLOCKSIZE 8192
EXTENT
MANAGEMENT LOCAL AUTOALLOCATE DEFAULT NOCOMPRESS SEGMENT SPACE MANAGEMENT AUTO
Now, we can edit the DDL for creating another tablespace like this one.
Furthermore, you can also generate tablespace DDL for creating uniform size and naming of data files.