itgendch033:后备数据库需要 Invantive Data Replicator 将 'ExactOnlineXML.XML.SubscriptionLines' 的列数限制为 1,000

itgendch033: Backing databases require Invantive Data Replicator to restrict the number of columns to 1,000 for 'ExactOnlineXML.XML.SubscriptionLines'

当执行批处理脚本从 Exact Online 复制我的数据时,出现以下错误:

Error itgencun016: Exclamation itgendch033: Backing databases require Invantive Data Replicator to restrict the number of columns to 1,000 for 'ExactOnlineXML.XML.SubscriptionLines'.

它发生在以下查询中:

select /*+ ods(true, interval '20 hours') */ count(*) 
from   ExactOnlineXML.XML.SubscriptionLines

ExactOnlineXML.XML.InvoiceLines也是如此。

如何在不使列最大化的情况下复制这些表。

Invantive SQL 不限制列名的长度,也不限制 table 或视图的列数。

但是,传统数据库是在另一个时代设计的,通常限制为例如 30..128 个字符的列名和 1.000、1.024 或几千列。记住 Oracle 运行 在 64 KB 上(32 K 代码,32 K 数据);这大约是这个问题和答案的大小:-)

将数据从 Exact Online 复制到传统数据库(如 Oracle、SQL Server 或 PostgreSQL 时),Invantive Data Hub 将使用 Invantive SQL 从中检索数据case Exact Online 然后批量加载到数据库中。

但是,数据必须适合列名和列号。

这就是列名如此怪异的主要原因;它们适合独立于原始列名称的有限数量的字符。生成的视图的列名也通过删除具有唯一 MD5 哈希的中心部分来缩短。

对于列数,Data Hub 只是严格检查您的源没有超过 1.000 列的限制。 Exact Online XML API 没有描述哪些列可以用值填充的文档;只是一个描述所有理论可能性的 XSD,导致数百万列。

大多数 Exact Online XML-based table 已经调整为排除没有值的列名称路径,但它们通常仍然不适合 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 响应时间。

通过点击按钮 'Hide empty columns' 或使用 Invantive Data Hub 作为用户界面,您可以获得实际结果:

注意工具提示:标题显示的标签有些自然,但实际的列名称显示在工具提示中。

写下您需要的列名,然后只用您需要的列填写 in-memory table,例如:

create or replace table my_subscriptions@inmemorystorage
as
select /*+ ods(false) */ 
       subscription_number_attr 
,      subscription_description
from   exactonlinexml..subscriptionlines

现在以正常方式复制此 table:

select /*+ ods(true, interval '1 second') */ 
       count(*) some_unneeded_data_to_force_replication
from   my_subscriptions@inmemorystorage

请注意,ODS 提示必须存在。 In-memory table 默认情况下从不复制。

刷新可以使用alter persistent cache [force] refresh,但是in-memorytable必须提前填写

存储库中的结果条目将是:

事实table(请参阅 dcs_.... 了解时间旅行的数据仓库)是:

而默认的命名视图是imy_my_subscriptions_r(imy是'inmemorystorage' driver的缩写):