Как узнать, сколько еще будет выполняться запущенная процедура?

Как узнать, сколько ещё будет выполняться запущенная процедура? И нет ли блокировок при её выполнении?

Насколько понял, эта информация должна отображаться в системном представлении v$session_longops. Но не совсем понимаю, как эту информацию можно получить, так как процедура запущена, но ничего не выводится:

SELECT * 
FROM v$session_longops
WHERE sid = 123 

no rows selected

Ответы (1 шт):

Автор решения: 0xdb

TL;DR Как долго еще будет выполняться процедура узнать невозможно.
Сколько луна сделает оборотов вокруг земли, пока не упадёт на неё?.

Только реализовав в самой процедуре дополнительные функциональные возможности, можно приблизительно оценить оставшееся время выполнения:

Если выполнение процедуры блокируется (находится в состоянии ожидания) в результате выполнения SQL запросов или вызова других процедур запрашивающих блокировку, то посмотреть это можно таким простым запросом:

select 
    nvl (s.username, 'oracle') username, s.sid, s.serial#, blocking_session,
    w.event, w.wait_class, w.wait_time, w.seconds_in_wait, w.state
from v$session s 
join v$session_wait w on w.sid = s.sid 
where username = 'ME' 
order by w.seconds_in_wait desc
/

Сколько продлится ожидание, можно посмотреть в блокирующей сессии, например, как в этой теме: Как узнать оставшееся время работы запроса в Oracle?. Но будут ли при дальнейшем выполнении еще блокировки, узнать невозможно.


Практика - путь к совершенству (ц).

В текушей сессии (29) посылаем блокирующий запрос:

select dummy from dual for update

В другой сессии запускаем следующую процедуру:

create or replace procedure proc as
    rc sys_refcursor; 
begin
    open rc for select dummy from dual for update; 
    dbms_session.sleep (10);
    close rc; commit; 
end;
/
exec proc

Выполнение будет в ожидании, т.к. сессия 29 блокирует его:

USERNAME        SID    BLOCKER EVENT           WAIT_CLASS    WAIT_TIME   WAIT_SEC STATE  
-------- ---------- ---------- --------------- ------------ ---------- ---------- -------
ME               45         29 enq: TX - row   Application           0        326 WAITING
                               lock                                                      
                               contention                                                
→ Ссылка