воскресенье, 12 февраля 2012 г.

Работа с последовательностями в ODI (Sequences).

Ко многим вещам в ODI 11g надо привыкать, даже к документации. Файлов стало меньше, информация в них собрана немного по другому. Но, мне кажется, что этой информации стало больше, или она стала немного полнее.

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

Приступим.


Как работать с последовательностями в Oracle Data Integrator.

Введение.
Последовательность - это переменная, которая автоматически увеличивает свое значение каждый раз, когда она используется. Когда переменная не используется, ее значение может сохраняться в репозитории или в некой внешней таблице в БД.

Последовательности Oracle Data Integrator могут предназначаться для увязки существующих в СУБД последовательностей, тогда они называются натуральными последовательностями, или для имитации последовательностей для тех СУБД, в которых такой механизм не предусмотрен. Имитационные последовательности как раз и хранят свое значение в репозитории или ячейке некой таблицы в БД.

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

Oracle Data Integrator разделяет последовательности на три следующих типа:
  • Стандартные - их текущее значение сохраняется в репозитории.
  • Специальные - их текущее значение сохраняется в ячейке таблицы в БД. ODI читает значение из таблицы, блокирует строку (от конкуретных обновлений) и обновляет значение в строке после последнего увеличения.
  • Натуральные - отображают реально созданные в СУБД последовательности на последовательности ODI.

Примечание по использованию стандартных и специальных последовательностей:
  • ODI блокирует последовательность при применении, т.е. при многопользовательском использовании последовательности ее значение не будет повторяться, но ODI не обеспечивает возвращение значения последовательности при откате (ROLLBACK) транзакции к ее значению перед выполнением транзакции.
  • Стандартные и специальные последовательности созданы только для имитации родных последовательностей из СУБД. Если в СУБД есть механизм последовательностей лучше использовать именно его. Это может оказаться быстрее так как не будет необходимости использовать агента для чтения/записи значения последовательности в/из БД.

Создание последовательностей.

Как и для переменных, для создания последовательности необходимо выбрать соответствующий узел в дереве проекта, и, по правой кнопке мыши, вызвать команду New Sequence.


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

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

    Получать значение для такой последовательности ODI будет путем формирования такого запроса: SELECT имя_колонки FROM имя_таблицы WHERE условие.
  • Для натуральной последовательности, кроме имени, необходимо выбрать только логическую схему и, затем, выбрать из списка или ввести вручную имя последовательности, созданной в БД.

Использование последовательностей и автозаполняемых колонок.

Чтобы генерировать новое значение для последовательности, данные должны обрабатываться в построчном режиме агентом. Поэтому использование последовательностей не рекомендуется при обработке больших объемов данных. В указанном случае лучше использовать специфичные для СУБД средства, такие как identity колонки в Teradata, IBM DB2, Microsoft SQL Server или sequences в Oracle.

Последовательности ODI могут быть использованы практически в любых выражениях, таких как:
  • Маппинги в интерфейсах.
  • Фильтры в интерфейсах.
  • Джоины.
  • Констрейнты.
  • ...

Последовательности ODI могут использоваться даже:
  • Как заменяемое в выражениях значение: #<sequence_name>_NEXTVAL
  • Как параметризованная переменная в SQL выражениях: :<sequence_name>_NEXTVAL

Использование последовательности в виде заменяемого значения.
Последовательность может использоваться в выражениях в таком виде:

#<sequence_name>_NEXTVAL

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

Использование последовательности в виде значения параметра.
Такое использование последовательности возможно только в процедурах или модулях знаний и только на вкладке Command on Target. Для передачи значения последовательности в параметр используйте следующий синтаксис:

:<sequence_name>_NEXTVAL

В таком варианте использования последовательности она получает свое новое значение, а затем передается в SQL выражение. Значение последовательности увеличивается для каждой обрабатываемой строки. Но механизм, обеспечивающий такое увеличение, должен использоваться по разному для последовательностей разных типов:
  • Натуральные последовательности всегда увеличиваются для каждой обработанной строки.
  • Стандартные и специальные последовательности могут быть инкрементированы только агентом во время выполнение построчной обработки (когда агент выступает промежуточным этапом между источником и приемником данных). При этом шаг процедуры или модуля знаний должен содержать две SQL команды, одну для выборки данных из источника, и вторую - на вкладке команды для приемника данных - с выражением добавления или изменения данных.

Пример:
Примеры будут отдельно.

Указания по использованию имитационных последовательностей.
Чтобы быть уверенным в том, что последовательность будет обновляться для каждой записи добавляемой в таблицу, каждая строка должна пройти через Агента. Чтобы это произошло, придерживайтесь следующих правил:
  1. Устанавливайте маппинг, содержащий последовательность, выполняющимся на целевом сервере.
  2. Устанавливайте для этого маппинга только признак Добавления (Insert). Обновления (Updates) не поддерживаются для последовательностей.
  3. Если вы используете интеграционный модуль знаний с инкрементным обновлением ("incremental update" IKM), убедитесь, что выбранный вами ключ обновления не содержит колонок, заполняемых последовательностью. Например, если последовательностью заполняется первичный ключ в таблице, вы должны использовать альтернативный ключ как ключ обновления в интерфейсе.

    Это правило справедливо и при использовании натуральных последовательностей.

  4. При использовании последовательностей как параметров (:<SEQUENCE_
    NAME>_NEXTVAL) необходимо так настроить поток данных, чтобы он проходил через агента. Это значит, что вы должны иметь две команды, одну, выбирающую данные на вкладке Command on Source, вторую, добавляющую данные на вкладке Command on Target, а не один INSERT - SELECT как это обычно бывает.

Ограничения.
Последовательности имееют следующие ограничения:
  • Колонка, в маппинге которой используется последовательность, не может иметь признак проверки на отсутствие NULL.
  • Так же ни статическая ни динамическая проверка не могут быть осуществлены для первичных или альтернативных ключей, если для их заполнения используется последовательность.

Автозаполняемые (Identity) колонки.
Многие СУБД имеют встроенные средства для автоматического заполнения колонок таблицы уникальными, автоинкрементируемыми значениями.
При заполнении таких колонок данными, придерживайтесь следующих правил:
  1. Маппинг для автозаполняемых колонок должен быть пуст и деактивирован. Так же не должно быть установлено признаков Вставки или Обновления.
  2. Так же как и для последовательностей, ключ обновления не должен включать в себя автозаполняемых колонок, если вы пользуетесь модулем знаний с инкрементными обновлениями.
  3. Учитывайте ограничения на использование в ODI автозаполняемых колонок, которые ровно такие же, как и для последовательностей.


Следите за обновлениями блога.

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

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