【问题标题】:XML import to OracleXML 导入到 Oracle
【发布时间】:2013-05-07 09:40:46
【问题描述】:

我想使用 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'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
/

并且该站有发射器和接收器路径,我如何将接收器路径也导入一个表中?

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

【问题讨论】:

标签: sql xml oracle import xmltype


【解决方案1】:

我在上一个答案中提到,您可以再往下走

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;我用tfrf 扩展了频率部分。

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

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

【讨论】:

  • 我想将所有数据存储在一个表中,因为我有一个使用数据库的程序,我想将创建的数据库与规划程序连接起来。
  • 我可以进行导入。非常感谢您的帮助。谢谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-07-21
  • 1970-01-01
  • 2017-01-15
  • 2010-10-15
  • 2013-08-01
  • 2012-03-26
  • 1970-01-01
相关资源
最近更新 更多