To quickly recreate a user schema without touching his privs and roles, this
is faster than drop user cascade and create user (followed by grant...):

--Logon to the schema you want to cleanup (dropping tables first makes dropping other objects much easier):
--Remove "purge" if pre-10g
select 'drop table ' || table_name || ' cascade constraints purge;' from user_tables;
select 'drop ' || object_type || ' "' || object_name || '";' from user_objects;
--For 10g (to avoid dropping objects already in recycle bin, i.e. ORA-38301: can not perform DDL/DML over objects in Recycle Bin):
select 'drop ' || object_type || ' "' || object_name || '";' from user_objects
where object_name not in (select object_name from user_recyclebin);


--From a privileged account (remove "purge" if pre-10g; add double quotes for Java objects, but Java objects may not be compiled 
--unless resolver is correctly specified; better to compile as owner, or after "alter session set current_schema=theowner"):
--Provide the correct schema when prompted
set pages 1000
select 'drop table &&owner' || '.' || table_name || ' cascade constraints purge;' from dba_tables where owner = '&&owner' order by 1;
select 'drop ' || object_type || ' &&owner' || '."' || object_name || '";' from dba_objects where owner = '&&owner' order by 1;


Verify and then run the generated SQLs.



-- Get user names and encrypted passwords for users
select 'create user ' || username || ' identified by values ' || '''' ||
password || '''' || ' default tablespace ' || default_tablespace || '
temporary tablespace ' || temporary_tablespace || ' profile ' || profile ||
';'
 from dba_users;

-- Get associated role grants for users extracted above
select 'grant ' || t1.granted_role || ' to ' || t2.username ||
(decode(admin_option,'YES',' with admin option','NO','')) || ';'
from dba_role_privs t1, dba_users t2
where t1.grantee = t2.username;