Створення тимчасових таблиць процедурами odi

Хочу розповісти про підхід, який я, як і багато моїх колег, використовують, коли необхідно створити тимчасову таблицю, яка буде використовуватися в завантаженнями.

На відміну від описаного тут алгоритму створення тимчасової таблиці через інтерфейс, я вважаю за краще використовувати для цих цілей процедури Oracle Data Integrator.

Чому іноді необхідне створення тимчасових таблиць? Всі причини, які я можу згадати, можна розділити на дві частини: обмеження ODI і особливості використовуваної СУБД, в яку завантажуються дані.

До обмежень ODI можна віднести:

  1. неможливість використання таких операторів SQL як Union, Minus, Intersect в інтерфейсах;
  2. . Якщо використовувати, наприклад, оператор Qualify необхідно одноразово, простіше зробити це в процедурі.
  • в основному, питання продуктивності. У деяких СУБД запити виконуються швидше якщо попередньо вибрати тільки ті записи з таблиці джерела, які потрібні для заповнення цільової таблиці. А вже потім пов'язувати дані тимчасової таблиці з таблицями довідників в інтерфейсі.

    Отже, як же створити тимчасову таблицю в процедурі? Так, в общем-то, так само, як і через клієнтську програму СУБД. Необхідно написати SQL скрипт створення таблиці.

    create table TEMP_GROUP

    select GROUP from Source2

    Далі цей текст необхідно вставити в процедуру, вказавши використовувану технологію і правильно вибравши схему БД.

    Зазвичай використання тимчасових таблиць передбачає три етапи:

  • створення таблиці і її заповнення;
  • використання, при необхідності, цієї таблиці в інтерфейсі завантаження;
  • видалення створеної тимчасової таблиці.

    Ось якраз щоб розповісти, як однієї процедурою ODI впорається і з першим і з третім етапами, я і задумав написати цей пост.

    Отже, створюємо процедуру з наступними кроками:

  • видалення тимчасової таблиці;
  • створення тимчасової таблиці;
  • заповнення тимчасової таблиці;
  • збір статистики по створеній таблиці.

    Для кожного кроку встановлюємо правильну технологію і схему БД, де цей крок процедури буде виконуватися, і не забуваємо там, де це може бути застосовано, вказувати тип лічильника:

    Створюємо опцію процедури, назвемо її, наприклад, CreateTable. Встановимо для неї тип Check Box.

    Далі, для кожного кроку процедури, крім першого, встановлюємо ознака умовного виконання кроку:

    Для цього знімаємо позначку з Always Execute, і встановлюємо її навпроти опції CreateTable.

    Для першого кроку встановлюємо ознака ігнорування помилок (Ignore Errors). Так ми робимо для того, щоб під час запуску процедури не було помилки, в разі якщо тимчасової таблиці в БД немає. Вірніше, видалення тимчасової таблиці перед її створенням є правильним підходом, так як можлива ситуація, коли пакет, який використовує цю процедуру, буде запущений після неуспішного попереднього запуску, при якому тимчасова наша таблиця була видалена з БД.

    Підготовка закінчена. Далі використовуємо створену нами процедуру в пакеті два рази:

  • перед виконанням інтерфейсу, щоб створити таблицю.
  • після виконання інтерфейсу, з опцією CreateTable встановленої в No, щоб тимчасову таблицю видалити.

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