Oracle创建存储过程并定时执行

创建一个自增表,存储过程是每5分钟定时执行一次,示例如下:

创建自增表,通过序列来实现:

建表:

 CREATE TABLE test  
 (  
     id INT NOT NULL PRIMARY KEY,  
     name VARCHAR2(40) NULL,  
     addr VARCHAR2(40) NULL,
     i_time  date
 ); 

序列:

CREATE SEQUENCE seq_test_id
    INCREMENT BY 1
    MINVALUE 1
    MAXVALUE 9999999999999999
    START WITH 1 
    NOCACHE ;

触发器:

CREATE TRIGGER TEST_TRIGGER  
before INSERT ON TEST FOR each ROW WHEN (NEW .id IS NULL)
BEGIN
SELECT seq_test_id.nextval into:New.ID from dual;
END;

执行插入语句: 

INSERT INTO TEST(name,addr,i_time) values('str','天津',sysdate);
查看结果:

 创建存储过程:

create or replace procedure p_test
is
begin
  INSERT INTO TEST(name,addr,i_time) values('str','天津',sysdate);
  commit;
END;

执行存过:

begin
  p_test;
end;

结果: 

设置定时任务JOB:

oracle中的job类似于Linux中crontab的作用,用于定时执行某些操作

相关视图:dba_jobs,user_jobs,all_jobs,dba_jobs_running

相关参数:job_queue_processes

相关包:dbms_job

780582474bb924c800ec0902eea4f617.png

需要注意的是,total time是所有历次任务运行的总时间之和。

设置或者修改定时任务,通过一下方式进行,无法通过rowid的方式修改数据。

declare
  job number;
BEGIN
  DBMS_JOB.SUBMIT(  
        JOB => job,  /*自动生成JOB_ID*/  
        WHAT => 'p_test;',  /*需要执行的存储过程名称或SQL语句*/  
        NEXT_DATE => sysdate,  /*初次执行时间-立即执行*/  
        INTERVAL => 'trunc(sysdate,''mi'')+1/(24*60)' /*每隔1分钟执行一次*/
      );  
  commit;
end;

如果设置定时任务不想立即执行,想第二天早上8点执行:

declare
  job number;
BEGIN
  DBMS_JOB.SUBMIT(  
        JOB => job,  /*自动生成JOB_ID*/  
        WHAT => 'p_test;',  /*需要执行的存储过程名称或SQL语句*/  
        NEXT_DATE => trunc(sysdate+1)+ 8/24,  /*初次执行时间-第二天早上8点*/  
        INTERVAL => 'trunc(sysdate+1)+ 8/24' /*每天早上8点执行一次*/
      );  
  commit;
end;

 查看调度的任务:

select * from user_jobs;

修改定时任务的间隔时间

declare
begin
  dbms_job.interval(24,interval => 'TRUNC(SYSDATE)+1');  /*第一个参数为job的ID,第二个参数interval: 计算下一次任务执行的时间表达式*/
  commit;
end;


修改下一次执行时间

declare
begin
   dbms_job.next_date(24,to_date('2020-11-9 12:08:00','yyyy-mm-dd hh24:mi:ss')); /*第一个参数:job的ID;第二个参数:要修改后的计算下一次执行的时间表达式*/
   commit;
end;

停止定时任务

declare
begin   
  dbms_job.broken(24,true,sysdate);        /*停止一个job,jobId, job的ID,里面参数true也可是false,next_date(某一时刻停止)也可是sysdate(立刻停止)。   */
commit;
end;

启动定时任务

declare
begin
   DBMS_JOB.RUN(24); /*24 job的id*/
   commit;
end;

 删除定时任务

declare
begin
  dbms_job.remove(24);  /*删除自动执行的job,参数是 job的id*/
  commit;
end;

参考文章:

创建Oracle定时任务_J*C的博客-CSDN博客_oracle定时任务

  • 2
    点赞
  • 32
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

大宇进阶之路

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值