Как настроить ODI для автоматического увеличения строк для инкрементного обновления IKM

У меня вопрос об идентификаторе автоинкремента для моего «измерения» и IKM: инкрементное обновление.

У меня есть исходная таблица только с одним столбцом: SUPPLIER_NAME. В нем 23 строки с названиями поставщиков.

У меня есть целевая таблица с двумя столбцами: SUPPLIER_ID, SUPPLIER_NAME

Затем я хочу в SUPPLIER_ID создавать идентификатор автоинкремента для каждой новой строки и использовать IKM: increment update - где кто-то добавляет нового поставщика, мне нужна только таблица обновления (добавить новую строку) и добавить для этого поставщика новый идентификатор (следующее значение для автоинкремента).

Как я могу это сделать?

Я создаю последовательность в БД, например:

Create sequence autoinc start with 1  
increment by 1  
minvalue 1  
maxvalue 1000000;  

В ODI я создаю последовательность: AutoIncrementDIm -> Increment: 1, Native seuqence - имя собственной последовательности: autoinc

Далее я создаю отображение ODI:

Исходная таблица (с одним столбцом) сопоставляется с целевой таблицей (с ID и NAME).

Сопоставить имя_поставщика и имя_поставщика

Для ID я использую: # NFS_HD.AutoIncrementDim_NEXTVAL

В логической части я установил тип интеграции: Incremental Update В физической части я установил для IKM: IKM Oracle Merge

Для моего первого бега это нормально. У меня есть автоинкремент от 1 до 23 для каждого поставщика.

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

Результаты

Новая строка (с новым поставщиком) имеет 47 ID ... Я думаю, что это потому, что последовательность выполнялась для каждой строки.

Что мне нужно изменить, чтобы исправить, или что лучше сделать?


person user3764298    schedule 22.11.2018    source источник


Ответы (1)


В логическом сопоставлении щелкните свой SUPPLIER_ID целевой атрибут. На панели свойств на вкладке «Цель» снимите флажок «Обновить». Это означает, что этот атрибут не будет использоваться в запросе на обновление.

введите здесь описание изображения

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

person JeromeFr    schedule 22.11.2018
comment
Привет JeromeFr, Спасибо за ответ. Он работает только для обновления новой строки - но когда я использую «решение», подобное вашему, при первом запуске - когда у меня есть пустая таблица с поставщиком_id || supplier_name, и я хочу запустить ETL, я получаю id = 1 для каждой строки и supplier_name. Должен ли я иметь два процесса etl? Один для первой загрузки данных в таблицу, а второй для обновления только новых строк? - person user3764298; 23.11.2018
comment
Обновление: ваше решение работает, когда это только ОДНА новая строка - когда у меня есть 3 новые строки, я получаю тот же идентификатор для этих новых строк. - person user3764298; 23.11.2018
comment
Когда я использую: # NFS_HD.AutoIncrementDim_NEXTVAL - я получаю тот же идентификатор для новых строк (у меня есть поставщик 1-24, добавляются новые 3 поставщика, а после etl у меня есть три идентификатора 25 для трех новых поставщиков): NFS_HD.AutoIncrementDim_NEXTVAL - I получить более высокий идентификатор, например, теперь у меня есть 1-24, 25, 25, 25 --- затем я добавляю двух новых поставщиков и использую etl и получаю такой результат: 1-24,25,25,25,53,54. - person user3764298; 23.11.2018
comment
Да, вам нужно использовать: а не #. : является привязкой в ​​PL / SQL, а # - для подстановки на уровне ODI. Таким образом, для операции на основе набора # вернет то же значение. : вернет разные значения. Тот факт, что он переместился с 1 на 24, объясняется тем, что последовательности Oracle не являются безупречными. - person JeromeFr; 26.11.2018