4

私はこれを実現しようとしています:

declare
  Contador number;

begin
 ATUALIZAR_VAL_MAT_PENDENTES(Contador);

 if Contador = 0 then
  dbms_scheduler.disable('JOB_ATUALIZAR_VAL_MAT_PEND');
  end if;
end;

カウンターがゼロを返すと、この JOB が無効になります。しかし、私は得ています:

"ORA-27478: o ジョブ "SPEDO.JOB_ATUALIZAR_VAL_MAT_PEND" が実行されました"

この最後のビットは、「実行中」を意味します。

だから、これはジョブが実行中であり、それ自体をシャットダウンできないためだと思います。

別のアプローチは終了日を変更することだと思いますが、これを行うための構文が見つからないようです。

誰でも助けることができますか?これは達成可能ですか?

4

2 に答える 2

3

助けてくれた@Shankarに感謝します。これは、私がやろうとしていたことを達成する方法です:

declare
  Contador number;

begin
 ATUALIZAR_VAL_MAT_PENDENTES(Contador);

 if Contador = 0 then
   dbms_scheduler.set_attribute('JOB_ATUALIZAR_VAL_MAT_PEND', 'end_date', systimestamp + 1);
  end if;
end;

私はすでにこれを考えていましたが、「値」パラメーターが「ブール値」であるとインテリセンスがポップアップしたとき、日付を渡そうとさえしませんでした。現在は問題なく動作していますが、追加する必要があると思われるものが 1 つあります。

終了日を 1 時間または数分先に設定しようとすると、これは機能しません。実際に日を変更する必要があります。そうしないと、ORA-27483: "string.string" has an invalid END_DATE.

于 2015-01-06T20:16:33.673 に答える
0

私はあなたが2つのことをすることができると思います.

  1. ジョブを強制停止してから無効にします。
declare
  Contador number;    
begin
 ATUALIZAR_VAL_MAT_PENDENTES(Contador);

 if Contador = 0 then
  DBMS_SCHEDULER.stop_JOB (job_name => 'JOB_ATUALIZAR_VAL_MAT_PEND',force=>true);
  dbms_scheduler.disable('JOB_ATUALIZAR_VAL_MAT_PEND');
  end if;
end;
  1. ジョブの完了を確認してから無効にします。
SELECT status FROM USER_SCHEDULER_JOB_LOG
WHERE job_name = 'JOB_ATUALIZAR_VAL_MAT_PEND' and operation = 'RUN' ORDER BY log_date desc
offset 0 rows fetch next 1 row only; -- This will give you the latest run's status

これを変数 (たとえば status_) に格納してから、以下のようにチェックします。

declare
  Contador number;

begin
 ATUALIZAR_VAL_MAT_PENDENTES(Contador);

 if Contador = 0 and status_ ="Succeeded" then
  DBMS_SCHEDULER.stop_JOB (job_name => 'JOB_ATUALIZAR_VAL_MAT_PEND',force=>true);
  dbms_scheduler.disable('JOB_ATUALIZAR_VAL_MAT_PEND');
  end if;
end;
于 2015-01-06T18:04:09.543 に答える