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



我确实有Oracle数据库,它有多个DB_LINKS。

这些DB_Links存储在本地 (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;

我不会为此使用SYS_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 提供了具体化视图等功能,用于在环境之间复制数据,如果可以在多个源系统上修改单个行,则具有多主复制功能。 推出自己的自定义复制解决方案几乎没有意义。

最新更新