Invantive SQL не накладывает ограничений ни на длину имен столбцов, ни на количество столбцов для таблицы или представления.
Однако традиционные базы данных были разработаны в другое время и обычно ограничиваются, например, 30..128 символов имен столбцов и 1.000, 1.024 или несколько тысяч столбцов.Помните, что Oracle работал на 64 КБ (32 КБ, 32 КБ данных);это примерно размер этого вопроса и ответа: -)
При репликации данных из Exact Online в традиционную базу данных, такую как Oracle, SQL Server или PostgreSQL, Invantive Data Hub будет использовать Invantive SQL для извлечения данных изв этом случае Exact Online, а затем массовая загрузка его в базу данных.
Однако данные должны соответствовать как именам столбцов, так и номерам столбцов.
Это главная причина, по которой имена столбцов такие странные;они помещаются в ограниченное количество символов независимо от оригинальных имен столбцов.Имена столбцов сгенерированных представлений также сокращаются за счет удаления центральных частей с уникальным хешем MD5.
Для числа столбцов Data Hub просто строго проверяет, что в вашем источнике не более 1 000 столбцов.,Exact Online XML API не имеет документации, описывающей, какие столбцы можно заполнить значением;просто XSD, описывающий все теоретические возможности, приводящие к миллионам столбцов.
Большинство таблиц Exact Online на основе XML были настроены таким образом, чтобы исключить пути к именам столбцов, которые не имеют значений, но все же часто не соответствуютв пределах 1000 столбцов.
Возможные решения:
- Использовать вариант Exact Online REST API, который часто присутствует, а иногда и похож по функциональности и производительности (не всегда, XMLAPI старый, но в целом лучше для удобства использования).Поэтому проверьте, существует ли
ExactonlineREST..SubscriptionLines
. - . Подробно опишите, какие столбцы нужно реплицировать.
Опишите столбцы для репликации
Последнее решение немного сложнее.Он также не поддается использованию продвинутых стратегий, таких как ручная загрузка (с веб-хуками) или умная выборка;это просто обычная копия с версиями или без них.
В качестве примера я выполнил запрос к 200 точным компаниям с подписками при подключении к среде репликатора данных:
Обратите внимание, что /*+ ods(true) */
отсутствует, но подразумевается;репликация по умолчанию выполняется также при подключении к репликатору данных.
Добавляя /*+ ods(false) */
, вы фактически указываете механизму SQL не отправлять данные для репликации в базу данных поставщику репликатора данных.
Когда я запускаю его, возникает другая ошибка itgenugs026 (запрошенное количество столбцов превышает максимальное число, поддерживаемое для отображения в таблице результатов):
Это на самом деле ошибка рендеринга;сетка, используемая в Query Tool, ограничивается 1.000 столбцами.Большие объемы столбцов приводят к очень медленному времени отклика пользовательского интерфейса.
Нажав кнопку «Скрыть пустые столбцы» или используя Invantive Data Hub в качестве пользовательского интерфейса, вы можете получить фактические результаты:
Обратите внимание на подсказку: заголовок отображает несколько естественных меток, но фактическое имя столбца отображается во всплывающей подсказке.
Запишите названия столбцов, которые вам нужны, изаполните таблицу в памяти только теми столбцами, которые вам нужны, например:
create or replace table my_subscriptions@inmemorystorage
as
select /*+ ods(false) */
subscription_number_attr
, subscription_description
from exactonlinexml..subscriptionlines
Теперь скопируйте эту таблицу обычным способом:
select /*+ ods(true, interval '1 second') */
count(*) some_unneeded_data_to_force_replication
from my_subscriptions@inmemorystorage
Обратите внимание, что подсказка ODS должна присутствовать,Таблицы в памяти никогда не реплицируются по умолчанию.
Для обновления вы можете использовать alter persistent cache [force] refresh
, но таблица в памяти должна быть заполнена заранее.
Результирующая запись в хранилищебудет:
Таблица фактов (см. dcs _.... для Data Vault с перемещением во времени):
Именное представление по умолчанию - imy_my_subscription_r (imy - это сокращение от драйвера 'inmemorystorage'):