使用 DBlink 进行 oracle 插入
Posted
技术标签:
【中文标题】使用 DBlink 进行 oracle 插入【英文标题】:oracle insert using DBlink 【发布时间】:2014-02-20 04:51:07 【问题描述】:我有两个不同的数据库,比如 DB1 和 DB2。在这两个数据库中,我都有一个名为 test_emp 的公用表,但表的列有所不同:
DB1
-----
desc table1
--------------
empno number
ename varchar2
sal number
hiredate date
deptno number
DB2
-----
desc table2
--------------
empno number
ename varchar2
sal number
insert into table1 select * from table2@DBLink_Name
但是这里我的列数有问题,目标表的列比源表的多。
在这里我不能指定column_names
,因为我将表格作为动态传递。
有人可以帮忙吗?
【问题讨论】:
【参考方案1】:您可以查看两个数据库上的 oracle 数据字典/元数据表,并为插入生成必要的 sql。如果i_table_name
是您的输入。
select list_agg(column_name,',') columns -- comma separated list of columns
from (
select column_name
from all_tab_cols
where owner = 'XYZ'
and table_name = i_table_name
intersect
select column_name
from all_tab_cols@remote_database
where owner = 'XYZ' -- could be different (?)
and table_name = i_table_name
)
然后你可以使用这个字符串(逗号分隔的列列表)来做一些事情......
v_sql := 'insert into ' || i_table_name || ' ' || '(' ||
v_column_list || ')' ||
' select ' || '( ' || v_column_list ||
' from ' || i_table_name || '@' || remote_db_name;
dbms_output.put_line(v_sql);
execute immediate v_sql;
我还没有测试过代码。确保您打印了插页并确认它符合您的期望。
【讨论】:
为什么需要更多建议?这个解决方案不符合您的需求怎么办? @Ashok - 如果您有更改,请编辑您的问题并让我们知道发生了什么变化。弗兰克 - 感谢您的编辑。【参考方案2】:使用
INSERT INTO table1
SELECT a.*,
NULL,
NULL
FROM table2@dblink_
【讨论】:
我不建议这样做 - 这取决于两个表的列顺序。如果其中一个表被删除并使用不同的列顺序重新创建,这将失败并出现转换错误或(更糟糕的是)静默插入错误数据。 另一个问题是.. 如果 OP 试图动态生成,您如何知道需要添加的“空”列的数量(在上述情况 2 中)? @FrankSchmitt 和 Rajesh :提供的解决方案不是通用的,我接受。这只是 OP 问题的解决方案。以上是关于使用 DBlink 进行 oracle 插入的主要内容,如果未能解决你的问题,请参考以下文章
oracle 中报ora-30926 无法在源表中获得稳定的行 是怎么回事