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