Come risolvere l’errore ORA-04021: fine del tempo di attesa , oggetto bloccato

Compilare un oggetto può far sollevare il seguente errore :

select

s.sid, s.serial#, p.spid,

s.username,

s.osuser,

s.program,

s.terminal,

s.module, s.action

, p.tracefile

, s.type

, s.logon_time

, s.state

, s.wait_time, s.seconds_in_wait, s.service_name

from

v$session s,

v$process p

where s.paddr = p.addr ;

Interrogando il processi che mostrano le sessioni che stanno ancora girando ..

select

a.object,

a.type,

b.sid,b.serial#,s.inst_id,

b.username,

b.osuser,

b.program,

s.status, s.sql_exec_start

from

v$access a,

v$session b, gv$session s

where a.sid = b.sid

and a.owner = DECODE(UPPER(‘&1’), ‘ALL’, a.object, upper(‘&1’))

and a.object = DECODE(UPPER(‘&2’), ‘ALL’, a.object, upper(‘&2’))

and b.sid = s.sid

and b.serial# = s.serial#

and s.status = ‘ACTIVE’

order by sql_exec_start nulls last ;

Trovo il processo sid (psid) : ps –ef | grep psid

Cerco se il padre ha processi figli :

In questo caso nessun figlio.

Comando per fermare una sessione :

SQL> ALTER SYSTEM KILL SESSION ‘sid,serial#’;

In ambiente RAC è possibile specificare il nodo, il parametro INST_ID è opzionale e va cercato interrogando la seguente vista GV$SESSION .

Comando per fermare una sessione comprensivo dell’opzione INST_ID:

SQL> ALTER SYSTEM KILL SESSION ‘sid,serial#,INST_ID’;

Con il commando base, c’è possibile indicare la clausola IMMEDIATE .

Nel nostro caso il padre non ha sotto processi , quindi:

  1. posso fermare la sessione sul DB

SQL> ALTER SYSTEM KILL SESSION ‘198,50795 IMMEDIATE ;

  1. posso fermare la sessione sulla macchina :

  1. Ricompilo il package , il quale viene compilato senza errori :

trova la descrizione dell’errore e ottieni la soluzione per risolverlo:

https://docs.oracle.com/pls/db92/db92.error_search?remark=homepage&prefill=ORA