触发基于oracle作业的程序完成

时间:2014-03-10 10:08:32

标签: sql oracle stored-procedures

场景:我有77个程序,每个程序用于一个数据文件,将其加载到表中。一整套77个程序完成后,应该启动转换作业,将数据推送到下游。

一种方法是在过程完成后创建标记值,然后退出并存储在表中,并基于对表的查询和触发该作业的条件。但是这种方法需要大量的代码更改,而且不建议这样做。

请为我建议一些DBA表,例如v$sessiondba_procedures,我可以在其中列出条件,该条件将描述程序的运行和完成,并且trigger可以{{1}}该作业。或者提出一些其他想法。

1 个答案:

答案 0 :(得分:0)

“一整套77个程序完成 [SUCCESSFULLY] 转换作业应该启动,将数据推送到下游。”

我添加了我认为缺少但关键的关键字。在确定给定的应用程序代码是否已成功完成时,是的,您可以编写一些复杂的逻辑来检测每个进程(1)最近一直在运行,(2)现在不再运行。但我不建议这样做,因为它完全忽略了检查您的加载作业是否成功完成。

我建议采用主动而非被动设计:编写一个中心代码点,从中提交,监控所有这些流程并检查返回代码。实现此目的的“正确”方法取决于您的应用程序当前如何安排和运行这些加载过程。如果你有一个“逐个设计”的应用程序(即77个文件中的每一个都加载了cron-scheduled的独立脚本并为1个文件运行sqlldr实用程序),并且你不想修改这77个文件,那么a简单的DIY方法可能是cron-schedule一个单独的“主”脚本:

1)提交所有77个加载过程作为后台进程 - 在数组中保留进程ID 2)循环遍历数组,等待每个进程,并检查返回代码 3)当#2完成时提交“77后加载”过程

上述想法的基本实现:

#! bash
load_script1.sh &
processes[1]=$?
load_script2.sh &
processes[2]=$?
...
load_script77.sh &
processes[77]=$?

for (( c=1; c<77; c++))
do
    wait ${processes[c]}
    if [ $? -gt 0 ] ; then echo "At least one load job failed!" ; exit 1 ; fi
done
run_after_77_loads.sh

当然,如果您使用的不是cron,例如DBMS_SCHEDULER,你会想要写一些能够检查该上下文中每个作业的返回码的东西。