2014-02-20 42 views
2

我有两个不同的数据库,比如DB1和DB2。在这两个数据块我有一个名为test_emp一个共同的表,但在表中的列的区别:使用DBlink的oracle插入

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 [email protected]_Name 

但在这里我有一个问题目标表的列数比源数多。 在这里,我不能指定column_names,因为我将表传递为动态。

你能帮助别人吗?

回答

2

你可以看看双方的数据库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 [email protected]_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; 

我没有测试的代码。确保您打印插页并确认它符合您的期望。

+0

谢谢,需要更多的建议 –

+0

为什么你需要更多的建议?这个解决方案怎么样不符合你的需求? –

+0

@Ashok - 如果您有任何更改,请编辑您的问题,并告诉我们更改的内容。弗兰克 - 感谢您的编辑。 –

1

使用

INSERT INTO table1 
SELECT a.*, 
     NULL, 
     NULL 
FROM [email protected]_ 
+2

我不会推荐这个 - 这依赖于两个表的列顺序。如果其中一个表被删除并使用不同的列顺序重新创建,则这会失败并显示转换错误或(更糟糕的是)以静默方式插入错误的数据。 –

+0

另一个问题是......如果OP试图动态生成这个数据,你如何知道需要添加的'null'列的数量(在上面的例子2中)? –

+0

@FrankSchmitt和Rajesh:提供的解决方案不是通用的,我接受。这是解决OP问题的唯一方法。 – San