I've create a user account that has "read only" for a database. I want this user account to also be able to query dba_free_space, dba_data_files,...... Right now, when you try to do something basic, like desc dba_free_space, I get SYS.DBA_FREE_SPACE does not exist. So I believe the user account does not have enough privilege. I want this account to only be able to query the information.

The user account was created by:

ursor_1 := DBMS_SQL.OPEN_CURSOR;
sqlstmt_1 := 'CREATE USER vcgrp IDENTIFIED BY readonly DEFAULT TABLESPACE vc_data
TEMPORARY TABLESPACE vc_temp
QUOTA UNLIMITED ON vc_data
QUOTA UNLIMITED ON vc_temp
QUOTA UNLIMITED ON vc_index';
DBMS_SQL.PARSE (cursor_1, sqlstmt_1, DBMS_SQL.NATIVE);
DBMS_SQL.CLOSE_CURSOR(cursor_1);
END IF;

activity := 'granting permissions to vcgrp';
cursor_1 := DBMS_SQL.OPEN_CURSOR;
sqlstmt_1 := 'GRANT CREATE SESSION, SELECT ANY TABLE, SELECT ANY DICTIONARY TO vcgrp';
DBMS_SQL.PARSE (cursor_1, sqlstmt_1, DBMS_SQL.NATIVE);
DBMS_SQL.CLOSE_CURSOR(cursor_1);

Is my assumption correct that I'm missing some permission? Thank you