sql >> データベース >  >> RDS >> Oracle

Oracle SQLクエリを使用してXMLで特定のノード名とその値を選択するにはどうすればよいですか?

    CLOBをXMLTypeに変換できますが、それが有効であると仮定すると、次のようになります。

    extractvalue(XMLType(RESPONSE_XML), ...
    

    XMLを格納している場合、列タイプがXMLTypeでない理由はわかりませんが、完全に関連しているわけではありません。

    次に、名前空間をextractvalue()に指定できます。 :

    SELECT extractvalue(XMLType(RESPONSE_XML),
      '//ax2130:id/text()',
      'xmlns:ax2130="http://core.data.soap.CDRator.com/xsd"')
    FROM SOAP_MONITORING
    where WEB_SERVICE_NAME='RatorWebShopService' and WEB_METHOD_NAME='placeShopOrder';
    

    ..ただし、複数のIDがあるため、次のようになります。ORA-19025: EXTRACTVALUE returns value of only one node

    そしてextractvalue ドキュメントに記載されているように、は非推奨です

    XQuery を使用できます 代わりに、具体的にはここではXMLTableです。

    ax2130:idだけが必要だと仮定します ax2147:subscription内にネストされた値 、このXQueryを使用できます:

    SELECT xt.id
    FROM SOAP_MONITORING sm
    CROSS JOIN XMLTable(XMLNAMESPACES (
          'http://schemas.xmlsoap.org/soap/envelope/' AS "soapenv",
          'http://service.soap.CDRator.com' as "ns",
          'http://core.data.soap.CDRator.com/xsd' as "ax2130",
          'http://webshop.result.service.soap.CDRator.com/xsd' as "ax2147"
        ),
        'for $i in /soapenv:Envelope/soapenv:Body/ns:placeShopOrderResponse/ns:return/ax2147:subscriptions
          return $i/ax2130:id'
        passing XMLType(sm.RESPONSE_XML)
        columns "ID" number path '/') xt
    where WEB_SERVICE_NAME='RatorWebShopService' and WEB_METHOD_NAME='placeShopOrder';
    
                       ID
    ---------------------
       201501070917439804 
       201501070917439804 
    
     2 rows selected 
    

    または、ax:2130が必要な場合 空白のものを含め、どこにでもノードを使用できます:

    SELECT xt.id
    FROM SOAP_MONITORING sm
    CROSS JOIN XMLTable(XMLNAMESPACES (
          'http://core.data.soap.CDRator.com/xsd' as "ax2130"
        ),
        'for $i in //ax2130:id return $i'
        passing XMLType(sm.RESPONSE_XML)
        columns "ID" number path '/') xt
    where WEB_SERVICE_NAME='RatorWebShopService' and WEB_METHOD_NAME='placeShopOrder';
    
                       ID
    ---------------------
    
       201501070917439804 
       201501070917439804 
    
     3 rows selected 
    

    XQueryで参照されている名前空間のみをXMLNamespaces句で指定する必要があります。

    必要に応じて、選択したIDに基づいて別のテーブルに参加できます。

    SELECT xt.id
    FROM SOAP_MONITORING sm
    CROSS JOIN XMLTable(XMLNAMESPACES (
        ...) xt
    JOIN someothertable sot on sot.id = xt.id
    where sm.WEB_SERVICE_NAME='RatorWebShopService'
    and sm.WEB_METHOD_NAME='placeShopOrder';
    


    1. T-SQLで日付と時刻の形式を変更する方法

    2. ISO形式の日付をDATETIMEに変換します

    3. jspとサーブレットを使用して複数のcsvファイルをmysqlデータベースにアップロードするにはどうすればよいですか?

    4. pgAdmin IIIでいくつかのテーブルのCREATEスクリプトを生成するにはどうすればよいですか?