【问题标题】:Triggering an oracle job based completion of the procedures触发基于 oracle 作业的过程完成
【发布时间】:2014-03-10 10:08:32
【问题描述】:

场景:我有 77 个程序,每个程序对应一个数据文件,将其加载到表中。一旦 77 个完整的过程集完成,转换作业应该开始,这会将数据推送到下游。

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

请向我推荐一些 DBA 表,例如 v$sessiondba_procedures,我可以在这些表上设置描述程序运行和完成的条件,并且可以 trigger 进行该工作。或者提出其他想法。

【问题讨论】:

  • 为什么不调用77个过程,然后在脚本或过程中进行转换?
  • 您没有提到版本以及您使用常规作业还是调度程序作业。对于常规作业,字典表是 all_jobs,对于调度程序作业,它是 DBA_SCHEDULER_JOB_RUN_DETAILS。另外,我建议阅读有关链的内容。

标签: sql oracle stored-procedures


【解决方案1】:

“一旦完成了 77 个程序的完整集[成功],转换作业应该开始,这会将数据推送到下游。”

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

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

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

上述思想的基本实现:

#! 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,您需要编写一些能够检查该上下文中每个作业的返回码的东西。

【讨论】:

  • 谢谢,所有 77 个过程都是通过 sys.dbms_job.isubmit 安排的,unix 脚本安排在 HP-UX 环境中的 autosys 上。
  • 详细说明:感谢 Kevin,所有 77 个过程都是通过 sys.dbms_job.iSubmit 安排的,unix 脚本安排在 HP-UX 环境中的 autosys 上。所以我们不能通过load_script1来调度77程序。 sh 等等。任何其他解决方案都将非常有帮助。任何保存过程运行时间相关信息的表都会非常方便。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-03-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-09-15
  • 2014-02-26
  • 1970-01-01
相关资源
最近更新 更多