日常记录-oracle建立定时计划,调用存储过程
- 前言
- oracle 数据库有一个表,数据量50亿多,现在需要对表进行全量的 update 操作,因为全表的数据量过大,所以无法直接update,最后商量采用定时计划调用存储过程,对表数据分块,进行update操作。
- 建立存储过程
-
我这边需要在存储过程定义两个变量,一个进行记录上次操作的值,另一个进行加恒值,使 update 操作的是一个区间的所有的数据。并且每次操作完毕,记录上次的操作值,下次定时计划调用的时候,在读取出来,然后相加恒值,继续update。
-
打开plsql,选择Procedures,进行新建。
CREATE OR REPLACE procedure update_gps is ROWNUM_BEGIN NUMBER(35); ROWNUM_END NUMBER(35); begin SELECT NUMTEST INTO ROWNUM_BEGIN from TEST WHERE ROWNUM = 1; ROWNUM_END := ROWNUM_BEGIN+10000; dbms_output.put_line('ROWNUM_END = ' || ROWNUM_END); UPDATE T_PLT_VEHICLE_LOCATION SET LON = REGEXP_REPLACE ( REGEXP_REPLACE ( lon, '[^0-9]+', '' ), '(\d{3})(\d{1,6})?(.*)', '\1.\2' ), LAT = REGEXP_REPLACE ( REGEXP_REPLACE ( lat, '[^0-9]+', '' ), '(\d{2})(\d{1,6})?(.*)', '\1.\2' ) WHERE ROWNUM > ROWNUM_BEGIN and ROWNUM <= ROWNUM_END; dbms_output.put_line('update 1 '); commit; UPDATE TEST set NUMTEST=ROWNUM_END WHERE ROWNUM = 1; dbms_output.put_line('update 2 '); commit; end update_gps;
-
从上面的sql 可以看出,我这边定义了两个变量,分别是 ROWNUM_BEGIN 与 ROWNUM_END。不同的是,一个是sql赋值,一个是直接赋值。
-
进行编译-编译成功
-
进行debug 测试,测试成功
-
备注:这里我在测试的时候,本地会一直出现运行中状态,我后面使用的是debug 进行测试,测试成功。
-
- 建立定时计划
-
定时计划,我这边的需求是每10分钟执行一次。
-
备注: 这里我在网上搜索看的时候,使用的建立定时计划一直失败,后面在群里询问,说是oracle 11 以后使用我现在的建立定时计划的sql 比较好。
begin dbms_scheduler.create_job( job_name => 'update_job', job_type => 'STORED_PROCEDURE', job_action => 'update_gps', start_date => to_date('2020-01-20 12:30:00','yyyy-mm-dd hh24:mi:ss'), repeat_interval => 'freq=minutely;interval=10', enabled => true, comments => '定时处理轨迹坐标'); end;
-
这里可以看到,我的job_type 是 STORED_PROCEDURE 也就是存储过程,job 的action 是 我的函数名,下面的 repeat_interval 是 执行的规则,我设置的是按照分钟执行,然后 10分钟一次。上面的start_date 是开始执行的时间。
-
然后执行这个建立定时计划的sql。 显示执行成功。
-
- 查看定时计划
#查询所有用户调度作业 select * from ALL_SCHEDULER_JOBS; #查询当前用户调度作业: select * from USER_SCHEDULER_JOBS; #查询当前用户定时任务表 select * from user_jobs; #查询所有用户定时任务表 select * from all_jobs; #查询dba用户的定时任务表 select * from dba_jobs;
这里我们使用的是查询所有用户调度作业这个sql
关于调度任务遇到的问题,找到的资料 参考链接
来源:oschina
链接:https://my.oschina.net/u/2971292/blog/3160315