As long as you created the procedure with definer's rights (the default), then you only need to grant execute on the procedure:
grant create session to u identified by u;
create table t (
x int
);
create or replace procedure p is
begin
insert into t values (1);
end p;
/
grant execute on p to u;
grant select on t to u;
conn u/u
select count(*) from chris.t;
COUNT(*)
0
exec chris.p;
select count(*) from chris.t;
COUNT(*)
1
If you use invoker's rights, you need explicit privileges:
conn chris/chris
create or replace procedure p
authid current_user is
begin
insert into t values (1);
end p;
/
grant execute on p to u;
conn u/u
select count(*) from chris.t;
COUNT(*)
1
exec chris.p;
ORA-00942: table or view does not exist
select count(*) from chris.t;
COUNT(*)
1