Ошибка DSSetParam -4 при заполнении параметра подпрограммой

Я создаю задание Sequence, которое содержит действие UserVariables (ParamLoading) и действие Job (ExtractJob) в указанном порядке. ParamLoading создает 4 пользовательские переменные и вызывает процедуру для заполнения каждой из них соответствующим значением, а затем вызывает ExtractJob, передавая ему ранее загруженные параметры.

ParamLoading вызывает процедуру сервера (GetParams), которая просто выполняет сценарий оболочки (ShellQuery) и фиксирует результат; этот сценарий оболочки выполняет SQL-запрос к базе данных Oracle и выводит результат на экран.

Что касается тестов, ShellQuery работает так, как ожидалось, и GetParams возвращает ожидаемое значение. Но когда GetParams вызывается из задания последовательности (независимо от того, находится ли оно в ParamLoading или ExtractJob), задание завершается со следующей ошибкой:

Test2..JobControl (@JOB033_TBK_026_EXT_PTLF): Controller problem: Error calling DSSetParam(RUTA_ORIGEN), code=-4
[ParamValue/Limitvalue is not appropriate]

Я проверил типы данных, имена параметров, все безуспешно или даже сообщение о том, что может произойти.

Код ShellQuery:

value=$(sqlplus -s $1/$2@$3/$4 <<!
        set heading off
        set feedback off
        set pages 0
        select param_value from cfg_params where filter='$5' and param_name='$6';
!)
echo $value

Код GetParams:

  Call DSExecute("UNIX", Ruta_Programas:"getparams.sh ":Username:" ":Password:" ":Server:" ":ServiceId:" ":Filtro:" ":Parametro, Output, SystemReturnCode)
  Ans = Output
  Return(Ans)

person Léster    schedule 23.11.2015    source источник


Ответы (2)


Что вы возвращаете в качестве значений из GetParams?

При вызове функции из последовательности ожидается целочисленное значение, и любая возвращаемая цифра, отличная от нуля, оценивается как ошибка.

В качестве теста попробуйте изменить возвращаемое значение подпрограмм на значения 0-4.

person Matt Calderon    schedule 24.11.2015
comment
Я возвращаю строку с правильным значением из GetParams. Допустим, я хочу получить значение параметра с именем HOME_PATH; GetParams должен возвращать /projects/EDLANA, и он действительно возвращает такое значение. Я добавил exit 0 в сценарий оболочки, и подпрограмма показывает, что возвращаемое значение, захваченное в SystemReturnCode, равно 0. - person Léster; 24.11.2015

Решено. Для тех, кто боролся с аналогичной проблемой, GetParams возвращал захваченное значение из ShellQuery, добавляя специальный символ, называемый «разделителем полей», и, учитывая, что символ представляет собой 254 в ASCII, любое задание, получающее параметр, будет жаловаться на недопустимое значение, которое была ошибка.

Изменение процедуры на следующее решило это:

Call DSExecute("UNIX", Ruta_Programas:"getparams.sh ":Username:" ":Password:" ":Server:" ":ServiceId:" ":Filtro:" ":Parametro, Output, SystemReturnCode)
Ans = EReplace(Output, @FM, "")
Return(Ans)

Спасибо Matt Calderon за подсказку для решения.

person Léster    schedule 24.11.2015