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

配列応答からのOracle12cPLSQL SOAP EXTRACTVALUE

    XMLが不完全です。本当にまだSOAPエンベロープとその周りの本体があると仮定すると、前に示したように、XMLNamespacesでXMLTableを使用できます(および extractvalue まだ非推奨です ):

    select item
    from XMLTable(
      XMLNamespaces (
        default 'urn:DHCPProv',
        'http://schemas.xmlsoap.org/soap/envelope/' as "soap",
        'http://schemas.xmlsoap.org/soap/encoding/' as "soapenc"
      ),
      '/soap:Envelope/soap:Body/getDhcpForPortResponse/soapenc:Array/item/item'
      passing XMLType(xml_string)
      columns item varchar2(4000) path '.'
    )
    

    したがって、データとSOAPビットを追加すると:

    select item
    from XMLTable(
      XMLNamespaces (
        default 'urn:DHCPProv',
        'http://schemas.xmlsoap.org/soap/envelope/' as "soap",
        'http://schemas.xmlsoap.org/soap/encoding/' as "soapenc"
      ),
      '/soap:Envelope/soap:Body/getDhcpForPortResponse/soapenc:Array/item/item'
      passing XMLType('<?xml version="1.0" encoding="UTF-8"?>
    <soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/" 
    xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
    soap:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" 
    xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
    <soap:Body>
                <getDhcpForPortResponse
                    xmlns="urn:DHCPProv">
                    <soapenc:Array
                        soapenc:arrayType="soapenc:Array[2]"
                        xsi:type="soapenc:Array">
                        <item
                            soapenc:arrayType="xsd:string[5]"
                            xsi:type="soapenc:Array">
                            <item
                                xsi:type="xsd:string">
                                qbtp8482tv
                                </item>
                            <item
                                xsi:type="xsd:string">
                                111.11.111.111
                                </item>
                            <item
                                xsi:type="xsd:string">
                                bc644ba2501c
                                </item>
                            <item
                                xsi:type="xsd:string">
                                MF5601T_AMD-NDF
                                </item>
                            <item
                                xsi:type="xsd:string"/>
                            </item>
                        <item
                            soapenc:arrayType="xsd:string[5]"
                            xsi:type="soapenc:Array">
                            <item
                                xsi:type="xsd:string">
                                qbtp8482tv
                                </item>
                            <item
                                xsi:type="xsd:string">
                                222.22.222.222
                                </item>
                            <item
                                xsi:type="xsd:string">
                                704fb8f3e4e1
                                </item>
                            <item
                                xsi:type="xsd:string">
                                MF5601T_AMD-NDF
                                </item>
                            <item
                                xsi:type="xsd:string"/>
                            </item>
                        </soapenc:Array>
                    </getDhcpForPortResponse>
     </soap:Body>
     </soap:Envelope>')
      columns item varchar2(4000) path '.'
    )
    

    取得:

    ITEM
    --------------------------------------------------
    
                                qbtp8482tv
                                
    
                                111.11.111.111
                                
    
                                bc644ba2501c
                                
    
                                MF5601T_AMD-NDF
                                
    (null)
    
                                qbtp8482tv
                                
    
                                222.22.222.222
                                
    
                                704fb8f3e4e1
                                
    
                                MF5601T_AMD-NDF
                                
    (null)
    

    db<>フィドル

    これは、例の改行と先頭のスペースのために少し混乱しています。それらが実際に存在する場合は、それらを削除できます:

    select rtrim(ltrim(item, chr(32)||chr(10)), chr(10)||chr(32)) as item
    from XMLTable...
    

    これにより:

    ITEM
    --------------------
    qbtp8482tv
    111.11.111.111
    bc644ba2501c
    MF5601T_AMD-NDF
    (null)
    qbtp8482tv
    222.22.222.222
    704fb8f3e4e1
    MF5601T_AMD-NDF
    (null)
    

    また、null値が必要ない場合は、除外することができます。

    SOAPラッパーがない場合は、より複雑になります。 XPathでワイルドカードを使用できますが、XMLは無効であり、適切に解析されないため、名前空間プレフィックスを削除するか、ラッパーを再度追加する必要があります。以前の質問に基づくと、それはただし、ケース。




    1. MySQLクエリに6秒以上かかる

    2. JDBC for Oracleを使用してResultSetを反復処理するには、約16秒かかりますか?

    3. mySQL繰り返しイベントクエリ

    4. JInitatorを使用したInternetExplorer8のOracleフォーム/アプリケーション