Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 如果过程未在5分钟内完成,如何为其创建电子邮件警报?_Sql_Oracle_Plsql_Alert - Fatal编程技术网

Sql 如果过程未在5分钟内完成,如何为其创建电子邮件警报?

Sql 如果过程未在5分钟内完成,如何为其创建电子邮件警报?,sql,oracle,plsql,alert,Sql,Oracle,Plsql,Alert,我需要为用户在我们的应用程序中运行过程但该过程尚未完成时创建电子邮件警报。我知道如何生成电子邮件,但如何编写代码来检查该过程何时运行并确定其运行时间是否超过5分钟 我已经研究了所有的dbms实用程序,但没有一个能接近我所寻找的 我也知道如何放置长时间运行的会话,但我这里的问题是我只对一个过程感兴趣,从我收集的信息来看,sqlid可以更改。这就是我要做的,但既然这改变了,我怎么知道用户是在运行该过程还是在运行其他程序。我可以提取用户会话id,但他们可能同时运行多个过程。如何知道哪一个是我的目标过程

我需要为用户在我们的应用程序中运行过程但该过程尚未完成时创建电子邮件警报。我知道如何生成电子邮件,但如何编写代码来检查该过程何时运行并确定其运行时间是否超过5分钟

我已经研究了所有的dbms实用程序,但没有一个能接近我所寻找的


我也知道如何放置长时间运行的会话,但我这里的问题是我只对一个过程感兴趣,从我收集的信息来看,sqlid可以更改。这就是我要做的,但既然这改变了,我怎么知道用户是在运行该过程还是在运行其他程序。我可以提取用户会话id,但他们可能同时运行多个过程。如何知道哪一个是我的目标过程?

您也可以使用包,而不是使用专用的状态表

当过程运行时,您可以通过

SELECT SID, SERIAL#, USERNAME, OSUSER, MODULE, ACTION
from V$SESSION
where USERNAME = ...;

您可以运行两个过程(不同的会话),一个运行脚本/程序,另一个检查另一个程序是否已经运行完毕

下面的脚本检查其他程序是否在5分钟后运行完毕

DECLARE
    var VARCHAR2(1);
BEGIN
    DBMS_LOCK.SLEEP(300);
    BEGIN
        SELECT column_if_has_value_means_program_was_done
          INTO var
          FROM some_table_that_your_procedure_will_update;
    EXCEPTION
        WHEN NO_DATA_FOUND THEN
            NULL;
    END;
    IF var IS NULL THEN
        SEND_EMAIL_PROCEDURE;
    END IF;
END;
/

我确实找过了,但没有什么能接近我要找的。我应该为你列出我的研究吗?我发布它是因为我不相信你在来这里寻求解决方案之前做过任何研究甲骨文在谷歌上的“发现长时间运行的查询”是一个很好的开始。我知道你从哪里来,所以我就到此为止。我用谷歌搜索了一下,我知道它可以在哪里查看长时间运行的会话,但我只对运行时的一个过程感兴趣。我们有数百个会话处于活动状态,我需要找到一个或多个会话(如果有特定的过程)。我将继续观察。要考虑的一个方法是将程序的开始时间和进程ID写入状态表,并在完成时将其删除。一个单独的进程可以按照您希望的任何频率检查该表,如果它发现一个运行时间超过5分钟的条目,发送一封电子邮件——如果合适的话,可能会杀死该进程。当您将任何东西写入状态表时,考虑事务。我认为您应该使用自治事务
DECLARE
    var VARCHAR2(1);
BEGIN
    DBMS_LOCK.SLEEP(300);
    BEGIN
        SELECT column_if_has_value_means_program_was_done
          INTO var
          FROM some_table_that_your_procedure_will_update;
    EXCEPTION
        WHEN NO_DATA_FOUND THEN
            NULL;
    END;
    IF var IS NULL THEN
        SEND_EMAIL_PROCEDURE;
    END IF;
END;
/