oracle job

困扰了很长一段时间了. 需要总是不太明确
开始我的建议是每个星期天凌晨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 的回复有意思

2个回答

我的笨方法:
做3个任务相同的JOB,v_interval值依次是
1)trunc(SYSDATE,'mm')+1/24 1号的
2)trunc(SYSDATE,'mm')+10+1/24 11号的
3)trunc(SYSDATE,'mm')+20+1/24 21号的

我觉得我的方法可行,只能说客户的要求有点太那个了

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问