DeepEdit!

Программирование баз данных на Oracle, техническая документация, литература, статьи и публикации

  • Увеличить размер шрифта
  • Размер шрифта по умолчанию
  • Уменьшить размер шрифта

Один сценарий ODI - одна сессия в СУБД Oracle.

Предыдущий пост, посвященный получению в переменную ODI результата выполнения некоторой PL/SQL процедуры через значение переменной модуля(Oracle package) натолкнул меня на мысль проверить, как этот механизм будет работать при одновременном выполнении нескольких сценариев.
Если исходить с точки зрения того, как механизм использования модулей реализован в СУБД 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
  • .
Из этого пакета был сгенерирован сценарий, который вызывался в цикле несколько раз из запускающего пакета:
В результате получился запуск 21 сценария, каждый из которых вернул правильное значение переменной #TestFunc через процедуру RaiseException:
Пока все выглядит так, что использование общей переменной из модуля Oracle двумя и более одновременно выполняющимися сценариями будет возвращать корректный результат. Но для того, чтобы окончательно убедиться в этом, я модифицировал начальный пакет так, чтобы в переменную #TestFunc получить значение SID СУБД Oracle и вывести его в Операторе.
select sys_context('USERENV','SID') from dual
Это будет прямая проверка того, что агент ODI для запуска каждого отдельного сценария использует отдельные сессии:
Порядок выполнения.
  • Делаем случайную задержку.
  • Получаем SID сессии
  • Выводим результат.
  • Результат после запуска модифицированного пакета как в виде сценария (цикл из 21 запуска) так и в виде пакета, в общем-то, был предсказуемым. Т.е. номера SID для разных пакетов в период выполнения этих пакетов (или сценариев) не повторялись.
    Отсюда можно сделать вывод, что использовать модули Oracle для передачи значений из процедур PL/SQL в переменные ODI, можно даже при одновременном запуске нескольких сценариев.







    jAntivirus