quarta-feira, 5 de outubro de 2016

ORA-04021: timeout occurred while waiting to lock object


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/