0

我想使用 SQL 开发人员将 XML 文件导入 Oracle SQL。XML 有多个节点,我的 XML 结构:

<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 的解决方案

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
/

并且该站具有发射器和接收器路径,我怎样才能在一张表中导入接收器路径?

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

4

1 回答 1

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

所以它与前一个基本相同,除了在stationlevel 上它得到receiver以及transmitter然后通过另一个 join 扩展它r;我已经扩展了 withtf和的频率部分rf

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

(如果存在一对多关系,将所有内容存储在一个平面表中似乎仍然是一件奇怪的事情......)

于 2013-05-07T09:56:20.550 回答