Invantive SQL 对列名的长度以及表或视图的列数没有任何限制。
然而,传统数据库是在另一个时代设计的,通常被限制为例如 30..128 个字符的列名和 1.000、1.024 或几千列。请记住,Oracle 在 64 KB(32 K 代码,32 K 数据)上运行;这大约是这个问题和答案的大小:-)
当从 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 的表已被调整为排除没有值的列名路径,但它们通常不适合 1.000 列。
可能的解决方案是:
- 使用 Exact Online REST API 变体,它经常出现,有时在功能和性能上也相似(并非总是如此,XML API 是旧的,但通常更好地设计用于可用性)。所以检查是否有
ExactonlineREST..SubscriptionLines
.
- 详尽地描述要复制的列。
描述要复制的列
最后一个解决方案有点复杂。它还拒绝使用诸如涓流加载(使用网络挂钩)或智能采样等高级策略;它只是带有或不带有版本控制的普通副本。
作为示例,当连接到 Data Replicator 环境时,我对 200 家有订阅的 Exact 公司进行了查询:
请注意,/*+ ods(true) */
不存在,而是隐含地假设;当还连接到 Data Replicator 时,默认情况下会进行复制。
通过添加/*+ ods(false) */
,您可以有效地告诉 SQL 引擎不要将要复制到数据库中的数据发送到 Data Replicator 提供程序。
当我运行它时,还有另一个错误itgenugs026(请求的列数超过了结果网格中支持显示的最大数量):
这实际上是一个渲染错误;查询工具中使用的网格将自身限制为 1.000 列。较大数量的列会导致 UI 响应时间非常慢。
通过单击“隐藏空列”按钮或使用 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_subscriptions_r(imy 是 'inmemorystorage' 驱动程序的缩写):