我有一个Business Objects Excel报表,其中有2个工作表,每个工作表都有多个列。
对于每个工作表,BO将从Oracle DB中的不同管道表函数执行SELECT(并且这些函数中的每个函数将调用存储过程)。
每个工作簿中的列彼此完全不同,但它们都依赖于临时表的初始填充(两者具有相同的数据)。每个存储过程查询的起点就是这个临时表。
出于性能考虑,我只想填充这个临时表一次,并让两个函数/ sps都使用它。然而,由于函数是并行调用的,其中一个函数如何填充临时表,从而允许它自己和另一个函数使用插入的数据。不能保证一个函数会在另一个函数之前被调用,或者在另一个函数需要数据时插入操作会完成。
顺便说一下,我在这里试图取代我眼中的可怕解决方案,即两个工作表都从单个函数调用中获取数据,并且两个数据集都作为单个数据集返回,使用UNION和一个标志来表示每行它们属于哪个数据集。该标志实际上是两个数据集之间唯一的公共字段,并且对于每一行,另一个数据集的字段都被返回为空值。
肯定有更好的办法来做这件事吧?
1条答案
按热度按时间jum4pzuy1#
我在这里做几个假设:
顺便说一句,如果两个人同时运行查询,如何避免冲突?
如果我在上面是正确的,那么我建议VBA解决方案。我没有使用过LO很多,也没有使用过它的VBA库,但我认为这应该是可能的:
总共设置四个查询:
话虽如此,您现有的解决方案听起来并没有那么糟糕。它复制了查询,但避免了同步数据的创建/删除的需要,同步数据的创建/删除本来就包含一些复杂性。
Bartosz提到用锁。我认为你需要很多额外的逻辑来实现这一点。这两个过程中的每一个都需要知道是自己创建临时表,还是应该等待,因为另一个正在创建临时表。一旦填充了表并释放了锁,您就需要用某种方法让这两个过程确定哪一个是最后一个要处理数据的过程,这样就可以清除临时表了。