创建一个自增表,存储过程是每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
需要注意的是,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;
参考文章: