我在后端安排了一份工作(用于发送电子邮件),使用DBMS_Scheduler。但是,要求允许用户安排电子邮件,并允许他们在点击按钮时立即发送电子邮件
。为实现这一目标,我做了以下安排:当用户点击按钮时,会调用一个过程。该过程执行上面提到的作业(使用run_job)。这使我能够使用相同的工作立即发送电子邮件,并在预定的时间发送电子邮件。
我现在面临的问题是:假设用户A点击了按钮。同时,用户B点击他系统上的按钮。然后用户B收到以下错误消息:作业已在运行。
如何在Oracle中多次执行相同作业(并行)?
答案 0 :(得分:2)
将DBMS_SCHEDULER.RUN
参数USE_CURRENT_SESSION
设置为TRUE
。
--Create a test job.
begin
dbms_scheduler.create_job(
job_name => 'TEST_JOB',
job_type => 'PLSQL_BLOCK',
job_action => 'BEGIN dbms_lock.sleep(3); END;');
end;
/
--This fails if run concurrently.
begin
dbms_scheduler.run_job(job_name => 'TEST_JOB', use_current_session => FALSE);
end;
/
--This can run concurrently.
begin
dbms_scheduler.run_job(job_name => 'TEST_JOB', use_current_session => TRUE);
end;
/
答案 1 :(得分:1)
如果您可以将作业转换为基于事件的作业,则可以使用轻量级作业来响应触发它们的事件。对于基于事件的作业,您可以将parallel_instances设置为true,从而允许同一作业的多个实例并行运行。
这是做你想做的事的方法。
轻量级并行工作旨在成为简单任务的短期工作。