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';
如果你得到任何记录那么程序是运行。
请假设我们在包中有一个过程:
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';
如果你得到任何记录那么程序是运行。