我正在使用Oracle SQL Developer版本4.02.15.21。
我需要编写一个访问多个数据库的查询。我试图做的就是获取" TableX"中所有ID的列表。 (每个数据库中有一个Table1实例,但每个数据库都有不同的值)并将所有结果合并为一个大列表。
我的问题来自访问超过4个数据库 - 我收到此错误:ORA-02020:使用的数据库链接太多。我无法更改INIT.ORA文件的open_links最大限制。
所以我尝试动态打开/关闭这些链接:
SELECT Local.PUID FROM TableX Local
UNION ALL
----
SELECT Xdb1.PUID FROM TableX@db1 Xdb1;
ALTER SESSION CLOSE DATABASE LINK db1
UNION ALL
----
SELECT Xdb2.PUID FROM TableX@db2 Xdb2;
ALTER SESSION CLOSE DATABASE LINK db2
UNION ALL
----
SELECT Xdb3.PUID FROM TableX@db3 Xdb3;
ALTER SESSION CLOSE DATABASE LINK db3
UNION ALL
----
SELECT Xdb4.PUID FROM TableX@db4 Xdb4;
ALTER SESSION CLOSE DATABASE LINK db4
UNION ALL
----
SELECT Xdb5.PUID FROM TableX@db5 Xdb5;
ALTER SESSION CLOSE DATABASE LINK db5
然而,这会产生' ORA-02081:数据库链接未打开。'关于最后关闭的数据库。
有人可以建议替代或调整上述内容吗?
如果可能,请提供一小部分建议,并提供语法正确的SQL。
答案 0 :(得分:3)
如果您无法更改open_links
设置,则无法从您要查询的所有数据库中选择一个查询。
如果您的要求是通过数据库链接查询大量数据库,则更改open_links
设置似乎非常合理。如果你有一组人告诉你需要做X(从大量表中查询数据)而另一组人告诉你你不能做X,那么拥有这两组人几乎总是有意义的谈谈并找出哪些必要的胜利。
如果我们可以在不编写单个查询的情况下解决问题,那么您可以选择。例如,您可以编写一些PL / SQL,依次从每个表中选择数据并对其执行某些操作。根据所涉及的数据库链接的数量,编写一个为每个数据库链接生成动态SQL语句的循环,执行SQL,然后关闭数据库链接可能是有意义的。
如果您需要为用户提供运行返回所有数据的单个查询的能力,您可以编写一个使用动态SQL实现此类循环的流水线表函数,然后让用户查询流水线表功能。这不是一个从所有表中获取数据的单个查询。但它可能会在没有修改open_links
限制的情况下尽可能接近。