困扰了很长一段时间了. 需要总是不太明确
开始我的建议是每个星期天凌晨1 点 跑, 领导觉得时间太短了.政府机关效低,没必要这么快,就一直搁着
[code="sql"]SET SERVEROUTPUT ON;
DECLARE
job_num BINARY_INTEGER;
proc VARCHAR2(32);
v_begin DATE;
v_interval VARCHAR2(64);
BEGIN
proc := 'opera_rake;';
v_begin := trunc(sysdate) + 23 / 24;
v_interval := 'trunc(next_day(sysdate,''星期日'')) + 1 / 24';
DBMS_JOB.SUBMIT(job_num, proc, v_begin, v_interval);
DBMS_OUTPUT.PUT_LINE('job(任务) 编号: ' || job_num);
COMMIT;
END;
/[/code]
我怕需求会再变,于是在系统的代码表中添加了一个字段.让管理员来操作
[code="sql"]DECLARE
job_num BINARY_INTEGER;
proc VARCHAR2(32);
v_begin DATE;
v_interval VARCHAR2(64);
temp NUMBER;
BEGIN
-- 如果没有设定此值,则 默认为 每周日凌晨 1 点统计
SELECT DD_VALUE INTO temp FROM DICTIONARY WHERE DD_ID = 'commission_statis';
if temp is null then
v_interval := 'trunc(next_day(sysdate,''星期日'')) + 1 / 24';
else
v_interval := 'trunc(sysdate) + ' || temp || ' + 1 / 24';
end if;
proc := 'opera_rake;';
v_begin := trunc(sysdate) + 23 / 24;
DBMS_JOB.SUBMIT(job_num, proc, v_begin, v_interval);
DBMS_OUTPUT.PUT_LINE('job(任务) 编号: ' || job_num);
COMMIT;
END;
/[/code]
当然,这样会要求数据库字典表中必须要有一条记录为 'commission_statis'. 现在抛开 动态 SQL 不谈.整个系统都成了这样.
现在领导给了新需求, 要求定时执行一个存储过程, 时间是每旬跑一次, [color=red]即 每个月的 1 号, 11 号, 21 号 跑[/color]
[color=red]v_interval 的值如何确定[/color], 实在是想不到好的解决方案. 希望各位给个建议
实在是没分了...
[b]问题补充:[/b]
哈哈.
max_annie 的回复有意思