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