楼主: LoveWinter

[精华] 原创: DBMS_SCHEDULER 中度解析: part 1

[复制链接]
论坛徽章:
105
生肖徽章:鸡
日期:2006-12-02 12:25:43生肖徽章:鼠
日期:2007-02-10 06:34:13生肖徽章2007版:鸡
日期:2008-01-02 17:35:53生肖徽章2007版:鼠
日期:2008-01-02 17:35:53生肖徽章2007版:羊
日期:2009-03-10 21:21:58祖国60周年纪念徽章
日期:2009-10-09 08:28:00祖国60周年纪念徽章
日期:2009-10-09 08:28:00
31#
发表于 2007-1-11 10:33 | 只看该作者
收藏了

使用道具 举报

回复
论坛徽章:
105
生肖徽章:鸡
日期:2006-12-02 12:25:43生肖徽章:鼠
日期:2007-02-10 06:34:13生肖徽章2007版:鸡
日期:2008-01-02 17:35:53生肖徽章2007版:鼠
日期:2008-01-02 17:35:53生肖徽章2007版:羊
日期:2009-03-10 21:21:58祖国60周年纪念徽章
日期:2009-10-09 08:28:00祖国60周年纪念徽章
日期:2009-10-09 08:28:00
32#
发表于 2007-1-11 10:34 | 只看该作者
出个文档,老大或者PDF

使用道具 举报

回复
论坛徽章:
41
生肖徽章:鸡
日期:2006-09-06 21:16:07生肖徽章:鸡
日期:2006-09-26 17:35:04生肖徽章:鸡
日期:2006-10-27 07:23:32金色在线徽章
日期:2007-01-03 04:01:42生肖徽章:鸡
日期:2007-01-25 16:58:43
33#
发表于 2007-1-23 19:33 | 只看该作者
好东西,顶

使用道具 举报

回复
论坛徽章:
150
蓝锆石
日期:2011-11-16 22:31:22萤石
日期:2011-11-17 13:05:31祖母绿
日期:2008-06-14 15:23:26海蓝宝石
日期:2011-11-16 22:25:15紫水晶
日期:2011-11-16 22:31:22红宝石
日期:2011-10-09 08:54:30蓝锆石
日期:2009-01-31 15:20:54萤石
日期:2008-12-22 15:22:00祖母绿
日期:2011-11-17 13:13:26海蓝宝石
日期:2008-07-05 14:52:18
34#
发表于 2007-5-24 22:35 | 只看该作者

Re: 原创: DBMS_SCHEDULER 中度解析: part 2

最初由 LoveWinter 发布
[B]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)  创建/使用/管理作业,程序,计划所需要的系统权限. [/B]

[PHP]
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');
15* end;
SQL> /
begin
*
第 1 行出现错误:
ORA-27456: 程序 "XYS.STORED_PROCEDURE_TEST" 的参数并未全部定义
ORA-06512: 在 "SYS.DBMS_ISCHED", line 5
ORA-06512: 在 "SYS.DBMS_SCHEDULER", line 30
ORA-06512: 在 line 2
/
[/PHP]
参照你上面的例子创建一个program,type是stored_procedure,使用了一个参数,怎么也过不去,不知道什么原因,不加参数没有问题!

使用道具 举报

回复
论坛徽章:
150
蓝锆石
日期:2011-11-16 22:31:22萤石
日期:2011-11-17 13:05:31祖母绿
日期:2008-06-14 15:23:26海蓝宝石
日期:2011-11-16 22:25:15紫水晶
日期:2011-11-16 22:31:22红宝石
日期:2011-10-09 08:54:30蓝锆石
日期:2009-01-31 15:20:54萤石
日期:2008-12-22 15:22:00祖母绿
日期:2011-11-17 13:13:26海蓝宝石
日期:2008-07-05 14:52:18
35#
发表于 2007-5-24 23:00 | 只看该作者
楼主的这篇文章还有后续吗?这是最新的吗?

使用道具 举报

回复
论坛徽章:
150
蓝锆石
日期:2011-11-16 22:31:22萤石
日期:2011-11-17 13:05:31祖母绿
日期:2008-06-14 15:23:26海蓝宝石
日期:2011-11-16 22:25:15紫水晶
日期:2011-11-16 22:31:22红宝石
日期:2011-10-09 08:54:30蓝锆石
日期:2009-01-31 15:20:54萤石
日期:2008-12-22 15:22:00祖母绿
日期:2011-11-17 13:13:26海蓝宝石
日期:2008-07-05 14:52:18
36#
发表于 2007-5-25 21:15 | 只看该作者
[PHP]
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.');
10* END;
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');
  8* END;
SQL> /

PL/SQL 过程已成功完成。

SQL>
[/PHP]

使用道具 举报

回复
论坛徽章:
150
蓝锆石
日期:2011-11-16 22:31:22萤石
日期:2011-11-17 13:05:31祖母绿
日期:2008-06-14 15:23:26海蓝宝石
日期:2011-11-16 22:25:15紫水晶
日期:2011-11-16 22:31:22红宝石
日期:2011-10-09 08:54:30蓝锆石
日期:2009-01-31 15:20:54萤石
日期:2008-12-22 15:22:00祖母绿
日期:2011-11-17 13:13:26海蓝宝石
日期:2008-07-05 14:52:18
37#
发表于 2007-5-25 21:21 | 只看该作者

Re: Re: 原创: DBMS_SCHEDULER 中度解析: part 2

最初由 warehouse 发布
[B]
[PHP]
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');
15* end;
SQL> /
begin
*
第 1 行出现错误:
ORA-27456: 程序 "XYS.STORED_PROCEDURE_TEST" 的参数并未全部定义
ORA-06512: 在 "SYS.DBMS_ISCHED", line 5
ORA-06512: 在 "SYS.DBMS_SCHEDULER", line 30
ORA-06512: 在 line 2
/
[/PHP]
参照你上面的例子创建一个program,type是stored_procedure,使用了一个参数,怎么也过不去,不知道什么原因,不加参数没有问题! [/B]


错误的原因在于enabled => TRUE,在没有定义参数之前是不能enable的
[PHP]
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>
[/PHP]

使用道具 举报

回复
论坛徽章:
9
授权会员
日期:2006-10-25 13:16:29ITPUB元老
日期:2006-12-14 09:07:14红孩儿
日期:2007-01-25 16:32:50生肖徽章:牛
日期:2007-01-25 16:50:00生肖徽章:鼠
日期:2007-01-25 16:50:22ITPUB新首页上线纪念徽章
日期:2007-10-20 08:38:442010新春纪念徽章
日期:2010-03-01 11:08:28ITPUB9周年纪念徽章
日期:2010-10-08 09:28:51优秀写手
日期:2014-03-11 06:00:14
38#
发表于 2007-10-24 10:32 | 只看该作者
如何创建一个JOB到其它user下(非sys 用户)

使用道具 举报

回复
论坛徽章:
30
生肖徽章:马
日期:2007-03-01 11:03:29奥迪
日期:2013-12-21 17:12:36马上有钱
日期:2014-02-22 21:52:26马上有钱
日期:2014-03-24 21:24:59马上有车
日期:2014-04-27 20:14:42ITPUB元老
日期:2014-08-01 17:12:17授权会员
日期:2014-08-01 17:12:49青年奥林匹克运动会-自行车
日期:2014-09-10 10:14:58马上有车
日期:2014-12-18 16:13:59马上加薪
日期:2014-12-23 19:40:56
39#
发表于 2007-10-25 13:36 | 只看该作者
顶一下。

使用道具 举报

回复
论坛徽章:
8
会员2007贡献徽章
日期:2007-09-26 18:42:10ITPUB新首页上线纪念徽章
日期:2007-10-20 08:38:44生肖徽章2007版:鸡
日期:2008-01-02 17:35:53生肖徽章2007版:猴
日期:2008-01-02 17:35:53生肖徽章2007版:鼠
日期:2008-01-02 17:35:532008新春纪念徽章
日期:2008-02-13 12:43:032009新春纪念徽章
日期:2009-01-04 14:52:28ITPUB十周年纪念徽章
日期:2011-11-01 16:23:26
40#
发表于 2007-10-31 22:47 | 只看该作者
不错,收藏了。谢谢

使用道具 举报

回复

您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

TOP技术积分榜 社区积分榜 徽章 团队 统计 知识索引树 积分竞拍 文本模式 帮助
  ITPUB首页 | ITPUB论坛 | 数据库技术 | 企业信息化 | 开发技术 | 微软技术 | 软件工程与项目管理 | IBM技术园地 | 行业纵向讨论 | IT招聘 | IT文档
  ChinaUnix | ChinaUnix博客 | ChinaUnix论坛
CopyRight 1999-2011 itpub.net All Right Reserved. 北京盛拓优讯信息技术有限公司版权所有 联系我们 未成年人举报专区 
京ICP备16024965号-8  北京市公安局海淀分局网监中心备案编号:11010802021510 广播电视节目制作经营许可证:编号(京)字第1149号
  
快速回复 返回顶部 返回列表