суббота, 23 октября 2010 г.

Поведение переменных в процедурах и интерфейсах ODI.

Сегодня хочу рассказать о том, как ведут себя переменные в процедурах и интерфейсах. Напомню, что значение переменной в процедуре и интерфейсе может только использоваться в каких-то командах. Установить значение переменной ODI в интерфейсе нельзя.

Рассмотрим несколько возможных ситуаций:
  1. Переменная вида Not Persistent, типа Alphanumeric или Text, без значения по умолчанию.
    Запуск интерфейса или процедуры с использованием этой переменной на выполнение приведет к следующей ошибке:
    Variable has no value: #ИмяПроекта.ИмяПеременной.
  2. Переменная вида Not Persistent, типа Numeric, без значения по умолчанию.
    Фактическое значение переменной в команде будет равно 0.
  3. Переменная типа Date, как раз тот тип переменных, которые я никогда не использовал, как выяснилось, всегда имеют значение по умолчанию. В этом случае, конечно, будет использовано это значение.
  4. Переменные вида Latest Value или Historize будут получать, соответственно, либо последнее установленное значение, либо значение на дату запуска. Если же такого значения нет - будет тот же результат, что и в пунктах 1 - 3.

Чтобы установить значение переменной для переменных вида Latest Value или Historize необходимо выполнить обновление или установку значения переменной в пакете, либо выполнить обновление переменной прямо из Дизайнера:


Все три способа равнозначны и приведут к тому, что в историю значения переменной запишется соответствующее значение для данного контекста. Для того, чтобы использовать в процедуре или интерфейсе переменную вида Not Persistent необходимо процедуру или интерфейс вызывать из пакета. И уже в пакете первым шагом сделать установку или обновление значения переменной, а затем вызывать интерфейс или процедуру:


Значение, установленное в пакете, для переменной Var_Test будет доступно и для процедуры Raise_Exception и для интерфейса TestDBLink. И это значение будет неизменно до следующей установки значения на шаге 4.

Смотрите также другие записи с ярлыком Variable.

7 комментариев:

  1. Версия ODI 11.1.1.3
    Какая то странное поведение.
    Создаю переменную в проекте - NEW_VAR Alphanumneric, Non persistent.
    Создаю процедуру с одной Command
    /*
    #NEW_VAR
    <%=odiRef.getSession( "SESS_PARAMS" )%>
    */
    select #NEW_VAR from dual
    Создаю пакет с вызовом переменной (тип пробовал как Set, так и Refresh) и далее стрелка на процедуру.
    Пакет падает с сообщением, что значение переменной не задано. Если выставить значение по умолчанию, то процедура выполняется, однако на выходе получаю
    /*
    #.NEW_VAR

    */
    select #.NEW_VAR from dual

    Что это может быть то?
    P.S. Репозиторий новый, так что тут проблем быть не должно.

    ОтветитьУдалить
    Ответы
    1. #.NEW_VAR, а #Имя_проекта.NEW_VAR - просто было в треугольных скобках и что в них - стерлось.

      Удалить
  2. Ага, значит имя проекта все же было.
    Меня немного смущал этот вопрос.

    А что вообще планировалось получить из такой конструкции? Я имею ввиду, какой смысл в том, что делает процедура?

    ОтветитьУдалить
  3. Сделал только что попытку повторить ситуацию.
    Начал с создания процедуры, в единственном шаге которой выбрал технологию Оракл и одну из схем в БД.
    В текст вставил SELECT #имя_переменной from dual.
    Запустил процедуру - отработал нормально, в смысле, без ошибок, так как цель этого селекта для меня неясна.

    Добавил процедуру в пакет и вызвал оттуда. Результат тот же.

    Добавил еще и переменную первым шагом пакета. Все работает.

    Скорее всего у вас там просто свойство какое-то недоустановлено.

    ОтветитьУдалить
  4. [b]VS[/b], текущее значение хотел увидеть (это же в 6-ой версии пошло, а ее пока не ставят - ибо глюки detected).

    Что надо: при старте пакета задавать даты, за которые будет грузиться. Поскольку грузиться все будет автоматом обычно, то переменную надо Refreshed, где будет дергаться что-то вида
    select Схема.ПроцедураДайДатуЗагрузки() from dual

    Далее эта переменная должна передаваться в интерфейс, где участвует в фильтре на источнике.

    Только вот не происходит задания переменной.
    Значение по умолчанию, если задать, то проходит в интерфейсе, однако в логах все равно только ее имя.

    ОтветитьУдалить
  5. Вот тут похожая ситуация описана, она вроде как работающая
    http://odi-usage.blogspot.com/2010/09/blog-post_03.html

    Далее.

    Чтобы понять, в чем проблема, необходимо использовать другой способ демонстрации значения переменной, через raise exception
    http://odi-usage.blogspot.com/2010/08/odi_26.html

    SESS_PARAMS подходит только при запуске сценариев, не пакетов или процедур.

    Все получится, я уверен. Не важно, на которой версии. Это такой самый базовый функционал с рефрешем переменной из БД (или из функции).

    ОтветитьУдалить
  6. > SESS_PARAMS подходит только при запуске сценариев, не пакетов или процедур.
    Ох, вот оно что. Понятно, почему тогда везде пусто (сценарии у нас пока не используются).

    Действительно все заработало: надо было внимательнее прочитать "Как узнать значение переменной ODI во время выполнения?".
    Оказывается надо задавать значение переменной на уровне пакета, а не процедуры.

    Спасибо за помощь :)

    ОтветитьУдалить