如何通过 DBLINK 通过 DBLINK 调用 SELECT?
Posted
技术标签:
【中文标题】如何通过 DBLINK 通过 DBLINK 调用 SELECT?【英文标题】:How to invoke SELECT over DBLINK over DBLINK? 【发布时间】:2013-12-02 09:12:40 【问题描述】:在 Oracle 11G 中我可以轻松调用:
SELECT * FROM TABLE@DB_LINK_NAME;
但是如何通过另一个 DB_LINK 上的 DB_LINK 调用 SELECT
?
类似这样的:
SELECT * FROM TABLE@REMOTE_DB_LINK_NAME@DB_LINK_NAME;
【问题讨论】:
【参考方案1】:首先,在架构上,我对任何涉及通过多个数据库链接提取数据的设计都持谨慎态度。当最终源是目标数据库无法直接连接到的某个古老版本的 Oracle 时,我已经看到它完成了,因此使用了运行 Oracle 中间版本的中间数据库。不过,这在实践中非常罕见。
从性能的角度来看,这种方法存在严重问题。当然,存在数据将通过网络发送两次的问题。但更令人担忧的是,您正在处理一个难题,优化分布式 SQL 语句,并使其几乎难以处理。您基本上必须保证您永远不会在同一查询中查询本地数据和远程数据,或者如果 Oracle 决定采用愚蠢的查询计划,您将不得不忍受由此产生的性能,因为剩下的工具集允许您优化这种查询是最小的。
话虽如此,中间数据库需要具有抽象出数据库链接的同义词或视图。所以
在 A 上:
创建指向 B 的数据库链接在 B 上:
创建指向 C 的数据库链接 为table@C
创建同义词table
在A上,你可以
SELECT *
FROM table@B
【讨论】:
JustinCave 感谢您的快速响应。在我的 DATA_WAREHOUSE 上,我们有这样的同义词,但我正在尝试执行类似的操作:declare v_ddl clob; V_DDL_PART varchar2(4000); begin for I in 0 .. 50 loop select DBMS_LOB.SUBSTR@db_link(DBMS_METADATA.GET_DDL@db_link('TABLE','MYTABLE'),(4000 * I + 1)) into V_DDL_PART from dual@db_link; V_DDL := V_DDL || V_DDL_PART; end loop; end;
但现在我只能看到这些同义词,但我想阅读第二个数据库上的源定义
@WBAR - 好的。所以问题不在于您不能从A
引用C
上的表。问题是您不能从A
调用C
上的存储过程。您需要在B
中创建包装程序,以调用C
上的dbms_metadata
包。我不知道如何使用同义词来实现这一点,尽管这种方法很可能存在。以上是关于如何通过 DBLINK 通过 DBLINK 调用 SELECT?的主要内容,如果未能解决你的问题,请参考以下文章
为啥不能通过 DBLink 发送 Oracle XMLType?