2014-02-20 4 views
2

У меня есть две разные базы данных, например DB1 и DB2. В обоих БД у меня есть общий стол под названием test_emp, но есть разница в столбцах таблиц:oracle insert using DBlink

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

Вы можете посмотреть на таблицах словарь/метаданных оракул данных на обеих базах данных и генерировать необходимый 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 
    ) 

Вы могли бы затем использовать эту строку (список разделенных запятыми colums), чтобы сделать что-то вдоль линий ..

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

Другая проблема: откуда вы знаете количество нулевых столбцов, которые нужно добавить (в приведенном выше примере 2), если OP пытается сгенерировать это динамически? –

+0

@FrankSchmitt и Rajesh: Предоставленное решение не является общим, и я принимаю это. Это решение проблемы ОП. – San

Смежные вопросы