creating a read only user in Oracle
You need to grant the create session privilege in order for the user to be able to connect. Then grant the select privilege on every table the user needs to access. To grant the user the privilege to read all tables in the entire database you can use the select any table privilege. 

I think the PUBLIC role has the execute privilege for the DBMS_METADATA package so the user should be able to extract the DDL of the tables automatically.