2011-01-05 25 views
1

dbms_submitを使用してplsqlでタスクを分離(並列)する場合があります。 (私はサブミット呼び出しで任意の区間データを渡していないことに注意してください)。dbms_job.submitを使用したPLSQLでの複数のジョブの送信 - キューにジョブが見つかりませんでした。エラー

私の例では、何らかの理由で2番目のジョブで実行を呼び出そうとしたときに、キューエラーでジョブが見つかりません。私の2番目のジョブに関するアイデアは、ジョブキューに追加されていませんか?

​​

エラーレポート:

ORA-23421: "SYS.DBMS_SYS_ERROR"、ライン86 ORA-06512時:ジョブ番号154230がジョブキュー ORA-06512での仕事ではありませんで」 SYS.DBMS_IJOB "、行770 ORA-06512:「SYS.DBMS_JOB」の行267 ORA-06512:行14 23421. 00000 - 「ジョブ番号%sはジョブ・キュー内のジョブではありません」 *原因:指定されたジョブ番号で発信者に表示されるジョブはありません。 *処置:発信者から見えるジョブの番号を選択してください。

出力:ジョブ間隔にNULLを指定した場合

test1の

答えて

2

、行動は、ジョブを再実行しないであろうということです。実行されると、ジョブキューから削除されます。 NEXT_DATEを指定しなかったため、ジョブはサブミット時に実行を開始します。この手順を実行すると、2つのジョブが作成され、ただちに実行が開始されます。最初の呼び出しが終了する前に、まだキューに入っている間にもう一度実行したので、最初の呼び出しは成功します。ただし、2番目のジョブが実行されるまでに、実行が終了してサブミットが開始されたため、キューには存在しなくなりました。ここで説明するためにあなたの例の若干の変更があります:

DECLARE 
    jobno BINARY_INTEGER; 
    jobno2 BINARY_INTEGER; 
BEGIN 

    dbms_job.submit(jobno,'begin dbms_lock.sleep(10); dbms_output.put_line(''test1'');end;', next_date=>SYSDATE+1/24); 
    commit; 
    dbms_job.submit(jobno2,'begin dbms_lock.sleep(5); dbms_output.put_line(''test2'');end;', next_date=>SYSDATE+1/24); 
    commit; 

    dbms_output.put_line(jobno || ' ' || jobno2); 

    dbms_job.run(jobno); 
    dbms_job.run(jobno2); 
    dbms_job.run(jobno); 
END; 
/

私は同じエラーを取得しますが、出力の違いに注意してください。この変形例では

727 728 
test1 
test2 

、ジョブはすぐに実行を開始していません、 RUNプロシージャは両方を実行できますが、1回だけ実行できます。私が最初の仕事を実行しようとする2回目、それはそれの最初の実行のおかげで削除されています。

EDIT:

私はあなたが使用しているオラクルのバージョンを知りませんが、あなたはOracleのバージョン10gで、それにDBMS_JOBパッケージを交換しているように、はるかに堅牢DBMS_SCHEDULER packageに見たいと思うかもしれません。 DBMS_JOBは、下位互換性のために提供されています。スケジューラ機能のHere's a good overview

+0

+1、それは問題でした。提出後にコミットし、自動的にジョブを実行しました。明示的な実行は必要ありません。 – vicsz

3
set serveroutput on 

DECLARE  
jobno NUMBER; 
jobno2 NUMBER; 
begin 
dbms_job.submit(:jobno, 'begin dbms_lock.sleep(10); dbms_output.put_line(''test1'');end;', SYSDATE, 'SYSDATE + 1/86400', TRUE); 
commit; 
dbms_job.submit(:jobno2, 'begin dbms_lock.sleep(5); dbms_output.put_line(''test1'');end;', SYSDATE, 'SYSDATE + 1/86400', TRUE); 
commit; 
dbms_output.put_line(jobno || ' ' || jobno2); 
END; 

/
関連する問題