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/