**
Принимая только сегодняшние данные:
** Я добился очень хороших успехов, используя разъемы Attunity Oracle.Когда вы используете их для настройки источника Oracle, вы можете определить источник либо как имя таблицы / представления, либо как запрос SQL.Когда вы сделаете это, вы можете добавить WHERE
условий к вашему запросу.
Простая версия этого метода будет выглядеть следующим образом: ![enter image description here](https://i.stack.imgur.com/Xzo3S.png)
Но еслиВы хотите использовать дату, которая не жестко запрограммирована в запросе, вам нужно создать выражение.Это похоже, но вы добавляете Execute SQL Task
перед потоком данных, создаете там динамический SQL-запрос и сохраняете его в переменную.Затем вы можете использовать эту переменную для определения выражения для запроса исходного кода Oracle.
Используя ту же таблицу, что и раньше, вот как я извлекаю последние 3 месяца записей: ![enter image description here](https://i.stack.imgur.com/GKbLj.png)
Затем выберите задачу «Поток данных» и посмотрите в окно «Свойства».В разделе «Разное» вы должны увидеть строку для вашего [Oracle Source].[SqlCommand]
.Вы можете зайти в редактор выражений здесь и установить свою переменную как SqlCommand.![enter image description here](https://i.stack.imgur.com/kG6jp.png)
Принимая только обновленные строки:
Для этого вы можете использовать метод, который сравнивает значения хеш-функции из вашего источника с полученными в месте назначения, чтобы определить, является ли строкаизменилось.
Первое, что вам нужно сделать, это импортировать все ваши данные, включая хэш данных строки.
Определите источник Oracle для использования команды SQL в качестве режима доступа к данным.Вот пример с моей таблицей:
SELECT
CAST("Data Source Code" AS VARCHAR2(3)) AS "DataSourceCode"
,"Matrix Id" AS "MatrixId"
,CAST("Primary Matrix Type" AS VARCHAR2(11)) AS "PrimaryMatrixType"
,CAST("Branch Number" AS VARCHAR2(4)) AS "BranchId"
,"Effective Date" AS "EffectiveDate"
,"Expiration Date" AS "ExpirationDate"
,"Spa Flag" AS "SpaFlag"
,CAST("Default Contract Number" AS VARCHAR2(50)) AS "DefaultContractNumber"
,CAST("Direct Contract Number" AS VARCHAR2(50)) AS "DirectContractNumber"
,"Refresh Date" AS "RefreshDate"
,CAST(UPPER(RAWTOHEX(SYS.DBMS_OBFUSCATION_TOOLKIT.MD5(input_string =>
CAST("Data Source Code" AS VARCHAR2(3)) || '|' ||
"Matrix Id" || '|' ||
CAST("Primary Matrix Type" AS VARCHAR2(11)) || '|' ||
CAST("Branch Number" AS VARCHAR2(4)) || '|' ||
CAST("Effective Date" AS VARCHAR2(30)) || '|' ||
CAST("Expiration Date" AS VARCHAR2(30)) || '|'||
"Spa Flag" || '|' ||
CAST("Default Contract Number" AS VARCHAR2(50)) || '|' ||
CAST("Direct Contract Number" AS VARCHAR2(50))
))) AS VARCHAR2(32)) AS "HashVal"
FROM DWDIGITAL.CONTRACT_TABLE
WHERE "Effective Date" >= TO_DATE('2018/01/01', 'yyyy/mm/dd')
Я использую SYS.DBMS_OBFUSCATION_TOOLKIT
здесь, чтобы сгенерировать хеш-значение MD5, используя объединенную строку всех данных столбца строки (убедитесь, что все столбцы преобразованы в строкидля хэша).Я использую SYS.DBMS_OBFUSCATION_TOOLKIT
вместо ORA_HASH
, потому что у меня ограниченные разрешения на сервере Oracle, и SYS.DBMS_OBFUSCATION_TOOLKIT
не требует расширенных привилегий, как ORA_HASH
.Я также выбираю MD5 здесь, потому что если мне нужно сгенерировать хеш-значение на стороне SQL, после этого я все равно могу сгенерировать те же хеш-значения, поскольку SQL Server также может использовать алгоритм MD5.Если бы у вас был доступ к ORA_HASH
, вы могли бы использовать один из алгоритмов SHA *.Также обратите внимание, что я добавляю |
между каждым столбцом в расчете хэша.Это так, что "My"+"text"
и "Myt"+"ext"
будут генерировать разные хэши и предотвращать ложное срабатывание, потому что My|text
и Myt|ext
различны.
Итак, теперь ваша таблица назначения загружена вашими данными, ихеши ваших данных.Чтобы создать итеративную загрузку, сначала необходимо создать «кэш» ключей и значений хеш-функции из пункта назначения.Добавьте задачу «Поток данных» и создайте исходное соединение, которое указывает на таблицу назначения, и направьте этот поток в Cache Transform
.![enter image description here](https://i.stack.imgur.com/zuvlG.png)
Преобразование кэша будет использоваться для выполнения преобразований поиска в следующем DFT.Вам необходимо настроить файл кэша и столбцы для кэширования.
![enter image description here](https://i.stack.imgur.com/8e6sV.png)
Мой первичный ключ установлен в положение индекса 1.
Следующий поток данных будет выглядеть примерно так:![enter image description here](https://i.stack.imgur.com/Iu9D2.png)
Исходное соединение здесь будет использовать тот же запрос, который вы использовали во время начальной загрузки выше.Затем вы создаете преобразование «Уточняющий запрос» и добавляете кэшированный HashVal в качестве нового столбца.![enter image description here](https://i.stack.imgur.com/TSVdw.png)
У вас должно быть два выхода здесь.Вывод «Нет совпадения» - это строки из источника, где ключ не существует в месте назначения.Это новые строки для вставки.Затем возьмите «Соответствующий» вывод и укажите его на «Условное разделение».Условный Split будет сравнивать HashVals.Соответствующие HashVals указывают на отсутствие изменений в строке.Несоответствие HashVals указывает, что запись изменилась.Я загружаю эти записи в промежуточную таблицу и использую хранимый вызов proc для выполнения операции UPDATE
.![enter image description here](https://i.stack.imgur.com/R0d6h.png)