本来是工作时间,奈何不知道做什么,闲来无事写写博客,第一篇博客,希望以后能够保持写博客的好习惯
废话不多说,程序员,先会用在取考虑原理,先上一个例子,从查询job到新建job在到停止和删除
--查询job
select * from dba_jobs
--学习job
--建表
create table test_job(para_date date);
commit;
insert into test_job values(sysdate);
commit;
select * from test_job;
--建立存贮过程
create or replace procedure test_jobproce as
begin
insert into test_job values(sysdate);
end test_jobproce;
--建立job
--建立job后默认是执行的
declare test_job_really number;
begin
dbms_job.submit(test_job_really,'test_jobproce;',sysdate,'SYSDATE + 30/(60*24*60)'); --每30秒运行一次
commit;
end;
---停止job 25是建立的job test_job_really
begin
dbms_job.broken(81,true);
commit;
end;
--启动job
begin
dbms_job.run(25);
commit;
end;
--删除job
begin
dbms_job.remove(25);
commit;
end;
--查看执行结果
select * from test_job order by test_job.para_date desc;
--查看job
select * from sys.user_jobs
--使用下面的SQL查询是否JOB还在Running,前提是需要job执行时间不能过短
select * from dba_jobs_running
除了submit参数外,其余的几个参数有:
dbms_job.run(v_job); //运行job
dbms_job.broken(v_job,true,next_date); //停止一个job,里面参数true也可是false,next_date(某一时刻停止)也可是sysdate(立刻停止)。
dbms_job.remove(v_job); //删除某个job
dbms_job.what(v_job,'sp_fact_charge_code;'); //修改某个job名
dbms_job.next_date(v_job,sysdate); 修改下一次运行时间
上面这个例子是纯sql的,开发时一般用的是sql developer 那就更简单了
附上一个批量插入的例子,为每个用户插入一条数据
先是存储过程:
create or replace procedure JC_CHANNEL_PV_INSERT as
begin
insert into d_preformance_windows_result
(id,
columnid,
columnname,
deptid,
deptname,
score,
year,
month,
addscore,
windowid,
windowname
)
select func_GETNEWID(20) as id,
'20140319154336000384' as columnid,
'锦旗表扬' as columnname,
'0' as score,
SUBSTR(to_char(sysdate, 'yyyy'), 1,4)as year,
--TRUNC(SYSDATE,'YYYY') as year,
to_char(sysdate, 'mm') as month,
'' as addscore,
d.deptid as deptid,
t.name as deptname,
d.id as windowid,
d.name as windowname
from t_sys_dept_window d, t_sys_dept t
where d.deptid = t.deptid
end JC_CHANNEL_PV_INSERT;
然后就是在pl/sql 中的objects中找到DBMS_Jobs点击新建
在what中写存储过程的名字,然后在间隔中写上job执行的时间间隔,是每一天还是每一个月
关于时间间隔,大家可以看这个
每天运行一次 '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)'
第一次写博客,就写这么多,大家要是看不懂的,可以加我QQ大家一起探讨,谢谢大家