在 Oracle PL/SQL 视图中管理 DB 链接

Posted

技术标签:

【中文标题】在 Oracle PL/SQL 视图中管理 DB 链接【英文标题】:Managing DB Links inside a view Oracle PL/SQL 【发布时间】:2014-02-25 19:31:54 【问题描述】:

假设您有六个基本相同的 Oracle 数据库服务器,但代表不同的工厂。

为了更容易报告,我们可以在通过@dblink1-6 选择的第七台服务器上制作一个漂亮的大视图。 99% 的时间都可以正常工作。有人在植物 5 踢绳子,你的观点对所有植物都是死的。在这种情况下,我们只想显示正在工作的五个。

我无法将来自六台服务器的数据推送到第七台,第七台必须注意 1-6。我们不能使用物化视图,因为在这种情况下这不是实时数据……通常可以,但对于外部服务器无法将数据推入的链接服务器则不然。

我可以在视图中写入什么内容,该视图基本上说明如果此 dblink 有效,则在 select 语句中联合,否则无效?

【问题讨论】:

【参考方案1】:

如您所见,在 dblink 不可访问后,第一次访问跨 dblink 的视图查询将被标记为无效。

我首选的解决方案是使用物化视图,以便第七台服务器始终可以访问至少一些数据 - 但在您的情况下,您更希望没有数据而不是非实时数据,所以这不是一个选项。

在这种情况下,您需要一些东西来捕获“dblink inaccessible”异常并将其隐藏在视图中。我能想到的解决这个问题的唯一方法是使用流水线函数查询表,如果 dblink 关闭,它将吞下异常并返回零行。然后,您的原始视图将跨六个流水线函数联合所有查询。不幸的是,我很确定与您的原始视图相比,此解决方案的性能会很差,因为它无法执行将谓词推送到视图中之类的操作(实际上,流水线函数将在每个 dblink 上强制执行等效的 FTS可用,每次运行查询时)。由于您的目的是报告,因此这可能是也可能不是大问题。

注意:我实际上从未这样做过,所以这个答案只是“一个尝试的想法”。

【讨论】:

这个功能思路很有创意。这可能在将来的某一天对我有用,而我永远不会想到这一点。正如你所说,这些功能会非常慢......看起来无论如何我们都会有缓慢的数据。如果我要选择降低数据速度的方法,那么物化视图将在任何一天击败该功能......正如你所说。所以我认为这是一个已经完成的决定,谢谢你的帮助。 我想我会对此进行更新...最终使用该功能,但将其与全局临时表结合在一起。无论是通过函数,还是使用带有大联合语句的直接六个 db 链接,当使用多个工厂的数据时,报告性能(可以预见?)很糟糕。解决方案:使用流水线函数填充全局临时表,然后对其进行报告。它运行得非常快(按照我们的标准),而且我们在其中一台服务器上遇到了问题,而流水线功能无疑让我们在其他五家工厂中受益匪浅。谢谢杰弗里坎普! -约翰 您知道,如果您乐于将结果存储在本地,为什么不使用 MV?填充 GT 的步骤可以很容易地刷新物化视图。只是一个想法:)

以上是关于在 Oracle PL/SQL 视图中管理 DB 链接的主要内容,如果未能解决你的问题,请参考以下文章

Db2:如何在 db2 中部署 Oracle PL/SQL 包?

如何在 pl\sql oracle db 中运行具有给定参数的 exe 文件

如何使用其他 pl/sql 块在 Oracle db 中输出信息?

PL/SQL/Oracle DB:过程:ORA-29013:SSL MAC 验证失败(数据库 19c)

在 PL/SQL 中列出过程参数

从 .txt 文件读取数据并将其插入 Oracle SQL DB [PL/SQL,Unix 脚本]