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

OracleのEXTRACT関数は、XMLELEMENTのNOENTITYESCAPINGを壊していますか?

    extractvalue()を使用してみてください extract()の代わりに、エンコードされたエンティティをエスケープ解除する関数 。次に例を示します。

    clear screen;
    column res format a20;
    
    -- depending on a situation, NOENTITYESCAPING might be dropped
    
    select extractvalue(
                         xmlelement(NOENTITYESCAPING e,id,'->')
                        , '//text()'
                        ) as res
      from (select level as id 
              from dual 
           connect by level < 6)
    

    結果:

    RES                
    --------------------
    1->                  
    2->                  
    3->                  
    4->                  
    5->    
    

    ただし、extractvalue()の使用 関数は、1つのノードの値しか返すことができないという事実によって制限される場合があります。複数のノードの値を返す場合utl_i18n パッケージ、およびunescape_reference() そのパッケージの機能を使用して、エンコードされたエンティティをエスケープ解除できます。

    clear screen;
    column res format a20;
    
    select utl_i18n.unescape_reference(xmlelement(root
                                                 , xmlelement(node1, '>')
                                                 , xmlelement(node2, '<')
                                                 ).extract('//text()').getstringval()
                                       ) as res
     from dual
    connect by level <= 3;
    

    結果:

    RES                
    --------------------
    ><                   
    ><                   
    >< 
    

    はい、utl_i18n.unescape_reference()として 関数はvarchar2の値のみを受け入れます データ型と、暗黙的にvarchar2に変換できる型 データ型の場合、大きな「文字列」の処理に関しては、手が離せません。 "。この状況では、dbms_xmlgenを使用できます。 パッケージと convert() 特に、CLOBを受け入れることができるオーバーロードされたバージョンを持つ関数 s。次に例を示します。

    select dbms_xmlgen.convert(
                               xmlagg(xmlelement(root
                                                 , xmlelement(node1, '>')
                                                 , xmlelement(node2, '<')
                                                 )
                                      ).extract('//text()').getclobval()
                              , 1) as res
     from dual
    connect by level <= 3000;   -- 1 (second parameter of the convert() function)
                                -- instructs function to decode entities  
    

    結果:

    RES
    ------------------------------------------------------
    ><><><><><><><><><><><><><><><><><><><><><><><><><>
    -- ... the rest of the CLOB
    



    1. PL/SQLを使用してOracle11gのJSONファイルにデータをエクスポートする

    2. 2つの区切り文字で文字列を分割し、タイプを変換します

    3. テーブルの1つの列のみに基づいて重複する値を排除する

    4. SQL Server(T-SQL)でデータベースメールの構成設定を変更する方法