среда, 31 августа 2011 г.

Обманываем синтаксический анализатор ODI.

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

Рассмотрим интересный пример от Cezar Santos с сайта odiexperts о том, как в интерфейсе получить константу или псевдоколонку из источника.


Привет.

Позвольте мне продемонстрировать небольшой трюк, который можно использовать, если нам необходимо получить из БД источника псевдоколонку таблицы (например rowid) или значение функции БД (например sysdate)

Если мы просто сделаем интерфейс и внесем вызов функции в маппинг, мы получим примерно такое сообщение:


Mapping executed on source with no cross reference on a source datastore. Please specify the source datastore to indicate the execution location for this mapping.

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


Чтобы этого избежать, можно использовать такой трюк - просто добавим к маппингу любую колонку из источника и возьмем этот текст в комментарии:

cast(getdate() as DATE) /* SNP_EXP_TXT.TXT */


Вот и все. Этот простой трюк позволяет загружать значения из источника которые не имеют прямой связи с конкретными колонками таблицы источника.


С помощью этого подхода можно получать значения последовательностей (sequence), функций и т.п.


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

Описанный же выше подход позволяет, например, выбрать текущую дату именно из СУБД источника. А между этими двумя событиями - выбором и загрузкой данных в промежуточную область, может пройти несколько часов, наступит следующий день и т.п.

В комментариях добавляют еще один возможный вариант - использовать переменную, в которую можно занести дату непосредственно перед вызовом интерфейса в пакете загрузки данных.

Но переменная не поможет, если нам необходимы разные значения для разных строк, тот же rowid.

Комментариев нет:

Отправить комментарий