Хочу рассказать о подходе, который я, как и многие мои коллеги, используют, когда необходимо создать временную таблицу, которая будет использоваться в загрузке данных.
В отличие от описанного здесь алгоритма создания временной таблицы через интерфейс, я предпочитаю использовать для этих целей процедуры Oracle Data Integrator.
Почему иногда необходимо создание временных таблиц? Все причины, которые я могу вспомнить, можно разделить на две части: ограничения ODI и особенности используемой СУБД, в которую загружаются данные.
К ограничениям ODI можно отнести:
- невозможность использования таких операторов SQL как Union, Minus, Intersect в интерфейсах;
- . Если использовать, например, оператор Qualify необходимо однократно, проще сделать это в процедуре.
Особенности СУБД:
Итак, как же создать временную таблицу в процедуре? Да, в общем-то, так же, как и через клиентское приложение СУБД. Необходимо написать SQL скрипт создания таблицы.
Например такой:
create table TEMP_GROUP
(
NAME VARCHAR2(30),
NUMBER INTEGER,
GROUP VARCHAR2(200),
CODE VARCHAR2(140),
PREFIX VARCHAR2(10),
POSTFIX VARCHAR2(10),
VAR_NAME VARCHAR2(140)
)
Или такой:
create table TEMP_GROUP2 as
select GROUP from Source1
minus
select GROUP from Source2
Далее этот текст необходимо вставить в процедуру, указав используемую технологию и правильно выбрав схему БД.
Обычно использование временных таблиц предполагает три этапа:
Вот как раз чтобы рассказать, как одной процедурой ODI справится и с первым и с третьим этапами, я и задумал написать этот пост.
Итак, создаем процедуру со следующими шагами:
Для каждого шага устанавливаем правильную технологию и схему БД, где этот шаг процедуры будет выполняться, и не забываем там, где это применимо, указывать тип счетчика:
Создаем опцию процедуры, назовем ее, например, CreateTable. Установим для нее тип Check Box.
Далее, для каждого шага процедуры, кроме первого, устанавливаем признак условного выполнения шага:
Для этого снимаем пометку с Always Execute, и устанавливаем ее напротив опции CreateTable.
Для первого шага устанавливаем признак игнорирования ошибок (Ignore Errors). Так мы делаем для того, чтобы при запуске процедуры не было ошибки, в случае если временной таблицы в БД нет. Вернее, удаление временной таблицы перед ее созданием является правильным подходом, так как возможна ситуация, когда пакет, использующий эту процедуру, будет запущен после неуспешного предыдущего запуска, при котором временная наша таблица не была удалена из БД.
Подготовка закончена. Далее используем созданную нами процедуру в пакете два раза:
В этом подходе есть, кроме плюсов, и минусы, в частности, для использования временной таблицы в интерфейсе, ее необходимо еще и создать в модели.
< Предыдущая | Следующая > |
---|