permissions for yet another "ORA-06512: table or view does not exist" scenario
Well I have simulated your problem in my test environment. I found the issue with the table name(aaaa and bbbbb which belongs to z schema). 
Though you have select privilege on these tables you must use schema name explicitly(z.aaaaa and z.bbbbb). The following is the test case.

SQL&gt; create user z identified by z;

User created.

SQL&gt; create user y identified by y;

User created.

SQL&gt; create user x identified by x;

User created.

SQL&gt; grant connect, resource to x,y,z;

Grant succeeded.

SQL&gt; grant create any table to x;

Grant succeeded.


SQL&gt; conn z/z
Connected.
SQL&gt; create table aaaaa(id number, name varchar2(20));
Table created.

SQL&gt; create table bbbbb(id number, address varchar2(20));
Table created.

SQL&gt; grant select on bbbbb to y;
Grant succeeded.

SQL&gt; grant select on aaaaa to y;
Grant succeeded.

SQL&gt; grant select on aaaaa to x;
Grant succeeded.

SQL&gt; grant select on bbbbb to x;
Grant succeeded.

SQL&gt; conn / as sysdba
Connected.
SQL&gt; grant create synonym to y;

Grant succeeded.

SQL&gt; conn y/y
Connected.
SQL&gt; create synonym aaaaa for z.aaaaa;

Synonym created.

SQL&gt; create synonym bbbbb for z.bbbbb; 

Synonym created. 

//As you said you have renamed the synonyms.

SQL&gt; rename aaaaa to a1;

Table renamed.

SQL&gt; rename bbbbb to b1;

Table renamed.

SQL&gt; conn x/x
Connected.
SQL&gt; create or replace procedure xsql(sqlstring varchar2) as 
begin
execute immediate sqlstring;
dbms_output.put_line(sqlstring);
end xsql; 
/

Procedure created.

SQL&gt; alter session set current_schema=y;

Session altered.

SQL&gt; declare sql_code varchar2(2000):=
'create table basis as '|| 
'select basis.id, name, address from aaaaa basis join bbbbb basis_code on(basis.id=basis_code.id)';
begin
x.xsql(sql_code);
end;  
/
declare sql_code varchar2(2000):=
*
ERROR at line 1:
ORA-00942: table or view does not exist
ORA-06512: at "X.XSQL", line 3
ORA-06512: at line 5


SQL&gt; declare sql_code varchar2(2000):=
'create table basis as '|| 
'select basis.id, name, address from z.aaaaa basis join z.bbbbb basis_code on(basis.id=basis_code.id)';
begin
x.xsql(sql_code);
end; 
/

PL/SQL procedure successfully completed.