DataStage 执行 shell 脚本以在循环序列作业中休眠
DataStage execute shell script to sleep in a loop sequence job
目前,我在 DataStage 中有一个序列作业。
这是流程:
StartLoop Activity --> UserVariables Activity --> Job Activity --> Execute Command --> Endloop Activity
作业将每 30 分钟(上午 8 点 - 晚上 8 点)运行 获取真实数据。第一个循环迭代将加载前一天晚上 8 点到当天早上 8 点的数据,其他循环迭代将加载最近 30 分钟内发生的数据。
UserVariables Activity 是传递变量(SQL 语句)来过滤Job Activity 中获取的数据。 UserVariables 第一次迭代将变量 A(SQL 语句 1)传递给 Job Activity,从第二次迭代开始,它会将变量 B(SQL 语句 2)传递给 Job Activity。
执行命令我目前为作业设置 'Sleep 1800' 命令休眠 30 分钟以结束循环迭代。但我现在意识到它受到每次迭代的 运行ning 时间的影响。因此,在我对 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
我现在面临 2 个问题,需要您的帮助。
- 作业 运行 的第一次迭代很好,变量 A 如下:
select * from my_table where created_date between trunc(sysdate-1) + 20/24 and trunc(sysdate) + 8/24;
但是从第二次迭代开始,作业Activity失败,变量 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 Activity 传递到 Job Activity 时,变量会删除所有引号吗?我该如何解决这个问题?
2. 如何将上面的 shell 脚本作为执行命令或其他阶段的作业的一部分。我已经搜索了解决方案,我认为这是关于例程之前/之后的 ExecSH Activity。但是看了IBM的页面,还是不知从何下手。
很抱歉在 1 post 处添加了 2 个问题,这使得问题变得如此之长,但它们彼此之间的关系非常密切,所以如果我将它分成 2 post 将花费很多时间来回答,你们需要更多关于它的信息。
谢谢!
- 尝试转义单引号字符(每个字符前加一个反斜杠)。
- 在作业 activity 之前通过执行命令 activity 执行 shell 脚本。
目前,我在 DataStage 中有一个序列作业。
这是流程:
StartLoop Activity --> UserVariables Activity --> Job Activity --> Execute Command --> Endloop Activity
作业将每 30 分钟(上午 8 点 - 晚上 8 点)运行 获取真实数据。第一个循环迭代将加载前一天晚上 8 点到当天早上 8 点的数据,其他循环迭代将加载最近 30 分钟内发生的数据。
UserVariables Activity 是传递变量(SQL 语句)来过滤Job Activity 中获取的数据。 UserVariables 第一次迭代将变量 A(SQL 语句 1)传递给 Job Activity,从第二次迭代开始,它会将变量 B(SQL 语句 2)传递给 Job Activity。
执行命令我目前为作业设置 'Sleep 1800' 命令休眠 30 分钟以结束循环迭代。但我现在意识到它受到每次迭代的 运行ning 时间的影响。因此,在我对 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
我现在面临 2 个问题,需要您的帮助。
- 作业 运行 的第一次迭代很好,变量 A 如下:
select * from my_table where created_date between trunc(sysdate-1) + 20/24 and trunc(sysdate) + 8/24;
但是从第二次迭代开始,作业Activity失败,变量 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 Activity 传递到 Job Activity 时,变量会删除所有引号吗?我该如何解决这个问题?
2. 如何将上面的 shell 脚本作为执行命令或其他阶段的作业的一部分。我已经搜索了解决方案,我认为这是关于例程之前/之后的 ExecSH Activity。但是看了IBM的页面,还是不知从何下手。
很抱歉在 1 post 处添加了 2 个问题,这使得问题变得如此之长,但它们彼此之间的关系非常密切,所以如果我将它分成 2 post 将花费很多时间来回答,你们需要更多关于它的信息。
谢谢!
- 尝试转义单引号字符(每个字符前加一个反斜杠)。
- 在作业 activity 之前通过执行命令 activity 执行 shell 脚本。