如何创建在工作日(周一至周五)上午5:30运行的dbms作业

时间:2017-02-14 07:21:05

标签: oracle plsql jobs dbms-job

我想使用工作日(周一至周五)上午5:30运行的 DBMS_JOB.SUBMIT 包创建dbms作业。我不确定next_Day和interval之间应该传递什么值。有人可以帮忙吗?

2 个答案:

答案 0 :(得分:3)

使用自{10}以来可用的dbms_schedular包,您可以使用'repeat_interval'参数,如下所示:

BEGIN
    DBMS_SCHEDULER.CREATE_JOB (
            job_name => 'MY_JOB',
            job_type => 'PLSQL_BLOCK',
            job_action => 'your code',
            number_of_arguments => 0,
            start_date => NULL,
            repeat_interval => 'FREQ=WEEKLY;BYTIME=053000;BYDAY=MON,TUE,WED,THU,FRI',
            end_date => NULL,
            enabled => FALSE,
            auto_drop => FALSE,
            comments => '');

END;
/

此外,如果您使用的是诸如SQL Developer之类的IDE,则可以轻松设置作业的详细信息,而无需担心语法。实际上,上面的代码是由SQL Developer

生成的

<强>更新
使用dbms_job(未测试)

尝试以下操作
DECLARE
   l_job_number NUMBER;
BEGIN
   dbms_job.submit( 
          job       => l_job_number ,
          what      => 'your code',
          next_date => trunc(sysdate)+05/24+30/1440,
          interval  => CASE WHEN (to_char(sysdate,'Day') IN ('Monday','Tuesday','Wednesday','Thursday','Friday')) THEN trunc(sysdate)+05/24+30/1440 else null end 
          );
END;
/

答案 1 :(得分:0)

首先,我们需要创建一个用户定义的函数,如下所示: -

CREATE OR REPLACE FUNCTION GET_DATE RETURN DATE
is 

V_DAY VARCHAR2(10);
V_DATE DATE;

BEGIN

SELECT (to_char(sysdate,'fmDay')) INTO V_DAY FROM DUAL;

IF(V_DAY='Monday' OR V_DAY='Tuesday' OR V_DAY='Wednesday' OR V_DAY='Thursday') THEN


SELECT trunc(sysdate+1)+05/24+30/1440 INTO V_DATE FROM DUAL;
RETURN V_DATE;

ELSE

SELECT trunc(sysdate+3)+05/24+30/1440 INTO V_DATE FROM DUAL;
RETURN V_DATE;

END IF;

END;
/

之后我们需要以下列方式创建工作: -

DECLARE
  XYZ NUMBER;
BEGIN
  SYS.DBMS_JOB.SUBMIT
  ( job       => XYZ 
   ,what      => 'BEGIN PROC_NAME; END;'
   ,next_date => to_date('23/03/2017 05:30:00','dd/mm/yyyy hh24:mi:ss')
   ,interval  => 'GET_DATE'
   ,no_parse  => FALSE
  );

END;
/