Oracle PL/SQL:如何检测过程是否已经 运行?

Oracle PL/SQL: How to detect if a procedure is ALREADY running?

请假设我们在包中有一个过程:

MY_PACKAGE.MY_PROCEDURE

此程序可以从许多用户启动。

如何修改程序以检测程序是否 当前 运行 从另一个程序启动用户?

最安全的检测方法是什么?

感谢您考虑我的请求。

编辑 01:"It'll depend on why you need to know if a proc is already running or not" ==> 如果程序当前 运行,则不会再次启动。

根据其他人提到的内容以及对 DBMS_LOCK 包 header 的快速阅读,您似乎可以使用各种 DBMS_LOCK 例程来完成您想要完成的任务做。如果我正确地阅读了 header 评论,你会想调用 ALLOCATE_UNIQUE 来获取唯一的命名锁的句柄,然后你会调用 REQUEST 并设置锁定模式到'x'(Exclusive)去尝试抢锁。如果 REQUEST 调用 returns 0 你可以继续 运行 你的例程。完成后,调用 RELEASE 使锁可供下一个调用者使用。

祝你好运。

您可以使用 DBMS_APPLICATION_INFO 包获取此类信息。

PROCEDURE MY_PROCEDURE(..) IS
BEGIN
DBMS_APPLICATION_INFO.SET_CLIENT_INFO('MY_PACKAGE.MY_PROCEDURE running');

   ... All your stuff

DBMS_APPLICATION_INFO.SET_CLIENT_INFO(NULL);
EXCEPTION
  WHEN OTHERS THEN
    DBMS_APPLICATION_INFO.SET_CLIENT_INFO(NULL);
    RAISE;
END MY_PROCEDURE;

为了查看,可以selectV$SESSION视图:

SELECT * 
FROM v$session 
WHERE client_info = 'MY_PACKAGE.MY_PROCEDURE running';

如果你得到任何记录那么程序是运行。