Oracle
 sql >> Teknologi Basis Data >  >> RDS >> Oracle

Impor XML ke Oracle dengan SQL Developer

Anda mencoba memperbarui dua kolom dari subkueri, tetapi sintaks Anda salah; seharusnya lebih seperti:

update tablename set (col1 = val1, col2 = val2)
select (val1, val 2 from ...)

Dalam kasus Anda sesuatu seperti ini, dengan asumsi Anda memasukkan dan memperbarui tabel yang sama, dan meneruskan XML mentah (dimodifikasi) sebagai SQL*Plus var untuk pengujian saya:

create table spectraexchange(sv_sv_id varchar2(15), ss_ss_id varchar2(15),
    ap_name varchar2(15), ap_prj_ident varchar2(15),
    tcs_name varchar2(15), tcs_call varchar2(15));

Table created.

insert into spectraexchange(sv_sv_id, ss_ss_id, ap_name, ap_prj_ident)
select extractvalue(value(x), 'APPLICATION/SV_SV_ID') sv_sv_id,
    extractvalue(value(x), 'APPLICATION/SS_SS_ID') ss_ss_id,
    extractvalue(value(x), 'APPLICATION/AP_NAME') ap_name,
    extractvalue(value(x), 'APPLICATION/AP_PRJ_IDENT') ap_prj_ident
from (
    select xmltype(:raw_xml) xmlcol from dual
) t
cross join table(XMLSequence(extract(t.xmlcol,
    '/SPECTRAEXCHANGE/APPLICATION'))) x;

1 row created.

select * from spectraexchange;

SV_SV_ID        SS_SS_ID        AP_NAME         AP_PRJ_IDENT    TCS_NAME        TCS_CALL
--------------- --------------- --------------- --------------- --------------- ---------------
kClong          kClong          kCstring (64)   kCstring (32)

Maka pembaruannya bisa menjadi:

update spectraexchange
set (tcs_name, tcs_call) = (
    select extractvalue(value(x), 'STATION/TCS_NAME'),
        extractvalue(value(x), 'STATION/TCS_CALL')
    from (
        select xmltype(:raw_xml) xmlcol from dual
    ) t
    cross join table(XMLSequence(extract(t.xmlcol,
        '/SPECTRAEXCHANGE/APPLICATION/STATION'))) x
);

1 row updated.

select * from spectraexchange;

SV_SV_ID        SS_SS_ID        AP_NAME         AP_PRJ_IDENT    TCS_NAME        TCS_CALL
--------------- --------------- --------------- --------------- --------------- ---------------
kClong          kClong          kCstring (64)   kCstring (32)   kCstring (64)   kCstring (256)

Jika tentu saja ini juga mengasumsikan satu stasiun per aplikasi, jika tidak, Anda akan memerlukan beberapa tabel yang digabungkan untuk menampung hubungan yang saya kira; dan hanya satu aplikasi atau pembaruan Anda yang perlu dikorelasikan. Tapi kemudian pembaruan tampaknya tidak ada gunanya, Anda bisa melakukan semuanya saat memasukkan:

insert into spectraexchange(sv_sv_id, ss_ss_id, ap_name, ap_prj_ident,
    tcs_name, tcs_call)
select extractvalue(value(x), 'APPLICATION/SV_SV_ID') sv_sv_id,
    extractvalue(value(x), 'APPLICATION/SS_SS_ID') ss_ss_id,
    extractvalue(value(x), 'APPLICATION/AP_NAME') ap_name,
    extractvalue(value(x), 'APPLICATION/AP_PRJ_IDENT') ap_prj_ident,
    extractvalue(value(x), 'APPLICATION/STATION/TCS_NAME') tcs_name,
    extractvalue(value(x), 'APPLICATION/STATION/TCS_CALL') tcs_call
from (
    select xmltype(:raw_xml) xmlcol from dual
) t
cross join table(XMLSequence(extract(t.xmlcol,
    '/SPECTRAEXCHANGE/APPLICATION'))) x;

... (yang hanya bekerja dengan hubungan satu-ke-satu) sangat jelas saya kehilangan sesuatu dari gambar.

Berdasarkan komentar Anda bahwa Anda memiliki hubungan satu-ke-banyak dan Anda memasukkan semuanya ke dalam satu tabel (!?), Anda dapat melakukan ini sebagai gantinya:

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
/

Saya telah menurunkan level ekstra ke pemancar, dan Anda bisa mengulangi polanya untuk menambahkan lebih banyak, meneruskan simpul yang relevan ke bawah setiap kali. Bagian luar bergabung dengan (+) akan memungkinkan untuk beberapa hal yang tidak ada, mis. jika Anda memiliki pemancar yang belum diberi frekuensi, atau apa pun - Anda akan mendapatkan nol di kolom yang relevan.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Ubah interval menjadi menit

  2. Apakah Oracle mendukung pencarian teks lengkap?

  3. Alternatif dari sys_refcursor

  4. ORA-00904 Pengidentifikasi tidak valid” untuk pengidentifikasi dalam grup berdasarkan klausa

  5. Cara terbaik membagi string csv di Oracle 9i