Esse erro ocorre quando tentamos compilar um objeto que está em uso por algum processamento.
No exemplo abaixo, temos uma PACKAGE onde tentamos fazer a compilação.
SQL> alter PACKAGE XPTO.PK_DADOS_BANCO compile;
alter PACKAGE XPTO.PK_DADOS_BANCO compile
*
ERROR at line 1:
ORA-04021: timeout occurred while waiting to lock object
Podemos verificar "quem" está utilizando o objeto que queremos compilar através do sql abaixo:
SELECT SID, OWNER, OBJECT, TYPE FROM GV$ACCESS WHERE OBJECT = 'PK_DADOS_BANCO';
| SID | OWNER | OBJECT | TYPE |
| 6885 | PUBLIC | PK_DADOS_BANCO | SYNONYM |
| 7275 | ABCD | PK_DADOS_BANCO | CURSOR |
| 11223 | ABCD | PK_DADOS_BANCO | CURSOR |
| 7971 | PUBLIC | PK_DADOS_BANCO | SYNONYM |
| 10504 | XPTO | PK_DADOS_BANCO | PACKAGE |
| 558 | ABCD | PK_DADOS_BANCO | CURSOR |
| 558 | PUBLIC | PK_DADOS_BANCO | SYNONYM |
| 1280 | PUBLIC | PK_DADOS_BANCO | SYNONYM |
| 206 | XPTO | PK_DADOS_BANCO | PACKAGE |
| 206 | PUBLIC | PK_DADOS_BANCO | SYNONYM |
| 2574 | ABCD | PK_DADOS_BANCO | CURSOR |
A solução para este tipo de problema é esperar os processamentos que estão utilizando o objeto terminar, para que a compilação seja feita com sucesso ou podemos "matar" as sessões no banco de dados, com o comando alter system kill session, que estão utilizando o objeto que queremos compilar.
Referência:
http://www.ora00600.com/wordpress/scripts/plsql/ora-04021-timeout-occurred/