Yes. For example - here's 50 customers, each with a table
SQL> begin
2 for i in 1 .. 50 loop
3 begin
4 execute immediate 'drop user cust'||i||' cascade';
5 exception
6 when others then null;
7 end;
8 execute immediate 'grant resource, connect to cust'||i||' identified by blah';
9 execute immediate 'alter user cust'||i||' quota 10m on users';
10 execute immediate 'create table cust'||i||'.T as select * from all_objects where rownum = 1';
11 end loop;
12 end;
13 /
PL/SQL procedure successfully completed.
Now they all run their "app"
SQL> col sortkey nopri
SQL> select rownum sortkey, 1 sortkey, 'connect cust'||level||'/blah' from dual connect by level <= 50
2 union all
3 select rownum sortkey, 2 sortkey, 'exec declare x int; begin select count(*) into x from t; end;' from dual connect by level <= 50
4 order by 1,2;
connect cust1/blah
exec declare x int; begin select count(*) into x from t; end;
connect cust2/blah
exec declare x int; begin select count(*) into x from t; end;
connect cust3/blah
exec declare x int; begin select count(*) into x from t; end;
...
...
...
At the end of that, what do I have in my shared pool
SQL> @pt "select * from v$sqlarea where sql_text like 'SELECT COUNT(*) FROM T'"
SQL_TEXT : SELECT COUNT(*) FROM T
SQL_FULLTEXT : SELECT COUNT(*) FROM T
SQL_ID : 48k1njhd4ras3
SHARABLE_MEM : 664359
PERSISTENT_MEM : 2354976
RUNTIME_MEM : 2293776
SORTS : 0
VERSION_COUNT : 51 <<<==========
LOADED_VERSIONS : 51