dbms_job
(または) パッケージを使用してdbms_scheduler
、並行して実行されるジョブを送信できます。を使用している場合dbms_job
、ジョブの送信はトランザクションの一部になるため、トランザクションが完了するとジョブが開始されます。
CREATE PACKAGE BODY pkg IS
CREATE PROCEDURE do
IS
l_jobno pls_integer;
BEGIN
dbms_job.submit(l_jobno, 'begin other_pkg.other_proc; end;' );
dbms_job.submit(l_jobno, 'begin other_pkg2.other_proc2; end;' );
dbms_job.submit(l_jobno, 'begin other_pkg3.other_proc3; end;' );
END;
END;
を使用している場合dbms_scheduler
、新しいジョブの作成はトランザクションではありません (つまり、新しいジョブを作成するたびに暗黙的なコミットが行われます)。このプロシージャが呼び出されるトランザクションで他の作業が行われている場合、トランザクションの整合性に問題が生じる可能性があります。一方、 を使用しdbms_scheduler
ている場合は、事前にジョブを作成し、単純にプロシージャから実行する方が簡単な場合があります (または、 を使用dbms_scheduler
して、別のアクションまたはイベントに応答してジョブを実行するチェーンを作成します)。キュー上のメッセージ)。
もちろん、どちらのソリューションでも、これら 3 つのジョブの進行状況を監視するためのインフラストラクチャを構築する必要があります。ただし、ジョブがいつ成功するか (およびエラーが生成されるかどうか) を気にする必要があります。
使用する場合DBMS_SCHEDULER
- 動的 SQL を使用する必要はありません。を捨てて、他のプロシージャと同じように、パッケージのプロシージャを直接
EXECUTE IMMEDIATE
呼び出すことができます。DBMS_SCHEDULER
- を呼び出すとき
RUN_JOB
は、2 番目のパラメーターを渡す必要があります。このuse_current_session
パラメーターは、ジョブを現在のセッションで実行する (およびブロックする) か、別のセッションで実行するか (この場合、現在のセッションを続行して他のことを実行できる) を制御します。複数のジョブを並行して実行したいので、 の値を渡す必要がありますfalse
。
auto_drop
必須ではありませんが、( falseに設定して) ジョブを一度作成し、手順から実行する方がより一般的です。
したがって、おそらくパッケージ外でジョブを作成したいと思うでしょう。そうすれば、手順は次のようになります
CREATE PACKAGE BODY pkg IS
CREATE PROCEDURE do
IS
BEGIN
DBMS_SCHEDULER.RUN_JOB('job_other_pkg.other_proc', false);
DBMS_SCHEDULER.RUN_JOB('job_other_pkg2.other_proc2', false);
DBMS_SCHEDULER.RUN_JOB('job_other_pkg3.other_proc3', false);
END;
END;