2013-05-07 88 views
0

我想用SQL开发人员将XML文件导入Oracle 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路径?

我创建了一个表,我想将所有内容存储在一张表中。一个应用程序可以包含更多的站点,一个站点可以包含更多的发射器,一个发射器可以有更多的频率。我创建了一个表,我想一切都存储在一个表中

+0

只是出于兴趣,为什么你[删除](HTTP:// stackoverflow.com/q/16412592/266304)然后重新提出完全相同的问题? – 2013-05-07 10:00:34

+0

[用SQL Developer将XML导入Oracle]可能的重复(http://stackoverflow.com/questions/16353311/xml-import-to-oracle-with-sql-developer) – BLaZuRE 2013-09-23 04:41:08

回答

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和​​扩展了频率部分。

如果您需要协调的频率,您可以在频率部分包含该XML对象,并在每一个下方添加另一个交叉连接。你只需要小心命名和别名以避免混淆;我的单字母别名原本是好的,但是现在它变得越来越复杂,你可能想要更具描述性的东西。

(存储一切都在一个平坦的桌面似乎仍然一个奇怪的事情,如果有一个一对多的关系......这样做)

+0

感谢您的帮助。 – user2342549 2013-05-07 10:37:24

+0

我想将每个数据存储在一个表中,因为我有一个使用数据库的程序,我想将创建的数据库与规划程序连接起来。 – user2342549 2013-05-07 10:38:38

+0

我可以做导入。非常appriciate你的帮助。谢谢。 – user2342549 2013-05-07 12:41:57