ORACLE 创建作业,定时执行存储过程

时间:2024-02-21 16:18:37

1,创建存储过程

示例:给表ATT_ST_GW_R_Z,执行插入操作。

create or replace procedure PROC_ATT_ST_GW_R_Z as
begin
  insert into ATT_ST_GW_R_Z
    (select GUID, A.ST_CODE, to_date(to_char(sysdate, \'yyyy-MM-dd HH24:mi:ss\'),\'yyyy-MM-dd HH24:mi:ss\') TM, null Z, round(A.BD+dbms_random.value,2) BD, null RMSY, 0 NOTE, to_date(to_char(sysdate, \'yyyy-MM-dd HH24:mi:ss\'),\'yyyy-MM-dd HH24:mi:ss\') FROM_DATE, null TO_DATE
    from (select * from ATT_ST_GW_R_Z order by tm desc, st_code asc) A
    where A.ST_CODE in (select distinct ST_CODE from ATT_ST_GW_R_Z));
  commit;
end;

=====执行成功=====:

2,创建定时作业

示例:创建存储过程JOB_ATT_ST_GW_R_Z,定期每天早8点只执行存储过程PROC_ATT_ST_GW_R_Z;

declare
  JOB_ATT_ST_GW_R_Z number;
BEGIN
  DBMS_JOB.SUBMIT(
        JOB => JOB_ATT_ST_GW_R_Z,  /*自动生成JOB_ID*/  
        WHAT => \'PROC_ATT_ST_GW_R_Z;\',  /*需要执行的存储过程名称或SQL语句*/  
        NEXT_DATE => to_date(\'2019-12-18 14:00:00\', \'yyyy-mm-dd hh24:mi:ss\'),  /*初次执行时间*/  
        INTERVAL => \'TRUNC(SYSDATE + 1) + 8/24\' /*每天早上8点执行*/
      );
  commit;
end;

=====执行成功=====:

3,作业创建完成后,作业无法自动执行解决办法

(1)用oracle管理员账号登录,

(2)重启oracle所在服务器的服务OracleServiceORCL和OracleOraHome90TNSListener 

(3)用命令窗口,修改job_queue_processes参数值,默认是0,修改为0-1000的整数。

3,手动运行作业方法

示例:启动第2步创建的作业,run方法的参数为作业编号。

作业编号查询语句:select * from user_jobs

启动作业语句:

begin
  dbms_job.run(27); 
  commit;
end;

5,容易出现问题解决方案

创建失败,重点关注存储过程的sql语句是否正确(例如出入数据和数据库表字段不一致),可以把具体SQL语句执行一遍,查找错误原因。