簡體   English   中英

使用 SQL 從 XML 獲取值

[英]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 

您想使用XMLNAMESPACESXMLTABLE

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM