Oracle数据库 Scheduler学习(部分)
这个属于三思写的“全面学习 ORACLE 数据库 SCHEDULER 特性”的读书笔记。
首先Scheduler里面有很多东西,Job、Programs、scheduler、Events、Chains、Job Classess、Windows,关于这些东西各个的作用我的理解也不是很深。但是三思这里有句话:10G版本中SCHEDULER将job(针对9i以前)分成了多个部分,Programs负责做什么、scheduler负责什么时候做、job就是做。
其实根据我的理解SCHEDULER中的job也可以控制做什么和什么时候做,可能为了要结构更清晰,所以又分成了三部分。
至于Events(事件)我理解有点像触发消息。
Chains是一组Programs的组合,这一组Programs的组合相互之间会构成逻辑关系。
Job Classess相当于创建一个job组,DBA可以将那些具有相同特性的job,统统放到相同的Job Classess中,然后通过对Job Class应用ORACLE中的“资源使用计划”特性。
Windows可以指定一个时间窗口,在此期间,通过与Job Classes的搭配组合,能够有效的控制job执行时支配(使用)的资源。
这里废话两句什么是函数、过程、程序包、程序包体
a、程序包:程序包是由逻辑上相关的一些过程和函数组成的集合。程序包的这一部分又称为说明,用于描述应用程序的接口;它声明了可供使用的类型、变量、常量、 异常错误、游标和子程序(其实就是申明有哪些函数和过程)
b、程序包体:程序包体完整地定义了游标和子程序,因此实施了说明。程序包体包含实施明细和专用声明,这些内容不显示给调用方。(其实就是具体的代码)
c、类型主体:类型主体是由与用户定义的数据类型相关联的一些方法(过程和函数)组成的集合。
d、过程:过程是用于执行特定操作的PL/SQL 块。
e、函数:函数是使用RETURN PL/SQL 命令返回单个值的 PL/SQL 块。它是具有返回值的过程。
f、触发器:触发器是当数据库中发生特定事件时执行的 PL/SQL 块。这些事件可以基于表,如在表中插入行时。也可以是数据库事件,如在用户登录数据库时。
先写一个
BEGIN
DBMS_SCHEDULER.CREATE_JOB(
Job_name => ‘INSERT_TEST_TBL’,
Job_type => ‘STORED_PROCEDURE’,
Job_action=> ‘P_INSERTINTOTEXT’.
Start_date=> sysdate,
Repeat_interval=> ‘ FREQ=DAILY;INTERVAL=1’);
END;
/
各位看job里面是可以定义执行时间的。这里唯一和programe有联系的就是Job_action,语法我就在这不解释了。
需要注意的是这是SCHEDULER创建的job,所以你在USER_JOBS视图中是无法找到的,必须要在DBA_SCHEDULER_JOBS里才能查到。
还有,大家要注意SCHEDULER创建的job虽然创建成功了但是却没有执行,是因为你还有DBMS_SCHEDULER. ENABLE(‘INSERT_TEST_TBL’)
执行job
Exec DBMS_SCHEDULER.RUN_JOB
停止job
Exec DBMS_SCHEDULER.STOP_JOB
BEGIN
DBMS_SCHEDULER.CREATE_PROGRAM(
Program_name => ‘my_program1’,
Program_action => ‘/bin/date’,
Program_type => ‘EXECUTABLE’,
Enabled => ture);
END;
/
这里我们看到PROGRAM强调的是做什么,他和JOB一样也有个action和type并且它的种类并没有JOB多,只有PLSQL_BLOCK,STORED_PROCEDURE和外部命令。
PROGRAM和JOB不同的是,JOB是定义好的,定时执行的任务。而PROGRAM是定义好的,等待被执行的对象。
SCHEDULER就是定义什么时候做,他来控制任务的执行的时间,周期和频率。
查看一下dbms_scheduler.create_schedule的结构
SQL> desc dbms_scheduler.create_schedule;
Parameter Type Mode Default?
--------------- ------------------------ ---- --------
SCHEDULE_NAME VARCHAR2 IN
START_DATE TIMESTAMP WITH TIME ZONE IN Y
REPEAT_INTERVAL VARCHAR2 IN
END_DATE TIMESTAMP WITH TIME ZONE IN Y
COMMENTS VARCHAR2 IN Y
SCHEDULE_NAME 名字
START_DATE 开始的时间,为空表示该scheduler暂不起作用
REPEAT_INTERVAL 执行周期
END_DATE 结束时间,为空表示不会停止,将一直执行
创建一个scheduler
BEGIN
DBMS_SCHEDULER.CREATE_SCHEDULE(
schedule_name => ‘my_schedule1’,
Start _date => SYSDATE,
Repart _interval => ‘FREQ=WEEKLY,;INTERVAL=1’,
Comments => ‘EVERY WEEK PER ONCE’);
END;
/
好现在我们把这JOB,PROGRAME,SEHEDULE连起来做,体现Programs负责做什么、scheduler负责什么时候做、job就是做
BEGIN
dbms_scheduler.create_program(
program_name => 'my_program1',
program_type => 'EXECUTABLE',
program_action => '/bin/date',enabled => TRUE);
END;
/
BEGIN
dbms_scheduler.create_schedule(
schedule_name => 'my_schedule1' ,
start_date => SYSDATE ,
repeat_interval => 'freq=weekly;interval=1',
comments => 'every week per once');
END;
/
BEGIN
DBMS_SCHEDULER.CREATE_JOB(
Job_name => ‘INSERT_TEST_TBL’,
programe_name => ‘my_program1’.
schedule_name => 'my_schedule1' ,
Enabled => ture);
END;
/
好了查看一下
SQL> select * from user_scheduler_job_run_details WHERE JOB_NAME ='MY_JOB1';
LOG_ID LOG_DATE OWNER JOB_NAME JOB_SUBNAME STATUS ERROR# REQ_START_DATE ACTUAL_START_DATE RUN_DURATION INSTANCE_ID SESSION_ID SLAVE_PID CPU_USED ADDITIONAL_INFO
---------- -------------------------------------------------------------------------------- ------------------------------ -------------------------------------------------------------------------------- -------------------------------------------------------------------------------- ------------------------------ ---------- -------------------------------------------------------------------------------- -------------------------------------------------------------------------------- --------------------------------------- ----------- ------------------------------ ------------------------------ --------------------------------------- --------------------------------------------------------------------------------
1032 01-12月-10 03.04.50.189092 上午 +08:00 SYS MY_JOB1 SUCCEEDED 0 01-12月-10 03.04.49.946770 上午 +08:00 01-12月-10 03.04.49.946673 上午 +08:00 +000 00:00:00 1 158,127 +000 00:00:00.01
关于下面events,Chain什么的就先不说了,以后有时间在搞
2010-12-6 by 饼干
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/23493401/viewspace-681028/ ,如需转载,请注明出处,否则将追究法律责任。