oracle - 如何从多个数据库链接中获取数据并使用 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;
解决方案
我不会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 提供了诸如物化视图之类的东西来在环境之间复制数据,并且具有多主复制的功能。滚动您自己的自定义复制解决方案很少有意义。
推荐阅读
- jenkins - Jenkins kubernetes 代理结帐 scm 未使用配置的密钥
- angular - 如何将 div 中的所有元素居中对齐,包括角度材料输入选择?
- c# - OpenXML 图像未嵌入到单元格中
- python - microgear 客户端卡在连接上
- java - 使用 sonarq 和 jdk11 运行覆盖的运行时错误
- javascript - 为什么我的 React 构建的 index.html 是空白的?
- amazon-web-services - AWS sam local:为什么 start-lambda 需要“sam build”,而不是“sam invoke”?
- python - Django FormViews 显示下拉菜单而不是字符和文本字段
- typescript - 如何使用 Jest 模拟类并作为参数注入
- cron - 除了步骤条件之外,如何在无人机中使用 cron 触发器?