Existe-t-il un moyen de surveiller le temps d'exécution de la procédure stockée? Également effectuer certaines opérations si le temps d'exécution prend plus d'un temps fixe

0
Java Geo 16 janv. 2017 à 13:05

2 réponses

Meilleure réponse

Je ne connais pas de moyen direct mais vous pouvez utiliser le package 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;

Pendant que la procédure est en cours d'exécution, vous pouvez interroger (et effectuer certaines actions si nécessaire) par ceci:

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

Si nécessaire, vous pouvez également mettre un horodatage ou une heure d'exécution, par ex. DBMS_APPLICATION_INFO.SET_ACTION('Started at '||systimestamp)

Si vous travaillez avec des travaux Scheduler, vous pouvez surveiller et arrêter les travaux directement:

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

Et l'appeler fréquemment:

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;
1
Wernfried Domscheit 16 janv. 2017 à 10:28

Pour cela, c'est le package dbms_profiler. Auparavant, il devrait être configuré pour être utilisé. Il crée un service de table. Plus de détails peuvent être trouvés dans la documentation: https://docs.oracle.com/cd/ B19306_01 / appdev.102 / b14258 / d_profil.htm # BJEFDBBC

2
Artem Kharkunov 16 janv. 2017 à 10:41