Oracle stores data dictionary data the same way as they store "regular" data: in tables.
You can use the SQL language to query data dictionary data in the same way that you query ordinary data.
You need to know only the names of the data dictionary tables and the names of their columns.
For example, there is a role, SELECT_CATALOG_ROLE, which contains all privileges that you need to be able to access the data dictionary data.
The following code demonstrates how Oracle controls data dictionary access.
SQL> describe dba_sys_privs ERROR: ORA-04043: object "SYS"."DBA_SYS_PRIVS" does not exist SQL> connect / as sysdba Connected. SQL> grant select_catalog_role to joe; Grant succeeded. SQL> connect joe/book Connected. SQL> desc dba_sys_privs Name Null? Type ----------------------------- -------- --------------- GRANTEE NOT NULL VARCHAR2(30) PRIVILEGE NOT NULL VARCHAR2(40) ADMIN_OPTION VARCHAR2(3) SQL>