sql >> データベース >  >> RDS >> Oracle

PL/SQLでのコールの並列化

    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;
    


    1. OracleDatabaseでNLSパラメータの値を確認する方法

    2. MySQLチュートリアル:MySQL IN句(基本)

    3. スプールコマンド:SQLステートメントをファイルに出力しません

    4. SQLServerでの監査トリガーの作成