これが簡単な仕事です。
SQL> create table log1 (ts timestamp)
2 /
Table created.
SQL> create or replace procedure printe as
2 begin
3 insert into log1 values (systimestamp);
4 commit;
5 end;
6 /
Procedure created.
SQL>
したがって、最初に、開始時間と間隔の両方を正しく指定して送信する必要があります。1日(1440)に何分あるか思い出せない場合は、角かっこを使用することをお勧めします。仕事の提出と日付の指定を比較してみましょう...
SQL> var job_no number
SQL> BEGIN
2 DBMS_JOB.SUBMIT
3 (
4 job =>:job_no,
5 WHAT=>'printe;',--Procedure
6 next_date=>sysdate+1/24*60,
7 interval=>'sysdate+1/24*60'
8 );
9 commit;
10 END;
11 /
PL/SQL procedure successfully completed.
SQL> print job_no
JOB_NO
----------
71
SQL>
...優先順位を表明するための角かっこ付き..。
SQL> BEGIN
2 DBMS_JOB.SUBMIT
3 (
4 job =>:job_no,
5 WHAT=>'printe;',--Procedure
6 next_date=>sysdate+1/(24*60),
7 interval=>'sysdate+1/(24*60)'
8 );
9 commit;
10 END;
11 /
PL/SQL procedure successfully completed.
SQL> print job_no
JOB_NO
----------
72
SQL>
明らかに、ジョブ71は実行されておらず、しばらくは実行されません。
SQL> select job, what, last_date, next_date, interval
2 from user_jobs
3 where job in (71,72)
4 /
JOB WHAT LAST_DATE NEXT_DATE INTERVAL
------ ------------ -------------------- -------------------- -----------------
71 printe; 05-MAY-2010 17:35:34 sysdate+1/24*60
72 printe; 03-MAY-2010 05:44:42 03-MAY-2010 05:45:34 sysdate+1/(24*60)
SQL>
監視ジョブ72...。
SQL> select * from log1
2 /
TS
-------------------------------------------------------------------
03-MAY-10 05:43:39.250000
03-MAY-10 05:44:42.296000
SQL>
それでもこれがうまくいかない場合は、どうすればよいですか?最初に、データベースがジョブを実行するように構成されているかどうかを確認します。これにはDBAアクセスが必要です。
SQL> select value
2 from v$parameter
3 where name='job_queue_processes'
4 /
VALUE
-------------------------
1000
SQL>
私の記憶が正しければ、Oracle 9iでは、このパラメータのデフォルト値は0です。ジョブを実行するには、ゼロ以外の値に設定する必要があります。
それが問題ではない場合は、アラートログでエラーメッセージを確認する必要があります。ディレクトリにはbackground_dump_dest
、失敗したジョブによって生成された.trcファイルが含まれている場合もあります。