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
を使用できます。 パッケージと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