2014-10-10 5 views
1

У меня есть таблица, которая имеет один из своих столбцов в виде вложенной таблицы.Как скопировать данные из таблицы с вложенным столбцом таблицы

Я хочу скопировать данные этой таблицы в другую. Как мы создаем предложение INSERT для этого, кажется сложным:

Рассмотрите. Поле, которое представляет собой вложенную таблицу, - это phone_list, тип которого является определяемым пользователем типом «TBL_PHONE_EXTN», который является таблицей «typ_phone_extn».

CREATE OR REPLACE TYPE typ_phone_extn AS OBJECT 
(phone_number VARCHAR2 (20), extension VARCHAR2 (10)); 
/

CREATE OR REPLACE TYPE tbl_phone_extn AS TABLE OF typ_phone_extn; 
/

Очевидно ниже не удается: (с ORA-00904:: неверный идентификатор)

INSERT INTO sch2.sub_pat_address (
      pat_address_id, 
      pat_id, 
      **phone_list,** 
      last_updated_by 
) 
    SELECT pat_address_id, 
      pat_id, 
      **phone_list,** 
      last_updated_by 
    FROM sch1.sub_pat_address ; 

Так я попробовать:

SELECT pat_address_id, 
      pat_id, 
      **tbl_phone_extn(typ_phone_extn (phone_number,extension)),** 
      last_updated_by 
    FROM sch1.sub_pat_address, **table(phone_list)** ; 

Что это делает unnest вложенной таблицы. Поэтому я получаю больше записей, чем хочу - это означает, что если у определенного pat_address_id был phone_list из 5 телефонов, комбинация extn дает мне 5 записей, которые я не могу и не должен вставлять.

Вопрос в том, как сохранить гнездо (вложенную таблицу столбцов) как есть и вставить в новую таблицу? Ну, CTAS может быть одним из вариантов, но для него требуется целая новая таблица вместо INSERT. Любая помощь будет оценена.

+0

Как были созданы ваши таблицы? 'INSERT INTO ... tbl_col SELECT tbl_col ...' _should_ работать без ошибок. Или я пропустил некоторые тонкости? –

+1

У вас есть 'ORA-00904', а не' ORA-00932: непоследовательные типы данных' или 'ORA-01031: недостаточные привилегии'? Являются ли таблицы в обеих построенных схемах ссылкой на их собственный тип объекта/таблицы или общий? –

ответ

1

Вы можете использовать COLLECT function, чтобы снова собрать безгнездных элементы в вложенной таблицы, литье, что на ваш фактический тип коллекции:

SELECT pat_address_id, 
      pat_id, 
      cast(collect(typ_phone_extn(phone_number,extension)) as tbl_phone_extn), 
      last_updated_by 
    FROM sch1.sub_pat_address, table(phone_list) 
GROUP BY pat_address_id, pat_id, last_updated_by; 

И тогда вы можете использовать это для вставки, очевидно.

Единственная причина, по которой я вижу, что у вас возникнет проблема с вашей оригинальной простой вставкой, было бы, если бы каждая схема имела свои собственные типы, а их таблицы были построены с использованием их собственных типов. Но тогда вы получите ORA-00932: inconsistent datatypes или ORA-01031: insufficient privileges, а не ORA-00904.

Даже если у вас есть привилегии для типов по схемам, Oracle UDTs должны быть точно такими же типами - их недостаточно для точного определения. Если они имеют разные записи в ALL_OBJECTS, то они не являются взаимозаменяемыми.

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