我在Oracle 11.2数据库中有一个表。我希望数据库在远程服务器上运行可执行文件,如果table1中的特定单元格更新为值1,并且如果table2中的现有行数为> 0.我对数据库中的可能性没有多少经验 - 以下是否有可能实现这一目标?
使用Oracle Scheduler创建作业。作业立即运行,用于在远程服务器上运行外部可执行程序。该作业存在,但直到下面的步骤5才会运行(这可能吗?)。 http://docs.oracle.com/cd/E11882_01/server.112/e17120/schedadmin001.htm#BAJHIDDC
将DML触发器附加到在UPDATE语句上触发的表的列。 http://docs.oracle.com/cd/E11882_01/appdev.112/e25519/triggers.htm#CIHEHBEB
让触发器调用PL / SQL子程序 http://docs.oracle.com/cd/E11882_01/appdev.112/e25519/triggers.htm#CIHEGACF
在PL / SQL子程序中,执行以下业务逻辑:如果table1中的特定单元格等于1,则如果表2中的行数大于0,则继续执行步骤5,否则停止(退出,退出)。
在步骤1中运行作业
或者,如果没有提供作业/调度程序来提供此功能,是否有其他方法可以实现相同的功能?也就是说,在数据库表中进行更改会触发外部作业。
更新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
?
答案 0 :(得分:2)
假设您在远程服务器上安装Oracle Scheduler代理,DBMS_SCHEDULER
可以在远程计算机上运行可执行文件。我会让DML触发器将消息排入Oracle Advanced Queue(AQ)并使用该队列创建event-based job(不允许DML触发器提交或回滚事务但运行DBMS_SCHEDULER
作业隐式发出提交,因此DML触发器无法直接运行作业)。基于事件的作业和运行远程可执行文件的作业将成为job chain的一部分。