使用电子邮件通知
• 作业状态更改电子邮件通知
• 是由作业状态事件触发的
• 多个通知,多个收件人
• *_SCHEDULER_NOTIFICATIONS视图
使用调度程序电子邮件通知:
1. 指定你将用来发送电子邮件的SMTP 服务器的地址:
DBMS_SCHEDULER.SET_SCHEDULER_ATTRIBUTE
('email_server','host[:port]');
2. 还可以设置默认的发件人电子邮件地址:
DBMS_SCHEDULER.SET_SCHEDULER_ATTRIBUTE
('email_sender','valid email address');
3. 为指定作业添加电子邮件通知。(续)
使用作业电子邮件通知功能,可以向现有作业添加电子邮件通知,以便作业中发生受关注事件后向指定的电子邮件地址发送通知。对于每个作业,可以为不同的事件添加通知。可以将电子邮件通知发送给多个收件人。
要启用电子邮件通知功能,你必须:
1.设置email_server调度程序属性。
2.此外,还可以使用email_sender调度程序属性指定电子邮件通知的默认发件人电子邮件地址。
3.创建作业后,执行DBMS_SCHEDULER.ADD_JOB_EMAIL_NOTIFICATION过程,为作业添加一个或多个通知。
数据字典通过*_SCHEDULER_NOTIFICATIONS视图支持电子邮件通知。
添加和删除电子邮件通知
DBMS_SCHEDULER.ADD_JOB_EMAIL_NOTIFICATION (
job_name IN VARCHAR2,
recipients IN VARCHAR2,---逗号分隔的电子邮件地址列表
sender IN VARCHAR2 DEFAULT NULL,
subject IN VARCHAR2
DEFAULTdbms_scheduler.default_notification_subject,
body IN VARCHAR2
DEFAULT dbms_scheduler.default_notification_body,
events IN VARCHAR2---必需的逗号分隔列表
DEFAULT'JOB_FAILED,JOB_BROKEN,JOB_SCH_LIM_REACHED,
JOB_CHAIN_STALLED,JOB_OVER_MAX_DUR',
filter_condition IN VARCHAR2 DEFAULTNULL);
DBMS_SCHEDULER.REMOVE_JOB_EMAIL_NOTIFICATION (
job_name IN VARCHAR2,
recipients IN VARCHAR2 DEFAULT NULL,
events IN VARCHAR2 DEFAULT NULL);
添加和删除电子邮件通知
使用DBMS_SCHEDULER.ADD_JOB_EMAIL_NOTIFICATION过程添加一个或多个作业电子邮件通知。只要作业生成了列出的任一事件,系统就会将电子邮件发送至指定的收件人地址。作业将自动修改以便引发这些事件。如果指定了过滤条件,则只有与FILTER_CONDITION中的规范匹配的事件将生成电子邮件。
如果未设置EMAIL_SERVER调度程序属性或指定的作业不存在,则该过程将失败。调用该过程的用户必须是作业的所有者,必须具有CREATE ANY JOB系统权限,或已经被授予了对作业的ALTER权限。
• 通知电子邮件的主题可以包含值将被替换的下列变量:%job_owner%、%job_name%、%event_type%、%event_timestamp%、%log_id%、
%error_code%、%error_message%、%run_count%、%failure_count%、%retry_count%、%job_subname%、%job_class_name%。
• 通知电子邮件的正文可以包含SUBJECT中有效的任何变量。
• 逗号分隔的事件列表不能为空。
• 如果filter_condition为空(默认值),则只要指定事件出现,系统就会向所有指定的收件人地址发送通知。
使用DBMS_SCHEDULER.REMOVE_JOB_EMAIL_NOTIFICATION过程删除指定作业的一个或多个电子邮件通知。
创建作业链
1. 创建链对象。
2. 定义链步骤。
3. 定义链规则。
4. 启动链:
– 启用链。
– 创建指向链的作业。
链是为达到组合目标而链接在一起的一系列已命名的程序。这被称为“依存调度”。链的示例如下所示:
运行程序A 然后运行程序B,如果程序A 和程序B 成功完成,则只运行程序C,否则运行程序D。
在相互依赖的程序构成的链中,每个位置都称为一个步骤。通常情况下,链的一系列初始步骤启动之后,后续步骤的执行依赖于一个或多个之前步骤的完成。要创建并使用链,请依次完成下列步骤。如果没有特别说明,则提到的所有过程都是DBMS_SCHEDULER程序包的一部分。
1.使用CREATE_CHAIN过程创建链。可以选择用方案名称来限定链名称(如myschema.myname)。
2.定义(一个或多个)链步骤。定义步骤时需要命名此步骤并指定步骤中发生的操作。
每个步骤都可以指向下列项之一:
- 程序
- 另一个链(嵌套链)
- 事件
通过调用DEFINE_CHAIN_STEP过程来定义指向程序或嵌套链的步骤。
要定义等待事件发生的步骤,请使用DEFINE_CHAIN_EVENT_STEP过程。过程参数可以指向事件调度,也可以包括内嵌队列说明和事件条件。指向事件的步骤会一直等待,直到指定事件被引发。如果此事件发生,则步骤将成功完成。
3.创建链对象后,请定义链规则。链规则定义各步骤运行的时间,并定义各步骤之间的依赖关系。每个规则都有一个“条件”和一个“操作”:
- 如果条件的求值结果为TRUE,则执行操作。条件中可以包含在SQL WHERE子句中有效的任何语法。条件通常基于前面一个或多个步骤的结果。例如,你可能希望使某步骤在前两个步骤全部成功的情况下运行,而使另一个步骤在前两个步骤未全部成功的条件下运行。
- 操作指定在触发规则时要执行的内容。
典型操作是运行指定的步骤。可能的操作包括启动或停止步骤。还可以选择结束作业链的执行、返回一个值或者返回步骤名和错误代码。
添加到链中的所有规则共同确定了链的整体行为。在作业启动时以及在每个步骤结束时,将对所有规则求值以确定接下来发生的操作。请使用DEFINE_CHAIN_RULE过程向链中添加规则。向链中添加每个规则时均需要调用一次此过程。
4.启动链包括两个操作:
- 用ENABLE过程启用链。(链总是以禁用状态创建,因此可以在任何作业执行该链之前向其中添加步骤和规则。)启用一个已启用的链不会返回错误。
- 要运行链,必须创建'CHAIN'类型的作业。作业操作必须引用链名称。可以为此作业使用基于事件的调度或基于时间的调度。
链的示例

在此链示例中,请考虑在批量数据加载期间出现的所有任务和条件。首先,必须有要加载的数据。然后加载数据,同时观察文件系统以确保在加载期间不会发生空间不足的情况。
在数据加载完成后,需要重建在更新后的表上定义的索引。然后针对新加载数据运行报表。
该幻灯片显示了一个依存调度示例。
高级调度程序概念

使用高级调度程序功能,可以对调度的各个方面施加更强的控制,例如作业窗口和区分作业优先级。
• “窗口”由定义好起始时间和结束时间的时间间隔表示,用于在不同时间激活不同的资源计划。这使你可以更改某一时段(如一天或销售年度内的某一时间段)的资源分配。
• “窗口组”表示一系列窗口,使用它可以更轻松地管理窗口。可以将窗口或窗口组用于作业的调度,以确保作业仅在窗口及其关联资源计划有效时运行。
• “作业类”定义了一类作业,这些作业具有共同的资源使用要求和其它特性。作业类将作业分组到更大的实体中。
• 与作业类关联的“资源使用者组”确定分配给作业类中作业的资源。
• 使用“资源计划”,用户可以在各资源使用者组中区分资源(特别是CPU)的优先级。
注:灰色对象不是调度程序对象。
作业类

• 为其中的成员作业分配一组相同的属性值
• 是由CREATE_JOB_CLASS过程创建的
• 在作业类中指定作业(使用SET_ATTRIBUTE过程)
• 属于SYS方案
• 为成员作业设置资源分配
• 将服务属性设置为所需的数据库服务名称
• 将作业分组以区分优先级
作业类
作业类是参与的成员作业的策略。每个作业类指定一组属性,例如日志记录级别。为作业类分配作业时,作业可以继承这些属性。例如,可以指定用相同的策略来清除所有工资单作业的日志项。
• 可以使用CREATE_JOB_CLASS过程来创建作业类。类始终属于sys方案。要创建类,必须具有MANAGE SCHEDULER权限。存在一个名为DEFAULT_JOB_CLASS的默认作业类,此作业类是随数据库一起创建的。
• 创建了作业类之后,可以在创建作业时或者在创建作业之后,将作业指定为此作业类的成员,方法是使用DBMS_SCHEDULER程序包中的SET_ATTRIBUTE过程。如果没有将作业与某个作业类相关联,则作业属于该默认作业类。
• 将作业类的服务属性设置为所需的数据库服务名称。这决定了RealApplication Clusters 环境中运行成员作业的实例和指定给成员作业的系统资源(后者可选)。
• 为成员作业设置资源分配。作业类可以将数据库资源管理器与调度程序关联起来,因为每个作业类可以将一个资源使用者组指定为一个属性。这样成员作业就属于指定的使用者组,并根据当前资源计划中的设置分配资源。此外,还可以将resource_consumer_group属性保留为NULL并将作业类的服务属性设置为所需的数据库服务名称。然后,该服务可以映射到资源使用者组。如果同时设置了resource_consumer_group和服务属性并且指定的服务映射到资源使用者组,则优先使用resource_consumer_group属性中指定的资源使用者组。如果创建作业类时未指定资源使用者组,则作业类将映射到DEFAULT_CONSUMER_GROUP资源使用者组。启用了资源管理器后,对于默认作业类中的作业或者与默认资源使用者组关联的作业类中的作业,可能无法为其分配足够的资源以完成各自的任务。
• 为作业分组以区分优先级。可以为同一作业类中的单个作业分配1 到5 之间的优先级值,这样如果将该类中的两个作业安排在同一时间启动,优先级较高的作业优先。这样可以确保次要作业不会阻碍重要作业及时完成。如果为两个作业指定的优先级值相同,启动日期较早的作业优先。如果没有为作业指定优先级值,则其优先级默认为3。
窗口
调度程序窗口:
• 可以在不同时间段启动作业或更改资源在作业间的分配
• 一次只有一个是活动的
• 是使用CREATE_WINDOW过程创建的

作业的优先级可以随时间而变化。例如,在夜间可能要将大部分数据库资源分配给数据仓库加载作业,而在白天则将较大一部分资源分配给应用程序作业。要实现这一点,可以使用调度程序窗口来更改数据库资源计划。
• 调度程序窗口可以在一天、一周等的不同时间段自动启动作业或更改资源在作业间的分配。窗口由定义好起始时间和结束时间的时间间隔表示,例如“从凌晨12:00 到早上6:00”。
• 在任意给定时间内,只能存在一个有效的窗口。
• 可以使用CREATE_WINDOW过程创建窗口。
调度程序窗口使用作业类来控制资源分配。每个窗口指定了在该窗口打开(生效)时激活的资源计划,而每个作业类指定了资源使用者组或可以映射到使用者组的数据库服务。因此,在窗口中运行的作业所拥有的资源是根据其作业类的使用者组和窗口的资源计划分配的(如图形所示)。
区分窗口内作业的优先级
区分作业优先级:
• 在类级别(通过资源计划)
• 在作业级别(使用作业优先级属性)
• 不能担保不同作业类中的作业的优先级

在一个数据库中创建多个作业时,你需要通过某种方式来根据你的业务需求安排作业处理,并指定哪些作业具有最高优先级。对于特定窗口,可能有多种类别的作业在运行,每一类都具有各自的优先级。
可以在两个级别区分优先级:类级别和作业级别。
• 首先是在类级别区分优先级,使用的是资源计划。完全根据类资源分配情况来区分属于不同类的作业的优先级。
• 其次是在类内区分优先级,使用的是作业的作业优先级属性。
仅当属于同一个类的两个作业同时启动时,才会考虑优先级。优先级较高的作业先启动。
不能确保不同作业类中的作业按其优先级运行。例如,APPL_JOBS作业类中的高优先级作业不一定在ADMIN_JOBS作业类中的低优先级作业之前启动,即使它们共享同一个计划时也是如此。如果APPL_JOBS作业类有较低级别的资源可用,则该类中的高优先级作业必须等待资源可用,即使在其它作业类中存在可用于低优先级作业的资源时也是如此。
创建作业数组
1. 声明sys.job和sys.job_array类型的变量:
DECLARE
newjob sys.job;
newjobarr sys.job_array;
2. 初始化作业数组:
BEGIN
newjobarr := SYS.JOB_ARRAY();
3. 调整作业数组大小以存储所需的作业数量:
newjobarr.EXTEND(100);
使用作业数组是一种效率较高的创建作业集的方式。这也适用于轻量作业。在示例中,在一个作业数组中创建了100 个作业说明,并且将这些说明提交到了单个事务处理的作业队列中。请注意,对于轻量作业,所需的信息量非常有限。在此示例中,start_time参数默认为NULL,因此作业被安排为立即启动。
1.声明用于存储作业定义的变量和一个作业数组变量。
2. 使用SYS.JOB_ARRAY构造器初始化作业数组。这将为数组中的每个作业创建一个位置。
3.将数组大小设置为预期的作业数。
4. 创建每个作业,并将其放入数组中。在示例中,唯一的差异是作业的名称。
作业的start_time变量将被省略并默认为NULL,表示将立即运行该作业。
5. 使用CREATE_JOBS过程将数组中的所有作业作为一个事务处理提交。
注:如果数组很小,则性能不会显著优于提交单个作业时的性能。
4. 将作业放入作业数组:
FOR i IN 1..100 LOOP
newjob := SYS.JOB(job_name=>'LWTJK'||to_char(i),
job_style => 'LIGHTWEIGHT',
job_template => 'MY_PROG',
enabled => TRUE );
newjobarr(i) := newjob;
END LOOP;
5. 将作业数组作为一个事务处理提交:
DBMS_SCHEDULER.CREATE_JOBS(newjobarr,
'TRANSACTIONAL');
此示例的全部代码如下:
DECLARE
newjob sys.job;
newjobarr sys.job_array;
BEGIN
-- Create an array of JOB object types
newjobarr := sys.job_array();
-- Allocate sufficient space in the array
newjobarr.extend(100);
-- Add definitions for jobs
FOR i IN 1..100 LOOP
-- Create a JOB object type
newjob := sys.job(job_name => 'LWTJK'|| to_char(i),
job_style => 'LIGHTWEIGHT',
job_template => 'PROG_1',
enabled => TRUE );
-- Add job to the array
newjobarr(i) := newjob;
END LOOP;
-- Call CREATE_JOBS to create jobs in onetransaction
DBMS_SCHEDULER.CREATE_JOBS(newjobarr,'TRANSACTIONAL');
END;
/
可以使用作业数组创建轻量作业。
调度程序窗口使用作业类来控制资源分配。
作业链用于实施“依存调度”。
创建文件监视器和基于事件的作业
请执行以下任务:
1. 创建调度程序身份证明对象并授予EXECUTE权限。
2. 创建文件监视器并授予EXECUTE权限。
3. 创建其元数据参数引用事件消息的调度程序程序对象。
4. 创建引用文件监视器的基于事件的作业。(可选)使作业能够针对文件到达事件的每个实例运行。
5. 启用文件监视器、程序和作业。
创建文件监视器和基于事件的作业
执行以下任务来创建文件监视器和在指定文件到达后启动的基于事件的作业:
1.创建调度程序身份证明对象(身份证明),用于通过主机操作系统验证对文件的访问权限,并将对身份证明的EXECUTE权限授予文件监视器将启动的基于事件的作业所属的方案。
2.创建文件监视器并将对文件监视器的EXECUTE权限授予引用文件监视器的基于事件的作业所属的任何方案。
3.创建其元数据参数引用事件消息的调度程序程序对象。
- 使用EVENT_MESSAGE属性定义元数据参数。
- 创建具有一个类型为SYS.SCHEDULER_FILEWATCHER_RESULT的参数的存储过程,供该程序调用。存储过程必须具有一个SYS.SCHEDULER_FILEWATCHER_RESULT类型(事件消息的数据类型)的参数。该参数的位置必须与所定义的元数据参数的位置相匹配。该过程可以访问此抽象数据类型的属性,以了解有关已到达文件的信息。
4.创建引用文件监视器的基于事件的作业。可以使用DBMS_SCHEDULER.SET_ATTRIBUTE过程使作业能够针对文件到达事件的每个实例运行,即使该作业已经在处理之前的一个事件。将PARALLEL_INSTANCES属性设置为TRUE。
BEGIN
DBMS_SCHEDULER.SET_ATTRIBUTE('','PARALLEL_INSTANCES',TRUE);
END;
这样作业将作为轻量作业运行,因此可以快速启动作业的多个实例。如果将PARALLEL_INSTANCES设置为默认值FALSE,则当基于事件的作业已经在处理
一个事件时,此时出现的文件监视器事件将被丢弃。
5.启用文件监视器、程序和作业。
从远程系统启用文件到达事件
执行以下任务在远程系统上启用文件到达事件触发功能:
1. 设置数据库以运行远程外部作业。
2. 在第一个远程系统上安装、配置、注册并启动调度程序代理。
3. 为其余的每个远程系统重复步骤2。
要接收来自远程系统的文件到达事件,你必须在系统上安装调度程序代理,且必须在数据库中注册代理。该远程系统不需要Oracle DB 实例来生成文件到达事件。
调度远程数据库作业
• 创建一个作业在同一主机或远程主机上的另一个数据库实例上运行存储过程和匿名PL/SQL 块。
• 目标数据库可以是任何版本的Oracle DB。
•DBMS_SCHEDULER.CREATE_DATABASE_DESTINATION和DBMS_SCHEDULER.CREATE_CREDENTIAL可以用于远程数据库作业。
• 作业类型为PLSQL_BLOCK和STORED_PROCEDURE的作业可以是SET_ATTRIBUTE为DESTINATION和CREDENTIAL属性调用的目标。
现在,可以创建一个作业在同一主机或远程主机上的另一个数据库实例上运行存储过程和匿名PL/SQL 块。目标数据库可以是任何版本的Oracle DB。
现在没有用于支持远程数据库作业的新过程,但是对现有DBMS_SCHEDULER过程进行了更改以支持该功能。以下提供了详细信息。
创建远程数据库作业
执行以下任务以创建远程作业:
1. 设置远程作业的发起数据库。
2. 使用DBMS_SCHEDULER.CREATE_JOB创建作业。
3. 使用DBMS_SCHEDULER.CREATE_CREDENTIAL创建身份证明。
4. 使用DBMS_SCHEDULER.SET_ATTRIBUTE设置作业CREDENTIAL_NAME。
5. 使用DBMS_SCHEDULER.SETATTRIBUTE设置作业的DESTINATION属性。
6. 使用DBMS_SCHEDULER.ENABLE启用作业。
创建远程数据库作业
你可以执行示例中列出的任务来创建远程数据库作业。
要设置远程作业的发起数据库,请执行以下步骤:
1. 验证是否已安装XML DB。
2. 启用至数据库的HTTP 连接。
BEGIN
DBMS_XDB.SETHTTPPORT(port);
END;
3. 执行prvtrsch.plb脚本。
4. 设置调度程序代理的注册口令。
BEGIN
DBMS_SCHEDULER.SET_AGENT_REGISTRATION_PASS('password');
END;
调度多个目标作业
• 该功能可用于指定要在其上执行作业的多个目标。
• 它使用户能够从创建作业的数据库监视和控制这些作业。
• 多目标作业运行时,可将其视为一个作业集合,其中的各个作业是彼此近似相同的副本。
• 所有作业都将基于在作业开始日期中指定的时区运行,或将使用源数据库的时区。
多目标作业功能允许你指定多个要在其上执行作业的目标。你可以从创建作业的数据库监视和控制这些作业。其中包括以下功能:
• 指定必须在其上执行作业的数个数据库或计算机
• 将在多个目标上调度的同一作业作为单个实体进行修改
• 停止或删除在一个或多个远程目标上运行的作业
• 查看作业实例在所有作业目标上的状态
请注意,在该功能的初始版本中,所有目标都基于在作业开始日期中指定的时区运行,或默认使用源数据库的时区。
查看调度程序元数据
主要调度程序管理视图,显示:
• *_SCHEDULER_JOBS:所有作业,包括启用的和禁用的
• *_SCHEDULER_SCHEDULES:所有调度
• *_SCHEDULER_PROGRAMS:所有程序
• *_SCHEDULER_RUNNING_JOBS:活动的作业状态
• *_SCHEDULER_JOB_LOG:所有作业状态更改
• *_SCHEDULER_JOB_RUN_DETAILS:所有已完成的作业运行
SELECT job_name, status, error#,run_duration
FROM USER_SCHEDULER_JOB_RUN_DETAILS;
JOB_NAME STATUS ERROR# RUN_DURATION
---------------- ------ ------------------
GATHER_STATS_JOB SUCCESS 0 +00000:08:20
PART_EXCHANGE_JOB FAILURE 6576 +00000:00:00
查看调度程序元数据
作业表是一个包含所有作业的容器,每个数据库有一个作业表。作业表用于存储所有作业的信息,例如所有者名称和日志记录级别。可以在*_SCHEDULER_JOBS视图中查看这些信息。
作业是数据库对象,因此可能会累积起来并占用过多的空间。为避免发生这种情况,默认情况下会在作业完成后自动删除作业对象。该行为由auto_drop作业属性控制。DBA 和授权用户可以通过多个视图查看与调度程序、作业、调度和窗口等有关的重要操作信息。这些视图包括:
• *_SCHEDULER_PROGRAM_ARGS:显示为所有程序定义的所有参数及默认值(如果存在)
• *_SCHEDULER_JOBS:显示所有的作业,不管是已启用还是禁用的作业
• *_SCHEDULER_JOB_RUN_DETAILS显示所有已完成(失败或成功)的作业运行。
每个作业实例都有对应的一行。每一行中都包含有关该实例的作业执行情况的信息。
ERROR# 是遇到的第一个错误的编号
• *_SCHEDULER_GLOBAL_ATTRIBUTE:显示调度程序属性的当前值
• *_SCHEDULER_JOB_ARGS:显示所有作业的所有已设置的参数值
• *_SCHEDULER_JOB_CLASSES:显示所有作业类
对于作业链:
• *_SCHEDULER_RUNNING_CHAINS:显示所有活动链
• *_SCHEDULER_CHAIN_STEPS:显示所有链的所有步骤
• *_SCHEDULER_CHAINS:显示所有链
• *_SCHEDULER_CHAIN_RULES:显示所有链的所有规则
对于其它高级对象窗口:
• *_SCHEDULER_WINDOWS显示所有窗口
• *_SCHEDULER_WINDOW_GROUPS显示所有窗口组
• *_SCHEDULER_WINGROUP_MEMBERS显示所有窗口组的成员,一行对应一个组成员
• *_SCHEDULER_JOB_LOG显示作业的所有状态更改
• *_SCHEDULER_CREDENTIALS显示数据库中的身份证明的列表,其中密码进行了模糊处理
• *_SCHEDULER_JOB_ROLES按数据库角色显示所有作业
轻量作业与常规作业是通过相同的视图查看的:
• *_SCHEDULER_JOBS:显示所有作业,包括JOB_STYLE=‘LIGHTWEIGHT’的作业
• *_SCHEDULER_JOB_ARGS:还显示轻量作业的所有已设置的参数值
• 因为轻量作业不是数据库对象,所以无法通过*_OBJECTS视图查看轻量作业
从Oracle Database11gR2 开始:
• *_SCHEDULER_NOTIFICATIONS显示已经设置的电子邮件通知
• *_SCHEDULER_FILE_WATCHERS显示文件监视器的配置信息
以下视图显示与多目标作业有关的信息:
• *_SCHEDULER_DESTS:显示可在其上调度远程作业的所有目标。该视图包含外部
目标(对于远程外部作业)和数据库目标(对于远程数据库作业)
• *_SCHEDULER_EXTERNAL_DESTS:显示所有已在数据库中注册且可用作远程外部作业目标的代理
• *_SCHEDULER_DB_DESTS:显示您可在其上调度远程数据库作业的所有数据库
• *_SCHEDULER_GROUPS:显示您的方案中的组或数据库中的所有组
• *_SCHEDULER_GROUP_MEMBERS:显示您的方案中的组成员或数据库中的所有组成员
• *_SCHEDULER_JOB_DESTS:显示远程数据库中的作业的状态
注:在上面列出的视图中,视图名称开头的星号会被替换为DBA、ALL或USER。
调度程序身份证明是一个对象,用于通过主机操作系统验证对文件的访问权限。
可以指定应在其上执行作业的多个目标,并从创建作业的数据库上监视这些作业。
小结
• 使用调度程序来简化管理任务
• 创建作业、程序和调度
• 监视作业执行
• 使用基于时间或基于事件的调度来执行调度程序作业
• 描述窗口、窗口组、作业类和使用者组的用途
• 使用电子邮件通知
• 使用作业链来执行一系列相关任务
• 描述远程系统上的调度程序作业
• 使用高级调度程序概念来区分作业的优先级

扫描二维码关注我的微学堂
搜索刘老师微信号:Rman-2014,备注“Oracle学习与咨询”,即可添加好友;或者扫描下面二维码,关注我的“微学堂”公众号,了解最新OCP认证动态、题库及答案解析、培训机构及讲师介绍、课堂授课内容等。每天还有一篇技术文章发布哦!





