DataStage выполняет сценарий оболочки для перехода в спящий режим в задании последовательности цикла

В настоящее время у меня есть последовательная работа в DataStage.
Вот поток:

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

Для получения реальных данных задание будет выполняться каждые 30 минут (с 8:00 до 20:00). Первая итерация цикла загрузит данные с 20:00 предыдущего дня до 8:00 текущего дня, а остальные загрузят данные за последние 30 минут.

Действие UserVariables заключается в передаче переменных (оператор SQL) для фильтрации данных, получаемых в Activity Activity. На первой итерации переменные пользователя передают переменную A (оператор SQL 1) в действие задания, а со второй итерации переменная B (оператор SQL 2) передается в действие задания.

Команда «Выполнить» В настоящее время я установил команду «Sleep 1800» для задания на 30 минут, чтобы завершить итерацию цикла. Но теперь я понял, что на это влияет время работы каждой итерации. Итак, ничего не зная о сценарии оболочки, я искал решения и заставлял этот файл спать до определенного времени, например 30 или 00 минут (задержка 0-1 минута, но это нормально).

Сценарий оболочки ниже, я нормально запустил его в своей системе, но безуспешно использовал его как часть работы.

#!/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;

Но со второй итерации он потерпел неудачу с Job 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. Как я могу сделать приведенный выше сценарий оболочки как часть задания, например, «Выполнить команду» или какой-либо другой этап. Я искал решения и думаю, что речь идет о ExecSH Before / After Routine Activity. Но, прочитав страницы IBM, я все еще не знаю, с чего начать.

Извините за добавление 2 вопросов к 1 сообщению, что делает его таким длинным, но очень относительным друг к другу, поэтому на ответ уйдет много времени, если я разделю его на 2 сообщения, и вам, ребята, понадобится дополнительная информация об этом.
Спасибо!


person UglyPrince    schedule 15.10.2020    source источник


Ответы (1)


  1. Попробуйте экранировать символы одинарных кавычек (перед каждым стоит обратная косая черта).
  2. Выполните сценарий оболочки из действия "Выполнить команду" перед действием "Задание".
person Ray Wurlod    schedule 15.10.2020