Рассмотрим несколько возможных ситуаций:
- Переменная вида Not Persistent, типа Alphanumeric или Text, без значения по умолчанию.
Запуск интерфейса или процедуры с использованием этой переменной на выполнение приведет к следующей ошибке:
Variable has no value: #ИмяПроекта.ИмяПеременной. - Переменная вида Not Persistent, типа Numeric, без значения по умолчанию.
Фактическое значение переменной в команде будет равно 0. - Переменная типа Date, как раз тот тип переменных, которые я никогда не использовал, как выяснилось, всегда имеют значение по умолчанию. В этом случае, конечно, будет использовано это значение.
- Переменные вида Latest Value или Historize будут получать, соответственно, либо последнее установленное значение, либо значение на дату запуска. Если же такого значения нет - будет тот же результат, что и в пунктах 1 - 3.
Чтобы установить значение переменной для переменных вида Latest Value или Historize необходимо выполнить обновление или установку значения переменной в пакете, либо выполнить обновление переменной прямо из Дизайнера:
Все три способа равнозначны и приведут к тому, что в историю значения переменной запишется соответствующее значение для данного контекста. Для того, чтобы использовать в процедуре или интерфейсе переменную вида Not Persistent необходимо процедуру или интерфейс вызывать из пакета. И уже в пакете первым шагом сделать установку или обновление значения переменной, а затем вызывать интерфейс или процедуру:
Значение, установленное в пакете, для переменной Var_Test будет доступно и для процедуры Raise_Exception и для интерфейса TestDBLink. И это значение будет неизменно до следующей установки значения на шаге 4.
Смотрите также другие записи с ярлыком Variable.
Версия 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. Репозиторий новый, так что тут проблем быть не должно.
#.NEW_VAR, а #Имя_проекта.NEW_VAR - просто было в треугольных скобках и что в них - стерлось.
УдалитьАга, значит имя проекта все же было.
ОтветитьУдалитьМеня немного смущал этот вопрос.
А что вообще планировалось получить из такой конструкции? Я имею ввиду, какой смысл в том, что делает процедура?
Сделал только что попытку повторить ситуацию.
ОтветитьУдалитьНачал с создания процедуры, в единственном шаге которой выбрал технологию Оракл и одну из схем в БД.
В текст вставил SELECT #имя_переменной from dual.
Запустил процедуру - отработал нормально, в смысле, без ошибок, так как цель этого селекта для меня неясна.
Добавил процедуру в пакет и вызвал оттуда. Результат тот же.
Добавил еще и переменную первым шагом пакета. Все работает.
Скорее всего у вас там просто свойство какое-то недоустановлено.
[b]VS[/b], текущее значение хотел увидеть (это же в 6-ой версии пошло, а ее пока не ставят - ибо глюки detected).
ОтветитьУдалитьЧто надо: при старте пакета задавать даты, за которые будет грузиться. Поскольку грузиться все будет автоматом обычно, то переменную надо Refreshed, где будет дергаться что-то вида
select Схема.ПроцедураДайДатуЗагрузки() from dual
Далее эта переменная должна передаваться в интерфейс, где участвует в фильтре на источнике.
Только вот не происходит задания переменной.
Значение по умолчанию, если задать, то проходит в интерфейсе, однако в логах все равно только ее имя.
Вот тут похожая ситуация описана, она вроде как работающая
ОтветитьУдалить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 подходит только при запуске сценариев, не пакетов или процедур.
Все получится, я уверен. Не важно, на которой версии. Это такой самый базовый функционал с рефрешем переменной из БД (или из функции).
> SESS_PARAMS подходит только при запуске сценариев, не пакетов или процедур.
ОтветитьУдалитьОх, вот оно что. Понятно, почему тогда везде пусто (сценарии у нас пока не используются).
Действительно все заработало: надо было внимательнее прочитать "Как узнать значение переменной ODI во время выполнения?".
Оказывается надо задавать значение переменной на уровне пакета, а не процедуры.
Спасибо за помощь :)