You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Oracle 19c:无需新建DB Link,如何从SiteC间接访问SiteA?

Oracle 19c跨站点链式访问问题解答

可以无需创建新的DB Link从SiteC访问SiteA,但你尝试的table@site_a@site_b这种双@嵌套语法确实不被Oracle支持,得通过以下几种间接方式实现:

方法1:借助SiteB的视图中转

  1. 在SiteB实例上,创建指向SiteA目标表的视图:
    CREATE VIEW v_sitea_target_table AS 
    SELECT * FROM target_table@site_a;
    
  2. 在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对象

  1. 在SiteB实例上,创建指向SiteA目标表的同义词:
    CREATE SYNONYM syn_sitea_target_table FOR target_table@site_a;
    
  2. 在SiteC实例上,通过SiteB的DB Link访问该同义词:
    SELECT * FROM syn_sitea_target_table@site_b;
    

以上三种方式都不需要在SiteC上新建指向SiteA的DB Link,就能实现跨站点访问。

内容的提问来源于stack exchange,提问作者Bistic

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.21 12:23:24