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

Oracle pl/sqlを使用して名前空間を使用してxmlclobから値を抽出する

    更新されたXMLには名前空間があり、最終的に問題が明らかになります。 XML抽出の一部としての名前空間 、XMLTableアプローチを使用すると簡単になります。この場合、それをデフォルトの名前空間として扱うことができます:

    select itc.element_name, x.user_classification3
    from i_transaction itc
    cross join xmltable(
      xmlnamespaces(default 'http://xmlns.oracle.com/apps/otm'),
        '/TenderOffer/Shipment/RATE_OFFERING/RATE_OFFERING_ROW'
      passing xmltype(itc.xml_blob)
      columns user_classification3 varchar2(10) path 'USER_CLASSIFICATION3'
    ) x
    where itc.i_transaction_no = 31553115
    and rownum = 1;
    
    ELEMENT_NA USER_CLASS
    ---------- ----------
    dummy      ZXF       
    

    またはXMLQueryを使用:

    select itc.element_name, xmlquery(
      'declare default element namespace "http://xmlns.oracle.com/apps/otm"; (: :)
        /TenderOffer/Shipment/RATE_OFFERING/RATE_OFFERING_ROW/USER_CLASSIFICATION3/text()'
      passing xmltype(itc.xml_blob)
      returning content
    ) x
    from i_transaction itc
    where itc.i_transaction_no = 31553115
    and rownum = 1;
    
    ELEMENT_NA X                                                                               
    ---------- --------------------------------------------------------------------------------
    dummy      ZXF                                                                             
    

    非推奨のextractvalue()を使い続けたい場合 関数には、名前空間を引数として指定することもできます。ここでも、に示すように、ドキュメント

    select itc.element_name,
      extractvalue(xmltype(xml_blob),
        '/TenderOffer/Shipment/RATE_OFFERING/RATE_OFFERING_ROW/USER_CLASSIFICATION3/text()',
        'xmlns="http://xmlns.oracle.com/apps/otm"')
    from i_transaction itc where itc.i_transaction_no = 31553115 and rownum = 1;
    


    1. 同じ名前のエンティティ、常に最初のIDに挿入

    2. テーブル内の単語数を取得するSQLクエリ

    3. SQL:ビットまたはchar(1)のどちらが優れているか

    4. MySQL-複雑さ:SELECT COUNT(*)FROM MyTable;