1

我使用 DBMS_Scheduler 在后端安排了一项工作(用于发送电子邮件)。然而,一个要求是允许用户安排电子邮件以及允许他们在单击按钮时立即发送电子邮件。

为了做到这一点,我做了如下安排:当用户点击一个按钮时,一个过程被调用。该过程执行我上面提到的作业(使用 run_job)。这使我可以使用相同的作业立即发送电子邮件,以及稍后在预定的时间发送它们。

我现在面临的问题是:假设用户 A 点击按钮。同时,用户 B 点击他系统上的按钮。然后用户 B 收到以下错误消息:作业已在运行。

如何在 Oracle中多次(并行)执行相同的作业?

4

2 回答 2

2

DBMS_SCHEDULER.RUN参数设置USE_CURRENT_SESSIONTRUE

--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;
/
于 2013-11-05T06:28:07.340 回答
1

如果您可以将作业转换为基于事件的作业,则可以使用轻量级作业来响应触发它们的事件。对于基于事件的作业,您可以将 parallel_instances 设置为 true,从而允许同一作业的多个实例并行运行。

这是做你想做的事的方法。

轻量级并行作业旨在成为具有简单任务的短期作业。

于 2013-11-05T10:38:15.837 回答