Sounds like you are most likely hitting a DDL locking problem.

You may have already looked at this, but you can get the locks for a particular user with a script similar to:
Code:
col "CLIENT/PID" for a20
col owner for a12
col username for a12
set linesize 132
select l.session_id, s.serial#, l.owner, s.username,
   decode(s.process, NULL, s.machine, s.machine || ' PID: ' 
      ||  to_char(s.process)) "CLIENT/PID" ,
   s.server, s.status
from dba_ddl_locks l, v$session s
where s.sid = l.session_id
and l.name = upper('&1')
/
Also, if you think you know the package that is causing the problem, you can see who also holds a lock on that package with a script similar to:

Code:
col username for a12
col object_locked for a40
col MACHINE/PID for a30
col program for a30
set linesize 132
set verify off
accept objowner prompt 'Object Owner: '
accept objname prompt 'Object Name : '

select s.username, s.sid, s.program, d.owner || '.' || d.name object_locked,
decode(s.process, NULL, s.machine, s.machine || ' PID: ' ||  to_char(s.process)) "MACHINE/PID"
from v$session s, dba_ddl_locks d
where s.sid = d.session_id
and d.type like '%/Procedure/%'
and d.owner = upper('&objowner')
and d.name = upper('&objname')
/