oracle JOB 相关脚本

本文详细解析了Oracle数据库中Job调度的原理与实现方法,包括job里面的last_date和next_date的概念,以及interval之间的关系。介绍了如何通过SQL语句管理和操作Job,并提供了具体的例子,如设置job的运行时间和间隔。

job里面的last_datenext_date,以及interval之间是什么关系,last_date到底是记的job的开始执行时间,还是执行结束的时间。next_date到底是job的开始时间还是结束时间加上interval得出的呢?

如果一个Job的执行时间比较长(比如超过了interval),会不会出现多个同样的job同时执行呢?

last_date=开始时间
last_date+interval=next_date

但要清楚,next_date通常不是真正的开始时间,真正的开始时间往往比next_date晚几秒,也就是延时。

1
job
next time是在job开始执行的时候就算好了
不过是在job成功执行之后才写上去
job的执行时间超过interval时候也就是说在job的执行过程中nexttime就已经过了
那么nexttime就变为job执行完时的时间
2
SQL> exec dbms_job.broken(21,true);

PL/SQL过程被成功完成

SQL> select * from user_jobs;

SQL> exec dbms_job.run(21);

PL/SQL过程被成功完成

SQL> select * from user_jobs;

试写一计划任务:

declare

v_job number :=1;

begin

dbms_job.submit(v_job,'sp_fact_charge_code;',sysdate,'sysdate+1/1440');

commit;

end;

/

解释一下上面的程序

程序主体有四个参数,分别意为:v_job是计划任务号,'sp_fact_charge_code'是计划任务名,如果是多个计划任务,就都用分号隔开,第三个sysdate意为立即执行此任务,第四个参数是间隔时间的设置,此处为每分钟执行一次,1/1440=1/24/60

查看任务:select * from user_jobs;select * from all_jobs;

查看正在运行的任务(不推荐使用,速度慢):select * from dba_jobs_running;

另外值得一提的是,在安装oracle配置的时候,有这么一个参数:

job_queue_processes=4  (默认4)

这个参数是定义当前最多可同时运行几个job,它的最大值能设置为36

除了submit参数外,其余的几个参数有:

        dbms_job.run(v_job);         //运行job

        dbms_job.broken(v_job,true,next_date);        //停止一个job,里面参数true也可是falsenext_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);       修改下一次运行时间

例题,设定每天2:10:10运行

trunc(sysdate)+2/24+10/24/60+10/24/60/60        //运行时间

trunc(sysdate)+1+2/24+10/24/60+10/24/60/60        //间隔运行时间

例题,设定每月2号的2:10:10运行

trunc(sysdate,'mm')+1+2/24+10/24/60+10/24/60/60        //运行时间

trunc(add_mouths(sysdate,1),'mm')+1+2/24+10/24/60+10/24/60/60           //间隔运行时间

例题,设定每个季度……

trunce(sysdate,'Q')+1+2/24+10/24/60+10/24/60/60         //运行时间

trunce(add_mouths(sysdate,3),'Q'))+1+2/24+10/24/60+10/24/60/60         //间隔运行时间

另外年为'Y;

例题,设定每周一……

next_day(sysdate'星期一')

Oracle 数据库中,任务(Job)通常指的是通过 `DBMS_JOB` 或 `DBMS_SCHEDULER` 创建的定时任务。要删除这些任务,可以使用相应的系统包和 SQL 脚本。 ### 使用 `DBMS_JOB` 删除任务 如果任务是通过 `DBMS_JOB` 创建的,可以使用 `DBMS_JOB.REMOVE(job_id)` 来删除指定的任务。以下是一个删除任务的示例脚本: ```sql BEGIN DBMS_JOB.REMOVE(job => 123); -- 替换为实际的任务ID END; / ``` 执行完上述脚本后,任务将从数据库中移除。需要注意的是,只有任务的所有者或具有适当权限的用户才能删除任务 [^4]。 ### 使用 `DBMS_SCHEDULER` 删除任务 如果任务是通过 `DBMS_SCHEDULER` 创建的,则可以使用 `DBMS_SCHEDULER.DROP_JOB` 方法进行删除。以下是一个示例脚本: ```sql BEGIN DBMS_SCHEDULER.DROP_JOB(job_name => 'your_job_name'); -- 替换为实际的任务名称 END; / ``` 此方法会直接删除指定名称的任务 [^2]。 ### 查询现有任务 在删除任务之前,可以先查询当前数据库中存在的任务,以确认任务的 ID 或名称。对于 `DBMS_JOB`,可以查询 `DBA_JOBS` 视图: ```sql SELECT job, schema_user, next_date, next_sec, broken, interval FROM dba_jobs; ``` 对于 `DBMS_SCHEDULER`,可以查询 `DBA_SCHEDULER_JOBS` 视图: ```sql SELECT job_name, job_type, job_action, start_date, repeat_interval, enabled FROM dba_scheduler_jobs; ``` 这些查询可以帮助定位需要删除的任务 [^2]。 ### 注意事项 - 删除任务前,建议先确认任务的类型(`DBMS_JOB` 或 `DBMS_SCHEDULER`)以及任务的 ID 或名称。 - 如果任务正在运行,可能需要先停止任务,然后再删除。 - 删除任务的操作是不可逆的,请谨慎操作。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值