Oracle
 sql >> डेटाबेस >  >> RDS >> Oracle

SQL डेवलपर के साथ Oracle में XML आयात

आप एक सबक्वेरी से दो कॉलम अपडेट करने का प्रयास कर रहे हैं, लेकिन आपका सिंटैक्स गलत है; इसे और अधिक पसंद किया जाना चाहिए:

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

आपके मामले में ऐसा कुछ, यह मानते हुए कि आप एक ही तालिका को सम्मिलित और अद्यतन कर रहे हैं, और मेरे परीक्षण के लिए (संशोधित) कच्चे एक्सएमएल को एसक्यूएल * प्लस संस्करण के रूप में पास कर रहे हैं:

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)

तब यह अपडेट हो सकता है:

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)

यदि निश्चित रूप से यह प्रति एप्लिकेशन एक स्टेशन भी मानता है, अन्यथा मुझे लगता है कि रिश्तों को पकड़ने के लिए आपको एकाधिक शामिल टेबल की आवश्यकता होगी; और केवल एक एप्लिकेशन या आपके अपडेट को किसी तरह सहसंबद्ध करने की आवश्यकता होगी। लेकिन फिर अपडेट व्यर्थ लगता है, आप इसे सब कुछ डालने पर कर सकते हैं:

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;

... (जो केवल एक-से-एक रिश्तों के साथ काम करता है) तो स्पष्ट रूप से मुझे तस्वीर से कुछ याद आ रहा है।

आपकी टिप्पणियों के आधार पर कि आपके एक-से-अनेक संबंध हैं और आप सब कुछ एक तालिका (!?) में सम्मिलित कर रहे हैं, आप इसके बजाय ऐसा कर सकते हैं:

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
/

मैं ट्रांसमीटर के लिए एक अतिरिक्त स्तर नीचे चला गया हूं, और आप हर बार प्रासंगिक नोड को नीचे करते हुए, अधिक जोड़ने के लिए पैटर्न को दोहरा सकते हैं। बाहरी जुड़ता है (+) कुछ चीजों के लिए अनुमति देगा जो मौजूद नहीं हैं, उदा। यदि आपके पास एक ट्रांसमीटर है जिसे अभी तक एक आवृत्ति नहीं दी गई है, या जो कुछ भी - आपको संबंधित कॉलम में एक नल मिलेगा।




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. आरटीआरआईएम मुद्दे के साथ एक्सएमएलएजीजी

  2. एकाधिक कॉलम में शामिल होने और परिणाम देने के लिए SQL कथन

  3. जब Oracle से कनेक्शन किया जाता है तो सुरक्षा पैकेज में कोई क्रेडेंशियल उपलब्ध नहीं होता है

  4. Oracle में सबसे बड़े कार्य में नल को संभालना

  5. Oracle क्रिटिकल पैच अपडेट - अक्टूबर 2020