当前位置:  数据库>oracle

使用DBMS_SCHEDULER包管理计划任务

    来源: 互联网  发布时间:2017-06-16

    本文导语: 阅读导航 创建计划任务: 支持的任务类型详解: 示例 手动执行计划 删除计划 Dbms_scheduler是Oracle提供创建计划任务的包,任务类型可以是执行PLSQL程序、执行外部脚本、调用操作系统命令,通常用于创建定期定时的任务,不依赖...

阅读导航

  • 创建计划任务:
  • 支持的任务类型详解:
  • 示例
  • 手动执行计划
  • 删除计划

Dbms_scheduler是Oracle提供创建计划任务的包,任务类型可以是执行PLSQL程序、执行外部脚本、调用操作系统命令,通常用于创建定期定时的任务,不依赖操作系统,保存在数据库内,数据库迁移时不受影响,发生错误有日志可以查询,比较方便创建和使用。例如实施数据备份计划,将数据的备份的脚步保存在day_backup.sh 中,然后创建计划定期执行该脚步:
$ vim /oracle/db_backup.sh
#!/bin/sh
ORACLE_SID=sydb;
export ORACLE_SID
ORACLE_HOME=/u01/app/product/11.2.0/db_1;
export ORACLE_HOME
PATH=$ORACLE_HOME/bin:$PATH;
export PATH
LD_LIBRARY_PATH=$ORACLE_HOME/lib;
export LD_LIBRARY_PATH
LOCAL=/EXPORT;
export LOCAL
$ORACLE_HOME/bin/rman target sys/oracle catalog rman/rman log='/tmp/db_backup.log' append 'EXECUTABLE', --job任务类型,请参考2中的解释
job_action =>'/oracle/db_backup.sh', --job操作
start_date=> to_date('2015-05-19 03:00:00','yyyy-mm-dd hh24:mi:ss'),--执行时间和执行间隔时间为null,则表示立即执行
/*12 天执行一次*/
repeat_interval=>'FREQ=MONTHLY;BYMONTHDAY=15,-1',--执行间隔时间
enabled=>true,--是否启用
/* next night at 11:00 PM */
comments => 'Nightly incremental backups');
END;
/

 


支持的任务类型详解:
job_type
This attribute specifies the type of job that you are creating. If it is not specified, an error is generated. The supported values are:
'PLSQL_BLOCK'
This specifies that the job is an anonymous PL/SQL block. Job or program arguments are not supported when the job or program type is PLSQL_BLOCK. In this case, the number of arguments must be 0.
'STORED_PROCEDURE'
This specifies that the job is a PL/SQL or Java stored procedure, or an external C subprogram. Only procedures, not functions with return values, are supported.
'EXECUTABLE'
This specifies that the job is external to the database. External jobs are anything that can be executed from the command line of the operating system. Anydata arguments are not supported with a job or program type of EXECUTABLE. The job owner must have the CREATE EXTERNAL JOB system privilege before the job can be enabled or run.
'CHAIN'
This specifies that the job is a chain. Arguments are not supported for a chain, so number_of_arguments must be 0.

 


示例

创建一张表,然后创建插入数据的过程:
create table t_insert(cname varchar2(30),cnum number(3,4);
/

create or replace procedure fun_insertdata
/*
功能:向t_insert 表中插入数据
edit:2015-05-15
*/
as
v_sql varchar2(300);
begin
  v_sql:='insert into t_insert(cname,cnum)values(:1,:2)';
  for i in 1..10000 loop
      execute immediate v_sql using 'AAA',i;
  end loop;
    commit;
 end;
/


最后创建一个立即执行的任务
BEGIN
DBMS_SCHEDULER.CREATE_JOB(
job_name=>'INSERT_DATATOTAB', --job名称
job_type => 'PLSQL_BLOCK', --job任务类型,请参考2中的解释
job_action =>'--job操作
BEGIN
  fun_insertdata;
 END;
 ',
start_date=>NULL, --执行时间和执行间隔时间如果为null,则表示立即执行
/*12 天执行一次*/
repeat_interval=>NULL,--执行间隔时间
enabled=>true,--是否启用
/* next night at 11:00 PM */
comments => 'Nightly incremental backups');
END;
/


查询结果:
SQL> column job_name format a15
SQL> column status format a8
SQL> column SESSION_ID format a7
SQL> column SLAVE_PID format a7
SQL> SELECT JOB_NAME,STATUS,session_id,slave_pid,cpu_used FROM DBA_SCHEDULER_JOB_RUN_DETAILS WHERE JOB_NAME='INSERT_DATATOTAB' and owner='SYS' ;

JOB_NAME        STATUS  SESSION SLAVE_P CPU_USED
--------------- -------- ------- ------- ---------------------------------------------------------------------------
INSERT_DATATOTA SUCCEEDE 173,263 5228    +000 00:00:01.36
B              D        3


所以的scheduler 可以在dbms_schedulers 视图中查询到,每个scheduler 任务执行后的结果可以在DBA_SCHEDULER_JOB_RUN_DETAILS中查询到; 如果想定期执行job可以通过配置repeat_interval,比如每月1,5和最后一天可以这样配置
repeat_interval=>'FREQ=MONTHLY;BYMONTHDAY=1,5,-1'--执行间隔时间 ,-1表示每月最后一天


上面使用到一个FREQ=,这个表示执行的时间截:


YEARLY 表示每一年
MONTHLY 表示每一月
WEEKLY 表示每一周
DAILY 表示每一天
HOURLY 表示每小时
MINUTELY 表示每分钟
SECONDLY 表示每秒钟

so 上面的 (FREQ=MONTHLY;BYMONTHDAY=1,5,-1) MONTHLY表示周期为每月执行,BYMONTHDAY表示每月那几天执行;

手动执行计划
SQL> EXEC DBMS_SCHEDULER.RUN_JOB('DB_BACKUP');


注意:默认情况下任务是不启用的,除非创建计划时设置了(enabled=>true),so 如果计划没有启用,首先启用它:
EXEC DBMS_SCHEDULER.enable('DB_BACKUP');

删除计划
SQL> exec dbms_scheduler.drop_job('DB_BACKUP');


--Then end(2015-05-18)


    
 
 

您可能感兴趣的文章:

  • 使用java执行定时任务示例
  • 怎么使用计划任务?
  • java自定义任务类定时执行任务示例 callable和future接口使用方法
  • 请问大家嵌入式linux设备中busybox的crond任务怎么使用?
  • 怎么查看进程使用的内存,像windows下的任务管理器一样
  • java使用任务架构执行任务调度示例
  • linux下使用crontab实现定时PHP计划任务失败的原因分析
  • 在ant中如何使用可选任务?
  • 关于使用clock()来测量任务的执行时间差的疑问
  • android教程之使用asynctask在后台运行耗时任务
  • linux使用crontab实现PHP执行计划定时任务
  • 如何使用信号灯实现两个任务的同步?
  • 使用SSIS创建同步数据库数据任务的方法
  • PHP中使用sleep函数实现定时任务实例分享
  • php版本的cron定时任务执行器使用实例
  • Windows中使用计划任务自动执行PHP程序实例
  •  
    本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
    本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • 强制SQL Server执行计划使用并行提升在复杂查询语句下的性能
  • Oracle中使用DBMS_XPLAN处理执行计划详解
  • C++ I/O 成员 tellg():使用输入流读取流指针
  • 在测试memset函数的执行效率时,分为使用Cash和不使用Cash辆种方式,该如何控制是否使用缓存?
  • C++ I/O 成员 tellp():使用输出流读取流指针
  • 求ibm6000的中文使用手册 !从来没用过服务器,现在急需使用它,不知如何使用! 急!!!!!
  • Python不使用print而直接输出二进制字符串
  • 请问:在使用oracle数据库作开发时,是使用pro*c作开发好些,还是使用库函数如oci等好一些啊?或者它们有什么区别或者优缺点啊?
  • Office 2010 Module模式下使用VBA Addressof
  • 急求结果!!假设一个有两个元素的信号量集S,表示了一个磁带驱动器系统,其中进程1使用磁带机A,进程2同时使用磁带机A和B,进程3使用磁带机B。
  • windows下tinyxml.dll下载安装使用(c++解析XML库)
  • c#中SAPI使用总结——SpVoice的使用方法
  • tcmalloc内存泄露优化c++开源库下载,安装及使用介绍
  • 使用了QWidget的程序,如何使用后台程序启动它?
  • sharepoint 2010 使用STSNavigate函数实现文件下载举例
  • 共享内存一般是怎么使用的,是同消息队列配合使用么
  • 使用libpcap读取tcpdump抓取的文件并解析c代码实例
  • Jsp可否使用带有GUI的JavaBean,如何使用?
  • c/c++预处理命令预#,##使用介绍
  • asp程序使用的access在Linux下如何使用!
  • 在div中使用css让文字底部对齐的方法
  • 新装的Linux使用root用户不能使用FTP?
  • Python namedtuple(命名元组)使用实例
  • LINUX下使用Eclipse,如何使用交叉编译器?


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3