博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
oracle: job使用
阅读量:6260 次
发布时间:2019-06-22

本文共 3038 字,大约阅读时间需要 10 分钟。

oracle的job,实际上就是数据库内置的定时任务,类似代码中的Timer功能。下面是使用过程:

这里我们模拟一个场景:定时调用存储过程P_TEST_JOB 向表TEST_JOB_LOG中插入数据

表结构:

1 create table TEST_JOB_LOG2 (3   rec_id NUMBER not null,4   occr_time DATE5 );6 alter table TEST_JOB_LOG7   add constraint PK_TEST_JOB primary key (REC_ID);

序列:

1 create sequence SEQ_TEST_JOB_LOG2 minvalue 13 maxvalue 999999994 start with 15 increment by 16 cache 10;

存储过程:

1 create or replace procedure P_TEST_JOB is2 begin3   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 declare2   job_id number;3 begin4   sys.dbms_job.submit(job_id, 'P_TEST_JOB;', sysdate, 'sysdate+1/1440'); --马上运行,然后每分钟运行一次5   sys.dbms_output.put_line(job_id); --输出job Id6 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 begin2   dbms_job.run(109);--运行指定Job3 end;

最后,再给几个关于创建job的小例子:

a、带参数的存储过程调用

1 declare2   job_id number;3 begin4   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 Id6 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)'

转载地址:http://bnqsa.baihongyu.com/

你可能感兴趣的文章
centos 7 执行 groupinstall报错
查看>>
Web开发入门
查看>>
Flex开发小结(1)如何使用AdvancedDataGrid
查看>>
AFNetworking 下载文件断点续传操作
查看>>
Jar mismatch! Fix your dependencies
查看>>
哀悼日, 网页变灰的实现
查看>>
php:检测用户当前浏览器是否为IE浏览器
查看>>
linux命令备份
查看>>
10个你可能不知道的JavaScript小技巧
查看>>
【ASP】文件上传
查看>>
集合类(数据结构图、集合图、集合之间的比较)
查看>>
hibernate _关联级别策略介绍
查看>>
来了!阿里开源分布式事务解决方案 Fescar
查看>>
挑战Kafka!Redis5.0重量级特性Stream尝鲜
查看>>
荣耀畅玩7C挑战红米5 Plus,千元手机档的王者对决
查看>>
聚划算超级聚享日为当代青年人打造理想家居空间
查看>>
雏形已具?2018年物联网智能市场研究报告
查看>>
陕西破获特大捕杀濒危野生动物案 设置“高压线”电杀猎物
查看>>
“办事不求人”破天荒写入黑龙江省政府工作报告
查看>>
Python文件操作的20个面试题,帮你打开公司大门,值得收藏
查看>>