终止正在运行的子过程调用

时间:2019-03-26 08:53:10

标签: oracle plsql

我有一个过程将调用另一个过程,但是有时子过程要花费2分钟或更长时间才能完成。我试图找到一种方法:

  • 如果被调用的子过程在20秒后仍在运行,则终止它
  • 或在20秒后将子过程RETURN强制执行到调用方过程中

有什么办法可以做到这一点?

呼叫者功能:

 IF .... THEN ...
   l_result := PKG_B.TRXN_PROC (PI_QUOT_NUM => pi_quot_num );    
END IF;

1 个答案:

答案 0 :(得分:3)

一个选项可能是使用dbms_scheduler作为后台作业运行该过程,休眠20秒钟,然后终止该作业。

dbms_scheduler.run_job('MY_JOB_NAME');
DBMS_LOCK.sleep(seconds => '20');
SELECT STATE INTO v_state FROM USER_SCHEDULER_JOBS
   WHERE JOB_NAME = 'MY_JOB_NAME';
IF v_state = 'RUNNING' THEN
   dbms_scheduler.STOP_JOB(job_name=>'MY_JOB_NAME',force=>true);
END IF;

这只是为了给您一个想法,而不是一个功能齐全的代码。如果需要,建议添加更多检查/例外。还建议您每隔一周左右检查一次,而不是等待 full 20 ,而是由您选择。

运行它的用户可能需要以下授权。

grant create job , manage scheduler to your_user;
grant execute on dbms_lock to your_user;