2010-05-02 57 views
4

我已经完成了这项工作,应该在1分钟的时间间隔内执行,但它不起作用。当我使用execute dbms_job.run(2);它被执行。 printe是一个程序 请建议!试图让工作在每1分钟后执行,但它不工作?

BEGIN 
    DBMS_JOB.SUBMIT (
     job =>:job_no, 
      WHAT=>'printe;',--Procedure 
      next_date=>sysdate+1/24*60, 
      interval=>'sysdate+1/24*60' 
     ); 
    commit; 
END; 
+1

你如何检查程序是否运行?它有什么作用? – 2010-05-02 14:25:20

+2

这段时间看起来不对。如果你希望它每分钟执行一次,不应该是'SYSDATE +((1/24)/ 60)'的间隔吗?按照规定,我认为它会每60小时重复一次。 – 2010-05-03 01:34:43

回答

4

尝试NEXT_DATE = SYSDATE +(60年1月24日)和时间间隔=(60年1月24日)...

+0

它不工作! – Vineet 2010-05-02 09:12:22

4

下面是一个简单的工作。

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> 

所以第一件事就是提交它的开始时间和正确指定的时间间隔。如果你不记得一天中有多少分钟(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文件。

+0

除job_queue_processes外,还有job_queue_interval,这是数据库多久被唤醒并查找要运行的作业的频率。你需要它少于60(秒)。 – 2010-05-03 13:16:04

+0

我不知道究竟是什么原因,但在我的情况下,工作按预期运行了一段时间,然后它在下一分钟就没有了。我正在使用oracle 9i,并且计划每分钟运行一次该作业。 – viveksinghggits 2017-07-21 07:21:51

+0

@viveksinghggits - 真的不知道你期待我做什么。在我有充分权限的系统中诊断间歇性错误已经很困难了。没有任何信息的随机远程系统无法做任何事情。 – APC 2017-07-21 07:36:49