试图在每 1 分钟后执行一项工作,但它不起作用?

Posted

技术标签:

【中文标题】试图在每 1 分钟后执行一项工作,但它不起作用?【英文标题】:Trying to make a job to be executed after each 1 minute,but its not working? 【发布时间】:2010-05-02 08:39:22 【问题描述】:

我做了这个工作,应该每隔 1 分钟执行一次,但它不起作用。当我使用execute dbms_job.run(2); 时,它会被执行。 printe 是一个程序 请推荐!

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

【问题讨论】:

如何检查程序是否运行?它有什么作用? 那个间隔看起来不对。如果您希望它每分钟执行一次,间隔不应该是'SYSDATE +((1 / 24)/ 60)'吗?正如指定的那样,我认为它会每 60 小时重复一次。 【参考方案1】:

试试 next_date = sysdate + (1/24/60) 和 interval = (1/24/60)...

【讨论】:

【参考方案2】:

这是一个简单的工作。

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 文件。

【讨论】:

除了 job_queue_processes,还有 job_queue_interval,它是数据库唤醒并寻找要运行的作业的频率。您需要它小于 60(秒)。 我不知道究竟是什么原因,但就我而言,该作业按预期运行了一段时间,然后在下一分钟就没有了。我正在使用 oracle 9i,作业计划每分钟运行一次。 @viveksinghggits - 真的不确定你希望我做什么。在我拥有完全访问权限的我自己的系统中诊断间歇性错误已经够难的了。没有任何信息的随机远程系统不可能做任何事情。 我只能说,每分钟运行的工作似乎是一个糟糕的架构决策。您可能需要一个持续运行的后台进程,该进程会休眠一分钟然后醒来并执行某些操作。也许它会轮询一个消息堆栈(表)并执行一个子例程,这是一种排队解决方案。

以上是关于试图在每 1 分钟后执行一项工作,但它不起作用?的主要内容,如果未能解决你的问题,请参考以下文章

我正在尝试设置角色命令和设置频道命令。我试图这样做,但它不起作用

如果该记录尚不存在但它不起作用,我试图仅将新记录插入数据库

试图为 UITextfield 宽度约束设置动画,但它不起作用

试图在 Python 脚本中复制文件,但它不起作用

试图用实际数据替换占位符文本,但它不起作用

我试图总结给定数组中的数字,使用 recursion ,尝试了这段代码,但它不起作用。为啥?