Oracle
 sql >> Teknologi Basis Data >  >> RDS >> Oracle

Apakah fungsi EXTRACT Oracle melanggar NOENTITYESCAPING di XMLELEMENT?

Coba gunakan extractvalue() fungsi, yang melepaskan entitas yang disandikan, alih-alih extract() . Ini contohnya:

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)

Hasil:

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

Tetapi penggunaan extractvalue() fungsi mungkin dibatasi oleh fakta bahwa ia dapat mengembalikan nilai hanya satu node. Dalam kasus mengembalikan nilai dari beberapa node, utl_i18n paket, dan unescape_reference() fungsi paket itu dapat digunakan untuk melepaskan entitas yang disandikan:

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;

Hasil:

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

Ya, sebagai utl_i18n.unescape_reference() fungsi hanya menerima nilai varchar2 tipe data dan tipe yang dapat secara implisit dikonversi ke varchar2 tipe data, tangan Anda terikat saat memproses "string . besar ". Dalam situasi ini Anda dapat beralih ke dbms_xmlgen paket dan convert() fungsi khususnya, yang memiliki versi kelebihan beban yang mampu menerima CLOB s. Berikut ini contohnya:

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  

Hasil:

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. ORA-00900:pernyataan SQL tidak valid- saat menjalankan prosedur di Oracle 10g

  2. Memasukkan kutipan tunggal di JDBC untuk SQL Query tidak berfungsi

  3. Tindak lanjut T:Bandingkan Baris di Tabel Oracle dan perbarui Baris yang Cocok

  4. Mengubah kueri Oracle menjadi tipe yang ditentukan pengguna di pl/sql

  5. rs.last() memberikan operasi yang tidak valid untuk forward only resultset :last