Если исходить с точки зрения того, как механизм использования модулей реализован в СУБД Oracle, то получалось, что, в случае выделения каждому сценарию своей собственной сессии, для каждого сценария мы будем иметь отдельную область памяти, в которую конкретизируется (instantiated) модуль, и, таким образом, в каждом модуле мы получим свое значение переменной.
Для проверки этой гипотезы, я создал пакет ODI, в котором использовал процедуру ODI, описанную в предыдущем сообщении, возвращающую наименование сессии ODI в переменную #TestFunc. Вот как он выглядит:
Порядок выполнения:
- Вызов процедуры, создающей модуль P$_TEMP, тело модуля P$_TEMP и сохраняющий в переменную модуля pv_ret значение '<%=odiRef.getSession( "SESS_NAME" )%>'.
- Получение случайного значения в промежутке от 0 до 10000 в переменную #VariableN для выполнения задержки.
- Задержка выполнения.
- Получение значения из переменной pv_ret модуля P$_TEMP в переменную ODI #TestFunc
- Вывод полученного значения с помощью RaiseException процедуры.
В результате получился запуск 21 сценария, каждый из которых вернул правильное значение переменной #TestFunc через процедуру RaiseException:
Пока все выглядит так, что использование общей переменной из модуля Oracle двумя и более одновременно выполняющимися сценариями будет возвращать корректный результат. Но для того, чтобы окончательно убедиться в этом, я модифицировал начальный пакет так, чтобы в переменную #TestFunc получить значение SID СУБД Oracle и вывести его в Операторе.
select sys_context('USERENV','SID') from dual
Это будет прямая проверка того, что агент ODI для запуска каждого отдельного сценария использует отдельные сессии:Порядок выполнения.
- Делаем случайную задержку.
- Получаем SID сессии
- Выводим результат.
Результат после запуска модифицированного пакета как в виде сценария (цикл из 21 запуска) так и в виде пакета, в общем-то, был предсказуемым. Т.е. номера SID для разных пакетов в период выполнения этих пакетов (или сценариев) не повторялись.
Отсюда можно сделать вывод, что использовать модули Oracle для передачи значений из процедур PL/SQL в переменные ODI, можно даже при одновременном запуске нескольких сценариев.
Комментариев нет:
Отправить комментарий
Примечание. Отправлять комментарии могут только участники этого блога.