Column level security
You can do this with a normal view, as long as the users involved haven't already got access to the base table.

EG:

SQL&gt; create user reportuser identified by reportuser;

User created.

SQL&gt; grant create session to reportuser;

Grant succeeded.

SQL&gt; grant create synonym to reportuser;

Grant succeeded.

SQL&gt; select user from dual;

USER
------------------------------
PHIL

SQL&gt; create table basetable
(
  id number primary key,
  viewable varchar2(30),
  secret varchar2(30)
);

Table created.

SQL&gt; insert into basetable values ( 1, 'hello world','this is secret' );

1 row created.

SQL&gt; commit;

Commit complete.

SQL&gt; create view reportview
as
select id, viewable
from basetable;

View created.

SQL&gt; grant select on reportview to reportuser;

Grant succeeded.

SQL&gt; conn reportuser/reportuser
Connected.
SQL&gt; select * from phil.basetable;
select * from phil.basetable
                   *
ERROR at line 1:
ORA-00942: table or view does not exist

SQL&gt; select secret from phil.basetable;
select secret from phil.basetable
                        *
ERROR at line 1:
ORA-00942: table or view does not exist

SQL&gt; select * from phil.reportview;

        ID VIEWABLE
---------- ------------------------------
         1 hello world

SQL&gt;


If you revoke permissions on the tables in question &amp; create the views, along with a synonym for each users view that has the same name as the original table, it should be transparent. 

EG:

SQL&gt; select user from dual;

USER
------------------------------
REPORTUSER

SQL&gt; create synonym basetable for phil.reportview;

Synonym created.

SQL&gt; select * from basetable;

        ID VIEWABLE
---------- ------------------------------
         1 hello world

SQL&gt;


You can also do this with Virtual Private Database, but I think it's an expensive extra licensed option. You use DBMS_RLS to configure the relevant security policies that you require.