ITPUB??ì3
新一届的微软MVP评选已经开始,欢迎各位推荐!
ITPUB论坛 » Oracle新技术/11g » 原创: DBMS_SCHEDULER 中度解析: part 1

标题: [精华] 原创: DBMS_SCHEDULER 中度解析: part 1
本帖已经被作者加入个人空间
离线 cainiao2
高级会员


精华贴数 0
个人空间 0
技术积分 8433 (144)
社区积分 23 (7039)
注册日期 2002-2-27
论坛徽章:21
ITPUB元老会员2007贡献徽章    
      

发表于 2006-12-11 08:35 
支持!


__________________
好好学习,天天向上!!!!!!
只看该作者    顶部
离线 freeka
妮露 ! i LIKE


精华贴数 1
个人空间 0
技术积分 16831 (61)
社区积分 19037 (77)
注册日期 2004-11-12
论坛徽章:54
生肖徽章2007版:鼠生肖徽章2007版:鸡生肖徽章:鼠生肖徽章:鸡  
      

发表于 2007-1-11 10:33 
收藏了


__________________
三更灯火五更鸡
————————————————
The harder I study, the better my English will be.
我越努力,我的英语就会越好。
Only by working hard can we succeed in doing everything.
只有努力,才能成功
------------------------------------------------
^_^杀菠菜的手*_~!
------------------------------------------------
方丈想看女人XX,遂寻来,方丈阅后,长叹一声:“唉!原来和尼姑的长得一模一样!!”
只看该作者    顶部
离线 freeka
妮露 ! i LIKE


精华贴数 1
个人空间 0
技术积分 16831 (61)
社区积分 19037 (77)
注册日期 2004-11-12
论坛徽章:54
生肖徽章2007版:鼠生肖徽章2007版:鸡生肖徽章:鼠生肖徽章:鸡  
      

发表于 2007-1-11 10:34 
出个文档,老大或者PDF


__________________
三更灯火五更鸡
————————————————
The harder I study, the better my English will be.
我越努力,我的英语就会越好。
Only by working hard can we succeed in doing everything.
只有努力,才能成功
------------------------------------------------
^_^杀菠菜的手*_~!
------------------------------------------------
方丈想看女人XX,遂寻来,方丈阅后,长叹一声:“唉!原来和尼姑的长得一模一样!!”
只看该作者    顶部
离线 frogprince-erp
幸福像瓜一样


精华贴数 1
个人空间 0
技术积分 2987 (507)
社区积分 796 (1087)
注册日期 2005-5-10
论坛徽章:41
金色在线徽章生肖徽章:鸡生肖徽章:鸡生肖徽章:鸡生肖徽章:鸡 
      

发表于 2007-1-23 19:33 
好东西,顶


__________________
+++++++++++++++++++++++++++++++++
+WHAT I DO IS ME,FOR THAT I CAME
+msn:zhaochangsheng111@hotmail.com
只看该作者    顶部
在线/呼叫 warehouse
自由职业



来自 大连
精华贴数 3
个人空间 0
技术积分 18055 (51)
社区积分 711 (1144)
注册日期 2002-8-16
论坛徽章:53
现任管理团队成员红宝石海蓝宝石祖母绿2008北京奥运纪念徽章:羽毛球2008北京奥运纪念徽章:自行车
2008北京奥运纪念徽章:跳水BLOG每日发帖之星    

发表于 2007-5-24 22:35 
Re: 原创: DBMS_SCHEDULER 中度解析: part 2



QUOTE:
最初由 LoveWinter 发布
3. 创建程序 (program)

什么是程序? 我的理解就是准备计划需要的元数据(metadata),它
包括以下部分:

程序名;

程序中用到的参数: 例如程序的类型,以及具体操作的描述

来看一个例子
begin
   dbms_scheduler.create_program(
     program_name=> 'DAILY_BACKUP_SH',
     program_type=> 'EXECUTABLE',
     program_action=> '/home/oracle/script/daily_backup.sh');
end;
/

这个例子将会创建一个名为"DAILY_BACKUP_SH"的程序,类型是可执行的shell脚本,脚本的名称是“/home/oracle/script/daily_backup.sh”


Q1:  程序和作业相比,有什么区别呢?

A1:  程序其实是可以与作业分离的,因此不同的用户可以在不同的时间段去重用它.而一个作业是属于特定的用户的;

另外,将程序与作业分离,也就激活了一个新的程序库(Program Library),利用程序库,用户可以很自由地选择特定的程序在特定的时间段运行,以及自由的配置程序执行时的参数.


Q2: 能否解释一下 create_program与create_job的关系?

A2: 首先,你应该知道创建程序并不是一个计划的必须组成部分,一个计划可以没有程序,但是必须有一个已经定义好的作业;
另外,program_action这个参数也是可选的,假如程序的类型是pl/sql 块,你完全可以在创建作业时来指定它.

上面已经提到了,程序和作业可以是分离的,这样一个程序的具体执行(ACTION) 就可以灵活地确定。它既可以只运行一次,也可以在多个不同的作业中来重用这个执行. 这样一来,在修改针对一个作业的计划时就非常灵活,你不需要重新创建pl/sql块.


Q3: 运行  create_program需要什么权限 ?

A3: 要保证create_program能够顺利执行,你同样需要CREATE JOB这个系统权限. 如果一个用户拥有了create any job这个权限,它就可以创建属主为任何用户的程序(SYS用户除外)

与创建作业一样,一个程序建立完毕,缺省的状态也是非激活的,当然你可以在创建程序时,显式的设置enabled参数为true来
激活它.


Q4: 能否介绍一下create_program这个过程的各个参数?
更多的例子?

A4:
program_name: 指定程序的名称;

program_type: 目前只支持下面三种:
   STORED_PROCEDURE
   PLSQL_BLOCK
   EXECUTABLE

program_action: (有长度限制,因为类型是varchar2)

   存储过程的名称;
   具体的pl/sql代码
操作系统脚本名称


来看一个使用pl/sql块的例子
BEGIN
DBMS_SCHEDULER.CREATE_PROGRAM(
  program_name => 'LEO.UPDATE_STATS',
  program_type => 'PLSQL_BLOCK',

  program_action => 'DECLARE
    sUsername  varchar2(30);

    cursor cur is select username from dba_users
      where username not in ('SYS','SYSTEM','SYSMAN','DBSNMP')
      and account_status='OPEN' and substr(username,1,5)<>'MGMT_' ;

    BEGIN

       OPEN cur;
       FETCH cur into sUsername;

       WHILE cur%Found
       LOOP
          DBMS_STATS.GATHER_SCHEMA_STATS (sUsername);

          FETCH cur into sUsername;
       END LOOP;

       close cur;

    END;');

END;
/

上面这个例子创建一个名为"UPDATE_STATS"的程序,它的类型是PL/SQL 块,完成更新非系统用户的统计信息的工作。在这个基础上你可以定制一个合理的计划,来定期执行这个程序.



4. 配置程序的参数

先来看一个例子

begin
   dbms_scheduler.create_program(
     program_name=> 'LEO.UPDATE_STATS_2',
     program_action=> 'LEO.UPDATE_SCHEMA_STATUS');
     program_type=> 'STORED_PROCEDURE',
     number_of_arguments => 1,
     enabled => TRUE);

   dbms_scheduler.define_program_argument(
     program_name=> 'UPDATE_STATS_2',
     argument_name => 'SCHEMA_NAME',
     argument_position => 1,
     argument_type => 'varchar2',
     default_value => 'HR');
end;
/

这个例程是不是很像上面的那个例子呢? 对,它们的区别只是
在这个例子中,程序的类型是存储过程,而不是pl/sql块.

解释:
使用define_program_argument这个过程来定义一个程序所需要的参数. 有两点说明一下:

1) 程序如果使用了参数,就必须事先指定,这样才能在程序被job使用时生效;

2) 定义程序的参数不会改变程序的激活属性。也就是说,如果一个程序是没有激活的状态,运行了define_program_argument过程不会自动激活这个程序.


关于权限:
缺省情况下只有program的owner才能修改创建的程序,如果用户被授予了alter 权限 或者 create any job权限,就可以修改属主为另一个用户的程序.



5. 创建计划(Schedule)

其实,如果你已经了解了怎样创建作业和程序,就等于已经掌握怎样创建计划了。你需要做的附加工作只是指定计划的开始时间,结束时间,重复频率等等.

来看一个例子

begin
   dbms_scheduler.create_job(
     job_name=> 'leo.UPDATE_STATS_JOB',
     program_name=> 'leo.UPDATE_STATS_2',
     start_date=>'2005-06-20 11:00.00.000000 PM +8:00',
     repeat_interval=>'FREQ=MONTHLY;INTERVAL=1',
     end_date=>'2006-06-20 11:00.00.000000 PM +8:00',
     comments=>'Monthly statistics collection job');
end;
/

start_date和end_date这两个参数需要说明一下: 它们的数据类型
是timestamp,因此需要精确的指定时间和时区.  时间格式继承的是NLS_DATE_FORMAT这个初始化参数的值.

下一部分介绍:  
1) 配置作业的参数;
2)  创建/使用/管理作业,程序,计划所需要的系统权限.


PHP code:


SQL
EDIT

已写入 file afiedt
.buf



  1  begin

  2  dbms_scheduler
.create_program(

  
3  program_name=> 'STORED_PROCEDURE_TEST',

  
4  program_action=> 'PROC_TEST',

  
5  program_type=> 'STORED_PROCEDURE',

  
6  number_of_arguments => 1,

  
7  enabled => TRUE);

  
8  COMMIT;

  
9  dbms_scheduler.define_program_argument(

 
10  program_name=> 'STORED_PROCEDURE_TEST',

 
11  argument_name => 'P_NAME',

 
12  argument_position => 1,

 
13  argument_type => 'VARCHAR2',

 
14  default_value => 'TEST');

 
15end;

SQL> /

begin

*

第 1 行出现错误:

ORA-27456程序 &quot;XYS.STORED_PROCEDURE_TEST&quot的参数并未全部定义

ORA
-06512在 &quot;SYS.DBMS_ISCHED&quot;, line 5

ORA
-06512在 &quot;SYS.DBMS_SCHEDULER&quot;, line 30

ORA
-06512在 line 2

/

参照你上面的例子创建一个program,type是stored_procedure,使用了一个参数,怎么也过不去,不知道什么原因,不加参数没有问题!


__________________
只看该作者    顶部
在线/呼叫 warehouse
自由职业



来自 大连
精华贴数 3
个人空间 0
技术积分 18055 (51)
社区积分 711 (1144)
注册日期 2002-8-16
论坛徽章:53
现任管理团队成员红宝石海蓝宝石祖母绿2008北京奥运纪念徽章:羽毛球2008北京奥运纪念徽章:自行车
2008北京奥运纪念徽章:跳水BLOG每日发帖之星    

发表于 2007-5-24 23:00 
楼主的这篇文章还有后续吗?这是最新的吗?


__________________
只看该作者    顶部
在线/呼叫 warehouse
自由职业



来自 大连
精华贴数 3
个人空间 0
技术积分 18055 (51)
社区积分 711 (1144)
注册日期 2002-8-16
论坛徽章:53
现任管理团队成员红宝石海蓝宝石祖母绿2008北京奥运纪念徽章:羽毛球2008北京奥运纪念徽章:自行车
2008北京奥运纪念徽章:跳水BLOG每日发帖之星    

发表于 2007-5-25 21:15 
PHP code:


SQL
EDIT

已写入 file afiedt
.buf



  1  BEGIN

  2  DBMS_SCHEDULER
.create_program (

  
3  program_name=> 'PROC_TEST_JOB',

  
4  program_type=> 'STORED_PROCEDURE',

  
5  program_action=> 'PROC_TEST',

  
6  number_of_arguments=> 1,

  
7  enabled=> FALSE,

  
8  comments=> 'Program to gather SCOTT''s statistics using a stored

  9  procedure.'
);

 
10END;

SQL> /



PL/SQL 过程已成功完成。



SQL
EDIT

已写入 file afiedt
.buf



  1  BEGIN

  2  DBMS_SCHEDULER
.define_program_argument (

  
3      program_name      => 'PROC_TEST_JOB',

  
4      argument_name     => 'P_NAME',

  
5      argument_position => 1,

  
6      argument_type     => 'VARCHAR2',

  
7      default_value     => 'PROG_ARG');

  
8END;

SQL> /



PL/SQL 过程已成功完成。



SQL
>




__________________
只看该作者    顶部
在线/呼叫 warehouse
自由职业



来自 大连
精华贴数 3
个人空间 0
技术积分 18055 (51)
社区积分 711 (1144)
注册日期 2002-8-16
论坛徽章:53
现任管理团队成员红宝石海蓝宝石祖母绿2008北京奥运纪念徽章:羽毛球2008北京奥运纪念徽章:自行车
2008北京奥运纪念徽章:跳水BLOG每日发帖之星    

发表于 2007-5-25 21:21 
Re: Re: 原创: DBMS_SCHEDULER 中度解析: part 2



QUOTE:
最初由 warehouse 发布
PHP code:


SQL
EDIT

已写入 file afiedt
.buf



  1  begin

  2  dbms_scheduler
.create_program(

  
3  program_name=> 'STORED_PROCEDURE_TEST',

  
4  program_action=> 'PROC_TEST',

  
5  program_type=> 'STORED_PROCEDURE',

  
6  number_of_arguments => 1,

  
7  enabled => TRUE);

  
8  COMMIT;

  
9  dbms_scheduler.define_program_argument(

 
10  program_name=> 'STORED_PROCEDURE_TEST',

 
11  argument_name => 'P_NAME',

 
12  argument_position => 1,

 
13  argument_type => 'VARCHAR2',

 
14  default_value => 'TEST');

 
15end;

SQL> /

begin

*

第 1 行出现错误:

ORA-27456程序 &quot;XYS.STORED_PROCEDURE_TEST&quot的参数并未全部定义

ORA
-06512在 &quot;SYS.DBMS_ISCHED&quot;, line 5

ORA
-06512在 &quot;SYS.DBMS_SCHEDULER&quot;, line 30

ORA
-06512在 line 2

/

参照你上面的例子创建一个program,type是stored_procedure,使用了一个参数,怎么也过不去,不知道什么原因,不加参数没有问题!


错误的原因在于enabled => TRUE,在没有定义参数之前是不能enable的
PHP code:


SQL
begin

  2  dbms_scheduler
.create_program(

  
3  program_name=> 'STORED_PROCEDURE_TEST',

  
4  program_action=> 'PROC_TEST',

  
5  program_type=> 'STORED_PROCEDURE',

  
6  number_of_arguments => 1,

  
7  enabled => FALSE);

  
8  dbms_scheduler.define_program_argument(

  
9  program_name=> 'STORED_PROCEDURE_TEST',

 
10  argument_name => 'P_NAME',

 
11  argument_position => 1,

 
12  argument_type => 'VARCHAR2',

 
13  default_value => 'TEST');

 
14  end;

 
15  /



PL/SQL 过程已成功完成。



SQL
>




__________________
只看该作者    顶部
离线 fxbsmile
民工



精华贴数 0
个人空间 0
技术积分 1073 (1685)
社区积分 142 (2854)
注册日期 2002-7-24
论坛徽章:6
ITPUB元老红孩儿授权会员ITPUB新首页上线纪念徽章生肖徽章:鼠生肖徽章:牛
      

发表于 2007-10-24 10:32 
如何创建一个JOB到其它user下(非sys 用户)


只看该作者    顶部
离线 jidongzheng
资深会员



精华贴数 0
个人空间 0
技术积分 1605 (1049)
社区积分 111 (3241)
注册日期 2004-12-12
论坛徽章:5
会员2007贡献徽章BLOG每日发帖之星ITPUB新首页上线纪念徽章生肖徽章:羊生肖徽章:马 
      

发表于 2007-10-25 13:36 
顶一下。


__________________
QQ:417670179
MSN:jidongzheng@sohu.com
email:zhengjidong@wri.com.cn
只看该作者    顶部
相关内容


CopyRight 1999-2006 itpub.net All Right Reserved.
北京皓辰广域网络信息技术有限公司. 版权所有
E-mail:Webmaster@itpub.net
京ICP证:010037号 联系我们 法律顾问