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

SQLDeveloperで非同期ストアドプロシージャを実行します

    それぞれがプロシージャを1000/N回呼び出すNセッションをシミュレートしたいので、おそらく次のようなことをします

    CREATE OR REPLACE PROCEDURE call_myproc_n_times( p_n IN NUMBER )
    AS
      p_status         NUMBER;
      p_ora_error_code VARCHAR2(1000);
      p_ora_error_msg  VARCHAR2(1000);
    BEGIN
      FOR i IN 1 .. p_n 
      LOOP
        myproc( 'test', 
                p_status, 
                p_ora_error_code, 
                p_ora_error_msg );
      END LOOP;
    END;
    
    DECLARE
      l_num_sessions     number := 10;
      l_exec_per_session number := 100;
      l_jobno            pls_integer;
    BEGIN
      FOR i IN 1 .. l_num_sessions
      LOOP
        dbms_job.submit( 
          l_jobno,
          'BEGIN ' ||
          '  call_myproc_n_times( ' || l_exec_per_session || ' ); ' ||
          'END;',
          sysdate + interval '1' minute );
      END LOOP;
      commit;
    END;
    

    この例では、データベースのJOB_QUEUE_PROCESSESを想定して、各セッションが100回連続してプロシージャを実行する10個のセッションを開始します。 は少なくとも10です。これは、Oracleがバックグラウンドで同時に10個のジョブを実行できることを意味します。 CALL_MYPROC_N_TIMESの作成 手順は厳密には必要ありません。ジョブで実行する文字列の作成が簡単になるだけです。

    別の方法は、それぞれがMYPROCと呼ばれる1000個のジョブを送信することです。 一度、JOB_QUEUE_PROCESSESに依存します 同時に実行されるジョブの数を制限するパラメーター。それはうまくいくでしょう、より少ない同時セッションをより多く実行したいのであれば、データベースパラメータを変更するのはもっと難しいです-L_NUM_SESSIONSを調整するのは簡単です 私が投稿したコードで。




    1. MySQLテーブルを日ごとにパーティション化する方法は?

    2. MySQL-値のペアを一意にする

    3. MySQLカバーvsコンポジットvs列インデックス

    4. over句に正しい構文を使用するMySql