To: bzszp(SongZip) 你跟我说的那种方法我也想到过了,可是我觉得这样有点浪费系统资源,因为毕竟表a中不是每天都有数据新增的,如果每天都执行一边job的话会不会有点太不智能了(呵呵,个人见解),所以我想要在表a中有新增数据的时候才在第二天的16:30分执行一个过程,如果没有新增数据,就什么事情也不做,你说我的想法可行吗? 另外个人觉得job挺好的,就好像给数据库定了个闹钟,到时候该做什么就做什么。 还有,我写了这个过程,你帮我看看有什么地方不妥的,谢谢,过程如下: create or replace procedure trans(subdate in date) is begin insert into b(id,subtime) values(b_sequence.nextval,subdate); end trans 这个过程只有我在执行了对表a的insert操作之后的第二天的16:30分才执行,并且这个过程的参数subdate的值是我在对表a执行insert时的系统时间,所以还请你帮我分析一下我的想法是否可行,另外还有没有什么更好的方法,谢谢了!
to: bzszp(SongZip) 你看可不可以这样来实现,就是在表a中数据有新增的时候就触发一个job,然后,当这个job被执行了以后,这时相当于表b中有insert操作执行,同时启动另一个触发器来把这个job给停止掉或者删除掉。当下次对表a中有insert操作时再利用触发器重新submit这个job。 不知道我写了这么多,是不是有点乱了,呵呵,如果正如我说的那样可行的话,我就想问问,关于那个动态sql在job里是不是没有什么必要呀,因为,我是想用job来执行一个存储过程,至于job中的next_date好像就是当前时间就行了吧,只要把下次执行的时间设定为第二天的16:30不就行了吗?我写了一下关于表a的触发器,你看看对不对: create or replace trigger into_b variable n number; before insert on a begin dbms_job.submit(:n,'trans(sysdate);',sysdate,'trunc(sysdate+1)+(16*60+30)/(24*60)'); end into_b; 我的存储过程就是在前面我写过的那个存储过程,如果要是你看我的这个触发器没有问题的话,我就有一个疑问了,就是在我发布的这个job要执行的存储过程trans的参数sysdate的值,是我执行这个触发器的时间还是执行job的时间,谢谢,写得有点多了,呵呵,不好意思,想一下子把问题弄清楚
DBMS_JOB.SUBMIT(:jobno,//job号
'your_procedure;',//要执行的过程
trunc(sysdate)+1/24,//下次执行时间
'trunc(sysdate)+1/24+1'//每次间隔时间
);
删除job:dbms_job.remove(jobno);
修改要执行的操作:job:dbms_job.what(jobno,what);
修改下次执行时间:dbms_job.next_date(job,next_date);
修改间隔时间:dbms_job.interval(job,interval);
停止job:dbms.broken(job,broken,nextdate);
启动job:dbms_job.run(jobno);
例子:
VARIABLE jobno number;
begin
DBMS_JOB.SUBMIT(:jobno,
'Procdemo;',
SYSDATE, 'SYSDATE + 1/720');
commit;
end;
/
另外个人觉得job挺好的,就好像给数据库定了个闹钟,到时候该做什么就做什么。
还有,我写了这个过程,你帮我看看有什么地方不妥的,谢谢,过程如下:
create or replace procedure trans(subdate in date) is
begin
insert into b(id,subtime) values(b_sequence.nextval,subdate);
end trans 这个过程只有我在执行了对表a的insert操作之后的第二天的16:30分才执行,并且这个过程的参数subdate的值是我在对表a执行insert时的系统时间,所以还请你帮我分析一下我的想法是否可行,另外还有没有什么更好的方法,谢谢了!
也可以考虑使用触发器+jobtry:
在触发器中用动态sql修改job的执行时间(即next_date)。
create or replace trigger into_b
variable n number;
before
insert on a
begin
dbms_job.submit(:n,'trans(sysdate);',sysdate,'trunc(sysdate+1)+(16*60+30)/(24*60)');
end into_b;
我的存储过程就是在前面我写过的那个存储过程,如果要是你看我的这个触发器没有问题的话,我就有一个疑问了,就是在我发布的这个job要执行的存储过程trans的参数sysdate的值,是我执行这个触发器的时间还是执行job的时间,谢谢,写得有点多了,呵呵,不好意思,想一下子把问题弄清楚