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

时间:2017-01-16 10:05:53

标签: oracle

有没有办法监控存储过程的执行时间? 如果执行时间超过某个固定时间,也要执行一些操作

2 个答案:

答案 0 :(得分:2)

这是dbms_profiler包。以前它应该设置使用。它创建了一个表服务。 更多细节可以在文档中找到: https://docs.oracle.com/cd/B19306_01/appdev.102/b14258/d_profil.htm#BJEFDBBC

答案 1 :(得分:1)

我不知道直接的方式,但您可以使用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)

如果您正在使用Scheduler作业,您可以直接监视和停止作业:

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;