问一个低级问题:我想让数据库在每天定时执行一个存储过程,如何实现? 问一个低级问题:我想让数据库在每天定时执行一个存储过程,如何实现? 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 使用JOB:--- --建立一存储过程 create or replace procedure log_proc as begin insert into test(aa) values(sysdate); commit; end;--- --提交一个job declare job_num number; begin dbms_job.submit(job_num,'log_proc;',sysdate,sysdate+5/(24*60*60),false); dbms_output.put_line('Job numer='||to_char(job_num)); end;--说明: 1> 上面程序从当前开始,间隔5秒执行一次。 2> 如果每天几点执行,可以写为(比如从2004-09-13开始执行,每天7点执行) next_date => to_date('13-09-2004 07:00:00', 'dd-mm-yyyy hh24:mi:ss'), interval => 'trunc(sysdate)+(7+24)/24') 3> 如果是每个月几号开始执行。比如每月2号21点执行。 add_months(trunc(sysdate,'MONTH'),1) + 2-1 + 21/24 对,用JOB可以在表中配置JOBCREATE OR REPLACE package body pkg_jobs as--处理任务,定期的将SMS_PREPARE中超时纪录删除procedure proc_job1asv_sqlerrm VARCHAR2(600);BEGIN --INSERT INTO LOG_INFO (USERNAME, LOG_TIME, ACTION) VALUES ('JOB1' ,sysdate,'JOB EXEC1') ; LOOP DELETE FROM SMS_PREPARE WHERE SEND_TIME < SYSDATE AND ROWNUM < 201; EXIT WHEN SQL%NOTFOUND; COMMIT; END LOOP; COMMIT; --INSERT INTO LOG_INFO (USERNAME, LOG_TIME, ACTION) VALUES ('JOB1' ,sysdate,'JOB EXEC2') ; EXCEPTION WHEN OTHERS THEN v_sqlerrm := SUBSTR(SQLERRM,1,600); INSERT INTO ERR_LOG(LOG_TIME,DETAILS) VALUES(SYSDATE,'ERROR OCCUR IN PKG_JOBS.PROC_JOB1,REASON:' || v_sqlerrm);END;/*添加任务说明: 1、根据数据库中的配置添加一个任务;*/procedure add_job(iv_job in number)as v_job_id jobontime.job_id%TYPE; v_job_what jobontime.JOB_WHAT%TYPE; v_job_next_date jobontime.Job_next_date%TYPE; v_job_interval jobontime.JOB_INTERVAL%TYPE;BEGIN select job_id,job_what,job_next_date,job_interval into v_job_id,v_job_what,v_job_next_date,v_job_interval from jobontime where job_id = iv_job; dbms_job.isubmit(v_job_id,v_job_what,to_date(v_job_next_date,'YYYYMMDDHH24MI'),v_job_interval);END;/*删除任务说明: 1、删除一个任务;*/procedure remove_job(iv_job in number)asBEGIN dbms_job.REMOVE( iv_job );END;/*开始任务说明: 1、根据数据库中的配置添加一个任务; 2、使用Run让任务开始执行;*/procedure start_job(iv_job in number)as v_job_id jobontime.job_id%TYPE; v_job_what jobontime.JOB_WHAT%TYPE; v_job_next_date jobontime.Job_next_date%TYPE; v_job_interval jobontime.JOB_INTERVAL%TYPE;BEGIN select job_id,job_what,job_next_date,job_interval into v_job_id,v_job_what,v_job_next_date,v_job_interval from jobontime where job_id = iv_job; dbms_job.isubmit(v_job_id,v_job_what,to_date(v_job_next_date,'YYYYMMDDHH24MI'),v_job_interval); dbms_job.run(v_job_id);END;/*重新开始任务说明: 1、删除一个任务; 2、根据数据库中的配置添加一个任务; 3、使用Run让任务开始执行;*/procedure restart_job(iv_job in number)as v_job_id jobontime.job_id%TYPE; v_job_what jobontime.JOB_WHAT%TYPE; v_job_next_date jobontime.Job_next_date%TYPE; v_job_interval jobontime.JOB_INTERVAL%TYPE;BEGIN dbms_job.remove(iv_job); select job_id,job_what,job_next_date,job_interval into v_job_id,v_job_what,v_job_next_date,v_job_interval from jobontime where job_id = iv_job; dbms_job.isubmit(v_job_id,v_job_what,to_date(v_job_next_date,'YYYYMMDDHH24MI'),v_job_interval); dbms_job.run(v_job_id);END;end;/ 也可以用pro*c写个程序,编译之后用sh文件调用。不过有点麻烦! 这个sql语句该怎么写?!!! 如何判断邮箱格式是否正确? oracle 小问题 散分了 oracle数据库能不能限制某个字段只能输入某几个值? oracle分页求和排序语句 请教oracle817在Liunx7.3上安装的问题---display值的设置 业务单号生成设计方案 求一条SQL Oracle技术官方中文论坛开通了,高兴! 在表中有一字段长度为Varchar2(20),但却只能输入10个中文字符!可输入20个英文字符!如何能该字段容纳20个中文字符!急急急!请大侠帮忙 一个关于Update的问题 初学pl/sql,不明白为什么有些对象上有小红叉?
---
--建立一存储过程
create or replace procedure log_proc as
begin
insert into test(aa) values(sysdate);
commit;
end;
---
--提交一个job
declare
job_num number;
begin
dbms_job.submit(job_num,'log_proc;',sysdate,sysdate+5/(24*60*60),false);
dbms_output.put_line('Job numer='||to_char(job_num));
end;--说明:
1> 上面程序从当前开始,间隔5秒执行一次。
2> 如果每天几点执行,可以写为(比如从2004-09-13开始执行,每天7点执行)
next_date => to_date('13-09-2004 07:00:00', 'dd-mm-yyyy hh24:mi:ss'),
interval => 'trunc(sysdate)+(7+24)/24')
3> 如果是每个月几号开始执行。比如每月2号21点执行。
add_months(trunc(sysdate,'MONTH'),1) + 2-1 + 21/24
procedure proc_job1
as
v_sqlerrm VARCHAR2(600);
BEGIN
--INSERT INTO LOG_INFO (USERNAME, LOG_TIME, ACTION) VALUES ('JOB1' ,sysdate,'JOB EXEC1') ;
LOOP
DELETE FROM SMS_PREPARE WHERE SEND_TIME < SYSDATE AND ROWNUM < 201;
EXIT WHEN SQL%NOTFOUND;
COMMIT;
END LOOP;
COMMIT;
--INSERT INTO LOG_INFO (USERNAME, LOG_TIME, ACTION) VALUES ('JOB1' ,sysdate,'JOB EXEC2') ; EXCEPTION
WHEN OTHERS THEN
v_sqlerrm := SUBSTR(SQLERRM,1,600);
INSERT INTO ERR_LOG(LOG_TIME,DETAILS)
VALUES(SYSDATE,'ERROR OCCUR IN PKG_JOBS.PROC_JOB1,REASON:' || v_sqlerrm);
END;/*
添加任务
说明:
1、根据数据库中的配置添加一个任务;
*/
procedure add_job(iv_job in number)
as
v_job_id jobontime.job_id%TYPE;
v_job_what jobontime.JOB_WHAT%TYPE;
v_job_next_date jobontime.Job_next_date%TYPE;
v_job_interval jobontime.JOB_INTERVAL%TYPE;
BEGIN
select job_id,job_what,job_next_date,job_interval
into v_job_id,v_job_what,v_job_next_date,v_job_interval
from jobontime
where job_id = iv_job; dbms_job.isubmit(v_job_id,v_job_what,to_date(v_job_next_date,'YYYYMMDDHH24MI'),v_job_interval);
END;/*
删除任务
说明:
1、删除一个任务;
*/
procedure remove_job(iv_job in number)
as
BEGIN
dbms_job.REMOVE( iv_job );
END;/*
开始任务
说明:
1、根据数据库中的配置添加一个任务;
2、使用Run让任务开始执行;
*/
procedure start_job(iv_job in number)
as
v_job_id jobontime.job_id%TYPE;
v_job_what jobontime.JOB_WHAT%TYPE;
v_job_next_date jobontime.Job_next_date%TYPE;
v_job_interval jobontime.JOB_INTERVAL%TYPE;
BEGIN
select job_id,job_what,job_next_date,job_interval
into v_job_id,v_job_what,v_job_next_date,v_job_interval
from jobontime
where job_id = iv_job; dbms_job.isubmit(v_job_id,v_job_what,to_date(v_job_next_date,'YYYYMMDDHH24MI'),v_job_interval);
dbms_job.run(v_job_id);
END;/*
重新开始任务
说明:
1、删除一个任务;
2、根据数据库中的配置添加一个任务;
3、使用Run让任务开始执行;
*/
procedure restart_job(iv_job in number)
as
v_job_id jobontime.job_id%TYPE;
v_job_what jobontime.JOB_WHAT%TYPE;
v_job_next_date jobontime.Job_next_date%TYPE;
v_job_interval jobontime.JOB_INTERVAL%TYPE;
BEGIN
dbms_job.remove(iv_job);
select job_id,job_what,job_next_date,job_interval
into v_job_id,v_job_what,v_job_next_date,v_job_interval
from jobontime
where job_id = iv_job; dbms_job.isubmit(v_job_id,v_job_what,to_date(v_job_next_date,'YYYYMMDDHH24MI'),v_job_interval);
dbms_job.run(v_job_id);
END;end;
/