Oracle 19c:无需新建DB Link,如何从SiteC间接访问SiteA?
Oracle 19c跨站点链式访问问题解答
可以无需创建新的DB Link从SiteC访问SiteA,但你尝试的table@site_a@site_b这种双@嵌套语法确实不被Oracle支持,得通过以下几种间接方式实现:
方法1:借助SiteB的视图中转
- 在SiteB实例上,创建指向SiteA目标表的视图:
CREATE VIEW v_sitea_target_table AS SELECT * FROM target_table@site_a; - 在SiteC实例上,通过指向SiteB的DB Link访问这个视图:
SELECT * FROM v_sitea_target_table@site_b;
方法2:使用DBMS_HS_PASSTHROUGH包执行穿透查询
通过Oracle的DBMS_HS_PASSTHROUGH包,在SiteC上通过SiteB的链接执行直接指向SiteA的SQL语句,示例如下:
DECLARE v_cursor INTEGER; v_column_value VARCHAR2(200); BEGIN -- 打开SiteB上的游标 v_cursor := DBMS_HS_PASSTHROUGH.OPEN_CURSOR@site_b; -- 解析指向SiteA的查询语句 DBMS_HS_PASSTHROUGH.PARSE@site_b(v_cursor, 'SELECT column_name FROM target_table@site_a'); -- 循环获取查询结果 WHILE DBMS_HS_PASSTHROUGH.FETCH_ROW@site_b(v_cursor) > 0 LOOP DBMS_HS_PASSTHROUGH.GET_VALUE@site_b(v_cursor, 1, v_column_value); DBMS_OUTPUT.PUT_LINE('查询结果:' || v_column_value); END LOOP; -- 关闭游标 DBMS_HS_PASSTHROUGH.CLOSE_CURSOR@site_b(v_cursor); END; /
方法3:在SiteB创建同义词指向SiteA对象
- 在SiteB实例上,创建指向SiteA目标表的同义词:
CREATE SYNONYM syn_sitea_target_table FOR target_table@site_a; - 在SiteC实例上,通过SiteB的DB Link访问该同义词:
SELECT * FROM syn_sitea_target_table@site_b;
以上三种方式都不需要在SiteC上新建指向SiteA的DB Link,就能实现跨站点访问。
内容的提问来源于stack exchange,提问作者Bistic
相关产品推荐
相关产品推荐

