在Oracle中监视存储过程的执行时间

问题描述:

有没有办法监视存储过程的执行时间? 也做一些操作,如果执行时间花费的时间比一些固定的时间更在Oracle中监视存储过程的执行时间

我不知道一个直接的方式,但是当程序运行时,你可以,你可以使用PL/SQL包DBMS_APPLICATION_INFO

Procedure MY_Procedure is 
begin 

DBMS_APPLICATION_INFO.SET_MODULE('MY_Procedure', 'Starting'); 
... 

DBMS_APPLICATION_INFO.SET_ACTION('Still working, please be patient'); 
... 

DBMS_APPLICATION_INFO.SET_ACTION('Finished'); 

END; 

查询(并根据需要执行一些操作):

SELECT SID, serial#, username, module, action, sql_exec_start 
FROM v$session; 

如果需要,还可以添加时间戳或执行时间,例如DBMS_APPLICATION_INFO.SET_ACTION('Started at '||systimestamp)

如果您正在使用计划程序作业工作,就可以监视并直接停止工作:

BEGIN 
    DBMS_SCHEDULER.SET_ATTRIBUTE( 
     NAME  => 'MY_JOB', 
     ATTRIBUTE => 'MAX_RUN_DURATION', 
     VALUE  => INTERVAL '10' MINUTE); 
END; 

,这经常通话:

DECLARE 

    CURSOR Jobs IS 
    SELECT JOB_NAME, LAST_START_DATE, MAX_RUN_DURATION 
    FROM USER_SCHEDULER_JOBS 
    WHERE JOB_NAME = 'MY_JOB' 
     AND STATE = 'RUNNING' 
     AND SYSTIMESTAMP - LAST_START_DATE > MAX_RUN_DURATION; 

BEGIN 

    FOR aJob IN Jobs LOOP 
     DBMS_SCHEDULER.STOP_JOB('MY_JOB', FORCE => TRUE); 
    END LOOP; 

END; 

因为这是DBMS_PROFILER包。以前它应该被设置为使用。它创建一个表服务。 更多详细信息请见文档: https://docs.oracle.com/cd/B19306_01/appdev.102/b14258/d_profil.htm#BJEFDBBC