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
の値を渡す必要があります。 。 - 必須ではありませんが、ジョブを1回作成する方が一般的です(
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;