使用 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 dblink ora-12541 无监听

使用DBLink访问时,提示ORA-01017

如何解决dblink过多的问题

oracle 中报ora-30926 无法在源表中获得稳定的行 是怎么回事

oracle 中报ora-30926 无法在源表中获得稳定的行 是怎么回事

如何创建从SQL到Oracle的DBlink