我试图想出最有效的方法来比较当前生产数据与我已经折叠日期范围的数据。
所以基本上我有一些生产数据,其中用户将连接到给定的计划,然后可能切换到另一个或一个月内不在计划中等等......
例如:
Plan A 1/1/15 - 6/30/15
Plan A 7/1/15 - 9/30/15
Plan B 10/1/15 - 10/30/15
Plan A 1/1/16 - 3/31/16
然后这些日期被折叠,在上面的情况下,返回将是 3 个跨度
Plan A 1/1/15 - 9/30/15
Plan B 10/1/15 - 10/30/15
Plan A 1/1/16 - 3/31/16
生产的折叠跨度被放入一个关联数组中,以便我可以检查它们是否与此运行的先前过程生成的图像进行对比。
我还将当前折叠跨度的数据集加载到一个数组中,以便可以更快地访问它,而不是转到生产数据数组的每一行的表。这是通过创建一个与我正在填充的表相同的数据类型对象来完成的,然后像这样批量收集
SELECT plan_obj(pk, plan, effective_begin, effective_end)
BULK COLLECT INTO customer_plan_tbl
FROM customer_plan
WHERE id = P_ID;
所以此时我有 2 个由成员填充和排序的关联数组及其有效性。
那么,比较差异和其他变化的最佳方法是什么?
到目前为止,我遍历生产数据,暂时加载另一个第三个数组,其中仅包含来自当前折叠数据的成员数据,例如:
SELECT customer_id, plan, effective_begin, effective_end
BULK COLLECT
INTO customer_plan_compare
FROM TABLE(customer_plan_tbl )
WHERE customer_id = customer_plan_tbl(indx).customer_id AND
plan = customer_plan_tbl(indx).plan;
ORDER BY effective_begin, effective_end, plan;
现在如果这个集合有 0 行,我知道我可以添加新记录,继续,循环遍历这个集合并将其与外部循环的当前行进行比较,如果相同,则当有差异时无所谓,事情需要更新。
这似乎对每一行都做了很多开销,我只是想知道是否有更好的方法来比较基于客户及其有效数据范围的差异的集合。
另一个问题是我限制了批量收集的大小,所以如果同一个客户跨越不同的批量收集,我将不得不解决这个问题。
因此,我们的目标是让这个新表与生产数据保持同步,只是数据跨度的折叠窗口。