新手使用Oracle Scheduler根据事件启动作业

时间:2012-03-23 02:34:30

标签: oracle

我在Oracle 11.2数据库中有一个表。我希望数据库在远程服务器上运行可执行文件,如果table1中的特定单元格更新为值1,并且如果table2中的现有行数为> 0.我对数据库中的可能性没有多少经验 - 以下是否有可能实现这一目标?

  1. 使用Oracle Scheduler创建作业。作业立即运行,用于在远程服务器上运行外部可执行程序。该作业存在,但直到下面的步骤5才会运行(这可能吗?)。 http://docs.oracle.com/cd/E11882_01/server.112/e17120/schedadmin001.htm#BAJHIDDC

  2. 将DML触发器附加到在UPDATE语句上触发的表的列。 http://docs.oracle.com/cd/E11882_01/appdev.112/e25519/triggers.htm#CIHEHBEB

  3. 让触发器调用PL / SQL子程序 http://docs.oracle.com/cd/E11882_01/appdev.112/e25519/triggers.htm#CIHEGACF

  4. 在PL / SQL子程序中,执行以下业务逻辑:如果table1中的特定单元格等于1,则如果表2中的行数大于0,则继续执行步骤5,否则停止(退出,退出)。

  5. 在步骤1中运行作业

  6. 或者,如果没有提供作业/调度程序来提供此功能,是否有其他方法可以实现相同的功能?也就是说,在数据库表中进行更改会触发外部作业。

    更新1:

    我想知道是否可以通过使用带有DBMS_SCHEDULER.CREATE_JOB参数event_condition的Oracle Scheduler来实现上述步骤1-5?

    http://docs.oracle.com/cd/E11882_01/server.112/e25494/scheduse005.htm#CHDIAJEB

    以上是上述链接的示例:

    BEGIN
    DBMS_SCHEDULER.CREATE_JOB (
       job_name            =>  'process_lowinv_j1',
       program_name        =>  'process_lowinv_p1',
       event_condition     =>  'tab.user_data.event_type = ''LOW_INVENTORY''',
       queue_spec          =>  'inv_events_q, inv_agent1',
       enabled             =>  TRUE,
       comments            =>  'Start an inventory replenishment job');
    END;
    

    上面的代码创建了一个作业,该作业在应用程序向Scheduler发出信号表示某个项目的库存水平已降至低阈值水平时启动。

    上述代码是否可以通过某种方式进行修改以执行预期的步骤?例如,在这里使用event_condition可以消除上面的步骤2-4吗?等如果是这样,例如,如何设置queue_spec

1 个答案:

答案 0 :(得分:2)

假设您在远程服务器上安装Oracle Scheduler代理,DBMS_SCHEDULER可以在远程计算机上运行可执行文件。我会让DML触发器将消息排入Oracle Advanced Queue(AQ)并使用该队列创建event-based job(不允许DML触发器提交或回滚事务但运行DBMS_SCHEDULER作业隐式发出提交,因此DML触发器无法直接运行作业)。基于事件的作业和运行远程可执行文件的作业将成为job chain的一部分。

相关问题