oracle: job使用
oracle的job,实际上就是数据库内置的定时任务,类似代码中的Timer功能。下面是使用过程:
这里我们模拟一个场景:定时调用存储过程P_TEST_JOB 向表TEST_JOB_LOG中插入数据
表结构:
1 create table TEST_JOB_LOG
2 (
3 rec_id NUMBER not null,
4 occr_time DATE
5 );
6 alter table TEST_JOB_LOG
7 add constraint PK_TEST_JOB primary key (REC_ID);
序列:
1 create sequence SEQ_TEST_JOB_LOG
2 minvalue 1
3 maxvalue 99999999
4 start with 1
5 increment by 1
6 cache 10;
存储过程:
1 create or replace procedure P_TEST_JOB is
2 begin
3 insert into test_job_log(rec_id, occr_time) values(seq_test_job_log.nextval,sysdate);
4 commit;
5 end P_TEST_JOB;
上面只是准备工作,下面才是重点:(以下脚本全是pl/sql developer环境)
1、创建job
1 declare
2 job_id number;
3 begin
4 sys.dbms_job.submit(job_id, 'P_TEST_JOB;', sysdate, 'sysdate+1/1440'); --马上运行,然后每分钟运行一次
5 sys.dbms_output.put_line(job_id); --输出job Id
6 end;
每个job创建后,都会对应一个唯一的数字,在pl/sql的output面板里,可以看到dbms_output.put_line输出的job id值。
2、查看job运行情况
1 select * from dba_jobs; --需要dba权限
2 select * from dba_jobs_running; --需要dba权限
3 select * from all_jobs;
4 select * from user_jobs;
3、删除job
begin
dbms_job.remove(108); --108为具体的job ID,可以通过select * from user_jobs查询得到
end;
4、手动启动job
1 begin
2 dbms_job.run(109);--运行指定Job
3 end;
最后,再给几个关于创建job的小例子:
a、带参数的存储过程调用
1 declare
2 job_id number;
3 begin
4 sys.dbms_job.submit(job_id, 'P_JOB_XXX(sysdate-30,sysdate);', sysdate, 'trunc(sysdate+1)+(4*60)/(24*60)'); --每天早上4:00运行
5 sys.dbms_output.put_line(job_id); --输出job Id
6 end;
这里指定了P_JOB_CKG的传入参数为sysdate及sysdate-30,如果是字符串参数,需要加二个单引号,类似 'P_XXX(''参数值'');'
此外,单引号还可以用CHR(39)来代替,例如:
1 DECLARE
2 JOB_ID NUMBER;
3 BEGIN
4 SYS.DBMS_JOB.SUBMIT(JOB_ID,
5 'P_JOB_XXX(TO_DATE(' || chr(39) ||
6 '2014-2-12 00:00:00' || chr(39) || ', ' || chr(39) ||
7 'YYYY-MM-DD HH24:MI:SS' || chr(39) || '),TO_DATE(' ||
8 chr(39) || '2014-2-12 23:59:59' || chr(39) || ', ' ||
9 chr(39) || 'YYYY-MM-DD HH24:MI:SS' || chr(39) ||
10 '));',
11 TO_DATE('2015-1-6 10:00:00', 'YYYY-MM-DD HH24:MI:SS'),
12 'SYSDATE+10/(60*24)'); --2015-01-06 10:00:00 开始执行,每10分钟执行一次
13 SYS.DBMS_OUTPUT.PUT_LINE(JOB_ID); --输出JOB ID
14 END;
中间那一串恶心的拼接,无非是要得到字符串:
P_JOB_XXX(TO_DATE('2014-2-12 00:00:00', 'YYYY-MM-DD HH24:MI:SS'),TO_DATE('2014-2-12 23:59:59', 'YYYY-MM-DD HH24:MI:SS'));
b、关于指定时间的表达式示例
每天运行一次 'SYSDATE + 1' 每小时运行一次 'SYSDATE + 1/24' 每10分钟运行一次 'SYSDATE + 10/(60*24)' 每30秒运行一次 'SYSDATE + 30/(60*24*60)' 每隔一星期运行一次 'SYSDATE + 7' 每个月最后一天运行一次 'TRUNC(LAST_DAY(ADD_MONTHS(SYSDATE,1))) + 23/24' 每年1月1号零时 'TRUNC(LAST_DAY(TO_DATE(EXTRACT(YEAR FROM SYSDATE)||'12'||'01','YYYY-MM-DD'))+1)' 每天午夜12点 'TRUNC(SYSDATE + 1)' 每天早上8点30分 'TRUNC(SYSDATE + 1) + (8*60+30)/(24*60)' 每星期二中午12点 'NEXT_DAY(TRUNC(SYSDATE ), ''TUESDAY'' ) + 12/24' 每个月第一天的午夜12点 'TRUNC(LAST_DAY(SYSDATE ) + 1)' 每个月最后一天的23点 'TRUNC (LAST_DAY (SYSDATE)) + 23 / 24' 每个季度最后一天的晚上11点 'TRUNC(ADD_MONTHS(SYSDATE + 2/24, 3 ), 'Q' ) -1/24' 每星期六和日早上6点10分 'TRUNC(LEAST(NEXT_DAY(SYSDATE, ''SATURDAY"), NEXT_DAY(SYSDATE, "SUNDAY"))) + (6*60+10)/(24*60)'
- 实例分享微信小程序项目搭建(下)
- 实例分享微信小程序项目搭建(上)
- Android6.0源码分析之蓝牙显示接收到的文件
- Android中应用调用系统权限
- Android5.0以后隐式启动ServiceBug
- Android6.0源码分析之录音功能(一)
- Android6.0源码开发之修改默认音量default及max和min
- Android源码开发之添加/删除系统应用
- 按键事件处理
- Android6.0锁屏源码分析之界面布局分析
- Android6.0源码分析之menu键弹出popupwindow菜单流程分析
- Android中初步自定义view
- Android中View研究自学之路 Android6.0源码分析之View(一)Android6.0源码分析之View(二)
- Android蓝牙配对弹出框过程分析 Android蓝牙配对弹出框过程分析
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 时间序列&日期学习笔记大全(上)
- LeetCode 题解:一顿操作猛如虎,一看击败百分五
- 这是什么沙雕题目?测试用例居然有人身高为 0 ??
- 深入解读flink sql cdc的使用以及源码分析
- markdown mermaid 画图
- 面试汇总(五):操作系统常见面试总结(一):进程与线程的相关知识点
- 面试汇总(六):操作系统常见面试总结(二):系统相关的问题
- Android 利用V4L2 调用camera
- Android基础--利用ANativeWindow显示视频
- Python如何爬取b站热门视频并导入Excel
- 代码详解——改变控制器的参考速度
- Python爬虫之JS的解析
- Python爬虫之chrome在爬虫中的使用
- Python爬虫之打码平台的使用
- Python爬虫---爬取腾讯动漫全站漫画