2011-01-04 5 views
4

私はPL/SQLでJavaのthread.join()と同等のものを探しています。私。私はいくつかの仕事(スレッド)を開始し、それらが終了するのを待っています。サブミットされたジョブがOracle PL/SQLで終了するのを待っていますか?

これはPL/SQLでどのように可能ですか?

私はdbms_job.submitを使用することを考えています(廃止予定です)。 dbms_schedulerも選択肢です。

マイコード:

DECLARE 
    jobno1 number; 
    jobno2 number; 
BEGIN 

    dbms_job.submit(jobno1,'begin dbms_lock.sleep(10); dbms_output.put_line(''job 1 exit'');end;'); 
    dbms_job.submit(jobno2,'begin dbms_lock.sleep(10); dbms_output.put_line(''job 2 exit'');end;'); 

    dbms_job.run(jobno1); 
    dbms_job.run(jobno2); 

    //Need code to Wait for jobno1 to finish 
    //Need code to Wait for jobno2 to finish 

END; 

答えて

5

DBMS_SCHEDULERチェーンを使用してAdam Hawkesのソリューションが気に入っています。私はまだDBMS_JOBを使用していて、まだコードを書き直していないので、それについてはわかりませんでした。

とにかく...私が現在使用しているソリューションは、DBMS_JOBの組み合わせです(DBMS_JOBは注意しているように廃止されているので、おそらくDBMS_SCHEDULERを使用する必要があります)およびDBMS_ALERTです。

ジョブは、DBMS_JOBを使用して作成されます。次に、dbms_alert.registerとdbms_alert.waitanyを使用してジョブの完了を待ちます。ジョブが完了すると、dbms_alert.signalが使用されます。ジョブが完了し、親が準備が整う前に信号が出ても問題はあるかもしれませんが、それを回避できると確信しています。

DBMS_SCHEDULERチェーンはおそらくこれを行うべきではないかと思いますが、完全性のために私の答えを追加しています。

+0

あなたがまだ 'DBMS_SCHEDULER'の代わりに' DBMS_JOB'を使っているならば、同様に良い解決策です! –

+0

+1、素敵なアイデア..どのように私は2つのジョブを完了するのを待つだろう(あなたがそこにwaitaniのステップが呼び出される前に仕事が終了する確率があるというように)終了する任意のアイデア。私が考えることができる1つの解決策は、両方の仕事に同じイベントを投げて、それを2回キャッチすることです。 – vicsz

+0

あなたが言ったように、WaitAnyはトリックを行います。 – vicsz

10

これはDBMS_SCHEDULERジョブスケジューリングでチェーンを使用して達成されます。 Oracle Documentationには、あなたが望むものを達成するための例があります。基本的には、ステップ、コードの小さな部分を実行構造で定義します。あなたの例では、最初のステップは(通常は初期化を行う)開始ステップであり、次に並列(jobno1とjobno2)で実行される2つのステップと、並列ジョブが完了するとアクティブになる最後のステップ。

+0

+1、nice私はdbms_schedulerの連鎖能力について知らなかった...しかし、私は最後の2ステップ(並行して実行する)を待って、ブロックの前に終了する方法はまだ分かりません。 – vicsz

関連する問題