[英]Get values from XML using SQL
我是 SQL 的新手,我想知道如何從 XML 下面獲取值“123189”、“OK”和“OK”? 我從下方使用 SELECT,但是當我調用此過程時,參數(nMaxRate、vMaxRateValid 和 vMaxRateVariation)保持為空。
SELECT:
select extractvalue(Value(t), '/soap:max_rate', ''),
extractvalue(Value(t), '/soap:max_rate_valid', ''),
extractvalue(Value(t), '/soap:max_rate_variation', '')
into nMaxRate , vMaxRateValid, vMaxRateVariation
from TABLE(xmlSequence(extract(response_xml, '/soap:check_avg_rateResponse/soap:check_avg_rateResult',
''))) t;
響應_xml:
<senv:Envelope xmlns:senv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/">
<senv:Body>
<soap:check_avg_rateResponse>
<soap:check_avg_rateResult>
<soap:max_rate>123189</soap:max_rate>
<soap:max_rate_valid>OK</soap:max_rate_valid>
<soap:max_rate_variation>OK</soap:max_rate_variation>
</soap:check_avg_rateResult>
</soap:check_avg_rateResponse>
</senv:Body>
</senv:Envelope>
使用帶有xmlnamespaces
子句的xmltable
來指定命名空間:
with rws as ( select xmltype ('
<senv:Envelope xmlns:senv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/">
<senv:Body>
<soap:check_avg_rateResponse>
<soap:check_avg_rateResult>
<soap:max_rate>123189</soap:max_rate>
<soap:max_rate_valid>OK</soap:max_rate_valid>
<soap:max_rate_variation>OK</soap:max_rate_variation>
</soap:check_avg_rateResult>
</soap:check_avg_rateResponse>
</senv:Body>
</senv:Envelope>' ) x from dual
)
select s.* from rws, xmltable (
xmlnamespaces (
'http://schemas.xmlsoap.org/soap/envelope/' as "senv",
'http://schemas.xmlsoap.org/wsdl/soap/' as "soap"
),
'/senv:Envelope/senv:Body/soap:check_avg_rateResponse/soap:check_avg_rateResult'
passing rws.x
columns
max_rate int path 'soap:max_rate',
max_rate_valid varchar2(10) path 'soap:max_rate_valid',
max_rate_variation varchar2(10) path 'soap:max_rate_variation'
) s;
MAX_RATE MAX_RATE_VALID MAX_RATE_VARIATION
123189 OK OK
您想使用XMLNAMESPACES
和XMLTABLE
:
DECLARE
response_xml CLOB := '<senv:Envelope xmlns:senv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/">
<senv:Body>
<soap:check_avg_rateResponse>
<soap:check_avg_rateResult>
<soap:max_rate>123189</soap:max_rate>
<soap:max_rate_valid>OK</soap:max_rate_valid>
<soap:max_rate_variation>OK</soap:max_rate_variation>
</soap:check_avg_rateResult>
</soap:check_avg_rateResponse>
</senv:Body>
</senv:Envelope>';
nMaxRate NUMBER;
vMaxRateValid VARCHAR2(10);
vMaxRateVariation VARCHAR2(10);
BEGIN
SELECT max_rate,
max_rate_valid,
max_rate_variation
INTO nMaxRate,
vMaxRateValid,
vMaxRateVariation
FROM XMLTABLE(
XMLNAMESPACES(
'http://schemas.xmlsoap.org/soap/envelope/' AS "senv",
'http://schemas.xmlsoap.org/wsdl/soap/' AS "soap"
),
'/senv:Envelope/senv:Body/soap:check_avg_rateResponse/soap:check_avg_rateResult'
PASSING XMLTYPE(response_xml)
COLUMNS
max_rate NUMBER PATH './soap:max_rate',
max_rate_valid VARCHAR2(10) PATH './soap:max_rate_valid',
max_rate_variation VARCHAR2(10) PATH './soap:max_rate_variation'
);
DBMS_OUTPUT.PUT_LINE( nMaxRate );
DBMS_OUTPUT.PUT_LINE( vMaxRateValid );
DBMS_OUTPUT.PUT_LINE( vMaxRateVariation );
END;
/
哪個輸出:
123189 OK OK
db<> 在這里擺弄
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.