Oracle
 sql >> Baza danych >  >> RDS >> Oracle

Czy funkcja EXTRACT Oracle łamie NOENTITYESCAPING w XMLELEMENT?

Spróbuj użyć extractvalue() funkcja, która usuwa kodowane jednostki, zamiast extract() . Oto przykład:

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)

Wynik:

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

Ale użycie extractvalue() funkcja może być ograniczona tym, że może zwrócić wartość tylko jednego węzła. W przypadku zwracania wartości wielu węzłów utl_i18n pakiet i unescape_reference() funkcja tego pakietu może być użyta do odszyfrowania zakodowanych jednostek:

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;

Wynik:

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

Tak, jako utl_i18n.unescape_reference() funkcja akceptuje tylko wartości varchar2 typ danych i typy, które można niejawnie przekonwertować na varchar2 typ danych, masz związane ręce, jeśli chodzi o przetwarzanie dużych „ciągów ". W tej sytuacji możesz przejść do dbms_xmlgen pakiet i convert() w szczególności funkcja, która ma przeładowaną wersję zdolną do akceptowania CLOB s. Oto przykład:

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  

Wynik:

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



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Jakieś wady flag bitowych w kolumnach bazy danych?

  2. Łączenie się z Oracle za pomocą Oracle.ManagedDataAccess

  3. Oracle Apex 5 — pasek stopki podobny do tego w Kreatorze aplikacji

  4. Jak wyświetlić wszystkie uprawnienia Oracle Database dla użytkownika?

  5. Modelowanie Railsów:konwersja HABTM do has_many :through