oracle 如何处理依赖于同一个临时表的两个并行fn /过程调用

lpwwtiir  于 2023-08-03  发布在  Oracle
关注(0)|答案(1)|浏览(101)

我有一个Business Objects Excel报表,其中有2个工作表,每个工作表都有多个列。
对于每个工作表,BO将从Oracle DB中的不同管道表函数执行SELECT(并且这些函数中的每个函数将调用存储过程)。
每个工作簿中的列彼此完全不同,但它们都依赖于临时表的初始填充(两者具有相同的数据)。每个存储过程查询的起点就是这个临时表。
出于性能考虑,我只想填充这个临时表一次,并让两个函数/ sps都使用它。然而,由于函数是并行调用的,其中一个函数如何填充临时表,从而允许它自己和另一个函数使用插入的数据。不能保证一个函数会在另一个函数之前被调用,或者在另一个函数需要数据时插入操作会完成。
顺便说一下,我在这里试图取代我眼中的可怕解决方案,即两个工作表都从单个函数调用中获取数据,并且两个数据集都作为单个数据集返回,使用UNION和一个标志来表示每行它们属于哪个数据集。该标志实际上是两个数据集之间唯一的公共字段,并且对于每一行,另一个数据集的字段都被返回为空值。
肯定有更好的办法来做这件事吧?

jum4pzuy

jum4pzuy1#

我在这里做几个假设:

  • 您正在使用BO Live Office
  • 没有使用Oracle GLOBAL TEMPORARY TABLE,而只是使用常规表。
  • 您的查询将参数传递给存储的proc,这些参数用于填充临时表;在将临时表结果流水线传送回BO时不使用这些参数。

顺便说一句,如果两个人同时运行查询,如何避免冲突?
如果我在上面是正确的,那么我建议VBA解决方案。我没有使用过LO很多,也没有使用过它的VBA库,但我认为这应该是可能的:
总共设置四个查询:

  • 第一个使用您现有的SP宇宙并将参数传递给存储的proc。存储的proc生成一个唯一的键,并使用传递的参数填充临时表,并在每行包含唯一的键。存储的proc通过管道表返回键,并在VBA脚本中检索。
  • 接下来的两个查询与您现有的两个函数相关。VBA将唯一键作为参数传递,此键用于查询临时表。如果这些函数不做任何PL/SQL魔术,那么这一步可以用两个“常规”BO universe查询代替,只使用唯一键作为提示。
  • 第四个查询什么也不做,只是调用另一个SP来删除临时表中与唯一键关联的行。

话虽如此,您现有的解决方案听起来并没有那么糟糕。它复制了查询,但避免了同步数据的创建/删除的需要,同步数据的创建/删除本来就包含一些复杂性。
Bartosz提到用锁。我认为你需要很多额外的逻辑来实现这一点。这两个过程中的每一个都需要知道是自己创建临时表,还是应该等待,因为另一个正在创建临时表。一旦填充了表并释放了锁,您就需要用某种方法让这两个过程确定哪一个是最后一个要处理数据的过程,这样就可以清除临时表了。

相关问题