Oracle 如何从多个数据库链接中获取数据,并使用LOOP将其插入到特定表中

Oracle 如何从多个数据库链接中获取数据,并使用LOOP将其插入到特定表中,oracle,plsql,bulkinsert,execute-immediate,sys-refcursor,Oracle,Plsql,Bulkinsert,Execute Immediate,Sys Refcursor,我有Oracle数据库,它有多个DB_链接 这些数据库链接存储在本地(数据库链接TBL)表中 目标是将远程数据与本地计算机同步 我使用循环和REF_游标插入完成了任务,但无法将REF_游标插入表中 数据库链接表: 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')

我有Oracle数据库,它有多个DB_链接

这些数据库链接存储在本地(数据库链接TBL)表中

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

我使用循环和REF_游标插入完成了任务,但无法将REF_游标插入表中

数据库链接表:

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;

我不会为此使用
SYS\u REFCURSOR
。直接插入即可

  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提供了物化视图之类的功能来在环境之间复制数据,并且如果可以在多个源系统上修改单个行,则具有多主机复制功能。滚动您自己的自定义复制解决方案很少有意义。

创建一个记录类型,并使用它而不是ref cursor。