DataStage执行Shell脚本以在循环序列作业中休眠

问题描述

当前,我在DataStage中有一个序列作业。
这是流程:

StartLoop Activity --> UserVariables Activity --> Job Activity --> Execute Command --> Endloop Activity

作业将每30分钟(上午8点至下午8点)运行以获取真实数据。第一次循环迭代将从前一天的晚上8点加载到当天的上午8点加载数据,其他循环将加载过去30分钟内发生的数据。

UserVariables活动将传递变量(sql语句)以过滤进入作业活动的数据。 UserVariables的第一次迭代将变量A(sql语句1)传递给Job Activity,从第二次迭代开始,它将变量B(sql语句2)传递给Job Activity。

我现在将执行命令“ Sleep 1800”设置为作业休眠30分钟,以结束循环迭代。但是我现在意识到,它受每次迭代的运行时间的影响。因此,我对shell脚本一无所知,所以我一直在寻找解决方案,并使该文件进入睡眠状态,直到特定时间(例如30或00分钟)为止(延迟0-1分钟,但还可以)。

下面是shell脚本,我在系统上运行良好,但作为工作的一部分却没有成功。

#!/bin/bash
minute=$(date +%M)
num_1=30
num_2=60
if [ $minute -le 30 ];
then
  wait=$((($num_1 - $minute)*$num_2))
  sleep $wait
fi
if [ $minute -gt 30 ];
then
  wait=$((($num_2 - $minute)*$num_2))
  sleep $wait
fi

我现在遇到两个问题,需要您的帮助。

  1. 该作业使用以下变量A进行了第一次迭代:
select * from my_table where created_date between trunc(sysdate-1) + 20/24 and trunc(sysdate) + 8/24;

但是从第二次迭代开始,它失败了,作业活动的变量B如下:

select * from my_table where created_date between trunc(sysdate-1/48,'hh') + 30*trunc(to_number(to_char(sysdate-1/48,'MI'))/30)/1440 and trunc(sysdate,'hh') + 30*trunc(to_number(to_char(sysdate,'MI'))/30)/1440;

在并行作业中,日志显示

INPUT,0: The following sql statement Failed: select * from my_table where created_date between trunc(sysdate-1/48,hh) + 30*trunc(to_number(to_char(sysdate-1/48,MI))/30)/1440 and trunc(sysdate,hh) + 30*trunc(to_number(to_char(sysdate,MI))/30)/1440.

我意识到也许它无法运行并行作业,因为它删除了hh和MI中的单引号。
是因为在将变量从UserVariables活动传递到Job活动时,变量会删除所有引号吗?我该如何解决呢?

2.如何将上面的shell脚本作为Execute Command或其他阶段的工作的一部分。我一直在寻找解决方案,我认为这与例行活动之前/之后的ExecSH有关。但是从IBM页面上阅读之后,我仍然不知道从哪里开始。

抱歉,在1个帖子中添加了2个问题,这很长,但彼此之间关系非常密切,因此,如果我将其分为2个帖子,并且需要更多信息,这将需要很多时间来回答。
谢谢!

解决方法

  1. 尝试转义单引号字符(在每个引号前加反斜杠)。
  2. 在Job活动之前从Execute Command活动执行shell脚本。