假设您有六个oracle数据库服务器基本相同,但代表不同的工厂。
为了便于报告,我们可以在通过@ dblink1-6选择的第七台服务器上做一个很好的大视图。 99%的时间都可以正常工作。有人在第5工厂踢绳子,你的视野对所有植物来说都是死的。在这种情况下,我们想要显示正在运行的五个。
我无法将数据从六台服务器推送到第7位,第7位必须注意到1-6位。我们不能使用物化视图,因为在这种情况下,这不是实时数据...通常它可能是,但不是外部服务器无法推送数据的链接服务器。
我可以写一个基本上说如果这个dblink工作的视图,在select语句中联合,否则不会?
答案 0 :(得分:0)
正如您所发现的,在dblink无法访问后第一次访问dblink时,跨dblink的视图查询将被标记为无效。
我首选的解决方案是使用物化视图,以便第七台服务器始终可以访问至少一些数据 - 但在您的情况下,您更愿意没有数据而不是非实时数据,所以这不是一个选项。
在这种情况下,您需要捕获“dblink accesscessible”异常并将其从视图中隐藏。我能想到解决这个问题的唯一方法是使用流水线函数查询表,如果dblink关闭,它将吞下异常并返回零行。然后,您的原始视图将通过六个流水线函数UNION ALL查询。不幸的是,我很确定这个解决方案与原始视图相比会表现得非常糟糕,因为它无法执行将谓词推入视图的过程(实际上,流水线函数将强制相当于每个dblink的FTS)每次运行查询时都可用)。由于您的目的是报告,这可能是也可能不是一个大问题。
注意:我从来没有真正这样做过,所以这个答案只是“尝试一下”。