4

私はOracle 10gR2に取り組んでいます。

そして、ここに私の問題があります-

私はプロシージャを持っています。別のプロシージャを呼び出すことになっている*proc_parent* (パッケージ内) と呼び、*user_creation*と呼びましょう。テーブルからいくつかの列を読み取るループ内で*user_creation*を呼び出す必要があります。これらの列の値はパラメーターとして*user_creation*プロシージャに渡されます。

コードは次のようになります。

FOR i IN (SELECT    community_id,
                        password,
                        username 
               FROM     customer 
               WHERE    community_id IS NOT NULL 
               AND      created_by = 'SRC_GLOB'
              )
     LOOP
        user_creation (i.community_id,i.password,i.username);
     END LOOP;

COMMIT;

user_Creation プロシージャは、いくつかのビジネス ロジックの Web サービスを呼び出し、応答に基づいてテーブルを更新します。

ここでマルチスレッドを使用できる方法を見つける必要があります。これにより、この手順の複数のインスタンスを実行して速度を上げることができます。*DBMS_SCHEDULER*とおそらく*DBMS_ALERT*を使用できることはわかっていますが、ループ内でそれらを使用する方法がわかりません。

誰かが私を正しい方向に導くことができますか?

ありがとう、アンクル

4

2 に答える 2

3

できることは、同時に多くのジョブを送信することです。例28-2 単一のトランザクションで一連の軽量ジョブを作成するを参照してください

これにより、1 つの tx で送信するすべてのジョブが同時に pl/sql テーブルに入力されます。それらがサブミットされる (有効になる) とすぐに、システムが処理できる数、またはリソース マネージャー プランで許可されている数だけ、実行が開始されます。

軽量ジョブのオーバーヘッドは非常に... 最小限/軽いです。

于 2011-11-21T17:00:50.170 に答える
1

この質問は締め切りたいと思います。ループ内で DBMS_SCHEDULER と DBMS_JOB (ただし DBMS_SCHEDULER が推奨されます) を使用して、ジョブを送信および実行できます。

たとえば、ループ内で呼び出すことができる DBMS_JOB を使用したサンプル コードを次に示します。

...
FOR i IN (SELECT community_id,
                 password,
                 username
          FROM   customer
          WHERE  community_id IS NOT NULL
          AND    created_by = 'SRC_GLOB'
         )
LOOP
DBMS_JOB.SUBMIT(JOB => jobnum,
                WHAT => 'BEGIN user_creation (i.community_id,i.password,i.username); END;'      
COMMIT;
END LOOP;   

SUBMITの後にコミットを使用すると、ジョブ (したがって手順) が並行して開始されます。

于 2012-06-05T05:40:35.603 に答える