首页 > 解决方案 > 如何从多个数据库链接中获取数据并使用 LOOP 将其插入到特定表中

问题描述

我确实有具有多个 DB_LINKS 的 Oracle 数据库。

这些 DB_Link 存储在本地 (DB_LINKS_TBL) 表中。

目标是将远程数据与本地计算机同步。

我使用 LOOP 和 REF_CURSOR 插入完成了任务,但无法将 REF_CURSOR 插入表中。

DB_LINKS_TBL 表:

CREATE TABLE DB_LINKS_TBL(DB_Link_Name VARCHAR2(50));
INSERT INTO DB_LINKS_TBL VALUES ('CAIRO_DB');
INSERT INTO DB_LINKS_TBL VALUES ('ALEX_DB');

从 CAIRO_DB 、 ALEX_DB 同步数据的过程:

DECLARE
  CURSOR C_DB_LINK IS
         SELECT DB_Link_Name  FROM DB_LINKS_TBL ;
  L_Returnvalue SYS_REFCURSOR;
  L_Sql         VARCHAR2(10000);
BEGIN
  --------------------#
  FOR db IN   C_DB_LINK LOOP
      ----------------
      L_Sql := 'SELECT Emp_Id, Emp_Name
                FROM   EMPS
                WHERE NOT EXISTS ( SELECT ''X''
                                   FROM   EMPS@'||db.DB_Link_Name||'  D
                                   WHERE  D.Emp_Id = S.Emp_Id) ';
      OPEN L_Returnvalue FOR L_Sql ;
      ----------------
      INSERT INTO EMPS   VALUES (L_Returnvalue);      
      COMMIT;
      ----------------
  END LOOP;
  --------------------#
END;

标签: oracleplsqlbulkinsertexecute-immediatesys-refcursor

解决方案


我不会SYS_REFCURSOR为此使用 a 。直接做 INSERT

  L_Sql := 'INSERT INTO emps( emp_id, emp_name )
            SELECT Emp_Id, Emp_Name
            FROM   EMPS
            WHERE NOT EXISTS ( SELECT ''X''
                               FROM   EMPS@'||db.DB_Link_Name||'  D
                               WHERE  D.Emp_Id = S.Emp_Id) ';
  execute immediate l_sql;

但是,只是退后一步,您确定这样做在架构上有意义吗?如果可以在多个源系统上修改单个行,Oracle 提供了诸如物化视图之类的东西来在环境之间复制数据,并且具有多主复制的功能。滚动您自己的自定义复制解决方案很少有意义。


推荐阅读