2013-05-07 4 views
0

Я хотел бы импортировать XML-файл в Oracle SQL с SQL-разработчиком. XML имеет более одного узла, моя структура XML:Импорт XML в Oracle

<SPECTRAEXCHANGE> 
<APPLICATION> 
<SV_SV_ID>kClong</SV_SV_ID> 
<SS_SS_ID>kClong</SS_SS_ID> 
<AP_NAME>kCstring (64)</AP_NAME> 
<AP_PRJ_IDENT>kCstring (32)</AP_PRJ_IDENT> 
<STATION> 
<TCS_NAME>kCstring (64)</TCS_NAME> 
<TCS_CALL>kCstring (256)</TCS_CALL> 
<HORIZONTAL_ELEVATIONS> 
<HORIZONTAL_ELEVATION> 
<HE_AZIMUT>kCdouble</HE_AZIMUT> 
<HE_ELEVATION>kCdouble</HE_ELEVATION> 
</HORIZONTAL_ELEVATION> 
</HORIZONTAL_ELEVATIONS> 
<TRANSMITTER> 
<EQP_EQUIP_NAME>kCstring (128)</EQP_EQUIP_NAME> 
<EQP_EQUIP_TYPE>kCstring (16)</EQP_EQUIP_TYPE> 
<FREQUENCY> 
<EFL_FREQ>kCdouble</EFL_FREQ> 
<COORDINATED_FREQUENCY> 
<COF_DAT>kWrDate</COF_DAT> 
</COORDINATED_FREQUENCY> 
</FREQUENCY> 
</TRANSMITTER> 
<RECEIVER> 
<EQP_EQUIP_NAME>kCstring (128)</EQP_EQUIP_NAME> 
<EQP_EQUIP_TYPE>kCstring (16)</EQP_EQUIP_TYPE> 
<FREQUENCY> 
<EFL_FREQ>kCdouble</EFL_FREQ> 
<COORDINATED_FREQUENCY> 
<COF_DAT>kWrDate</COF_DAT> 
</COORDINATED_FREQUENCY> 
</FREQUENCY> 
</RECEIVER> 
</STATION> 
</APPLICATION> 
</SPECTRAEXCHANGE> 

Сначала я создал таблицу SPECTRAEXCHANGE и чем я @Alex Poole's solution:

insert into spectra exchange (... columns ...) 
select a.sv_sv_id, a.ss_ss_id, a.ap_name, a.ap_prj_ident, 
    s.tcs_name, s.tcs_call, 
    t.eqp_equip_name, t.eqp_equip_type 
from (select xmltype(:raw_xml) xmlcol from dual) r 
cross join xmltable('/SPECTRAEXCHANGE/APPLICATION' passing r.xmlcol 
     columns sv_sv_id varchar2(15) path 'SV_SV_ID', 
      ss_ss_id varchar2(15) path 'SS_SS_ID', 
      ap_name varchar2(15) path 'AP_NAME', 
      ap_prj_ident varchar2(15) path 'AP_PRJ_IDENT', 
      stations xmltype path 'STATION' 
    ) (+) a 
cross join xmltable('/STATION' passing a.stations 
     columns tcs_name varchar2(15) path 'TCS_NAME', 
      tcs_call varchar2(15) path 'TCS_CALL', 
      transmitter xmltype path 'TRANSMITTER' 
    ) (+) s 
cross join xmltable('/TRANSMITTER' passing s.transmitter 
     columns eqp_equip_name varchar2(15) path 'EQP_EQUIP_NAME', 
      eqp_equip_type varchar2(15) path 'EQP_EQUIP_TYPE', 
      frequency xmltype path 'FREQUENCY' 
    ) (+) t 
/

И станция имеет передатчик и приемник пути и как я могу импортировать путь RECEIVER также в одну таблицу?

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

+0

Просто из интереса, почему вы [удалить] (HTTP: // stackoverflow.com/q/16412592/266304), а затем повторно задать тот же вопрос? –

+0

Возможный дубликат [XML-импорт в Oracle с SQL Developer] (http://stackoverflow.com/questions/16353311/xml-import-to-oracle-with-sql-developer) – BLaZuRE

ответ

0

я упомянул в предыдущем ответе, что вы могли бы пойти вниз еще дополнительные уровни

select a.sv_sv_id, a.ss_ss_id, a.ap_name, a.ap_prj_ident, 
    s.tcs_name, s.tcs_call, 
    t.eqp_equip_name tran_equip_name, t.eqp_equip_type tran_equip_type, 
    tf.efl_freq tran_efl_freq, 
    r.eqp_equip_name recv_equip_name, r.eqp_equip_type recv_equip_type, 
    rf.efl_freq recv_efl_freq 
from (select xmltype(:raw_xml) xmlcol from dual) r 
cross join xmltable('/SPECTRAEXCHANGE/APPLICATION' passing r.xmlcol 
     columns sv_sv_id varchar2(15) path 'SV_SV_ID', 
      ss_ss_id varchar2(15) path 'SS_SS_ID', 
      ap_name varchar2(15) path 'AP_NAME', 
      ap_prj_ident varchar2(15) path 'AP_PRJ_IDENT', 
      stations xmltype path 'STATION' 
    ) (+) a 
cross join xmltable('/STATION' passing a.stations 
     columns tcs_name varchar2(15) path 'TCS_NAME', 
      tcs_call varchar2(15) path 'TCS_CALL', 
      transmitter xmltype path 'TRANSMITTER', 
      receiver xmltype path 'RECEIVER' 
    ) (+) s 
cross join xmltable('/TRANSMITTER' passing s.transmitter 
     columns eqp_equip_name varchar2(15) path 'EQP_EQUIP_NAME', 
      eqp_equip_type varchar2(15) path 'EQP_EQUIP_TYPE', 
      frequency xmltype path 'FREQUENCY' 
    ) (+) t 
cross join xmltable('/FREQUENCY' passing t.frequency 
     columns efl_freq varchar2(15) path 'EFL_FREQ' 
    ) (+) tf 
cross join xmltable('/RECEIVER' passing s.receiver 
     columns eqp_equip_name varchar2(15) path 'EQP_EQUIP_NAME', 
      eqp_equip_type varchar2(15) path 'EQP_EQUIP_TYPE', 
      frequency xmltype path 'FREQUENCY' 
    ) (+) r 
cross join xmltable('/FREQUENCY' passing t.frequency 
     columns efl_freq varchar2(15) path 'EFL_FREQ' 
    ) (+) rf 
/

Что с данными выборки (по общему признанию, с взаимно -она отношения, так что вы должны были бы проверить, чтобы убедиться, что он делает то, что вы хотите):

SV_SV_ID  SS_SS_ID  AP_NAME   AP_PRJ_IDENT TCS_NAME  TCS_CALL  TRAN_EQUIP_NAME TRAN_EQUIP_TYPE TRAN_EFL_FREQ RECV_EQUIP_NAME RECV_EQUIP_TYPE RECV_EFL_FREQ 
--------------- --------------- --------------- --------------- --------------- --------------- --------------- --------------- --------------- --------------- --------------- --------------- 
kClong   kClong   kCstring (64) kCstring (32) kCstring (64) kCstring (256) kCstring (128) kCstring (16) kCdouble  kCstring (128) kCstring (16) kCdouble 

так что это в основном так же, как и предыдущий, за исключением station уровне это становится receiver, а также transmitter, а затем развернуть это через другое соединение r; и я расширил частотный раздел как для tf, так и для rf.

Если вам нужна согласованная частота, вы можете включить этот объект XML в частотный раздел и добавить другое поперечное соединение ниже каждого из них. Вам просто нужно быть немного осторожным с именами и псевдонимами, чтобы избежать путаницы; мои однобуквенные псевдонимы были изначально ОК, но вы, вероятно, хотите что-то более описательное, теперь это усложняется.

(Хранение все в одном плоском столе все еще кажется странным, что нужно сделать, если есть один-к-многим ...)

+0

Спасибо за помощь. – user2342549

+0

Я хочу хранить все данные в одной таблице, потому что у меня есть программа, использующая базу данных, и я хотел бы связать созданную базу данных с программой планирования. – user2342549

+0

Я мог бы сделать импорт. Очень приложите свою помощь. Благодарю. – user2342549