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

Cara membagi objek CLOB menggunakan , dan :pembatas di Oracle menjadi beberapa catatan

Berikut adalah solusi menggunakan subquery terfaktor rekursif (Oracle 11.2 ke atas):

with inputs ( str ) as (
       select to_clob('ABCDEF:PmId12345RmLn1VlId0,ABCDEF:PmId12345RmLn1VlId0,ABCDEF:PmId12345RmLn1VlId0,ABCDEF:PmId12345RmLn1VlId0,ABCDEF:PmId12345RmLn1VlId0')
       from dual
     ),
     prep ( s, n, token, st_pos, end_pos ) as (
       select ',' || str || ',', -1, null, null, 1
         from inputs
       union all
       select s, n+1, substr(s, st_pos, end_pos - st_pos),
              end_pos + 1, instr(s, ',', 1, n+3)
         from prep
         where end_pos != 0
     )
select n as idx, token as column_name
from   prep
where  n > 0;



   IDX COLUMN_NAME
------ ----------------------------
     1 ABCDEF:PmId12345RmLn1VlId0
     2 ABCDEF:PmId12345RmLn1VlId0
     3 ABCDEF:PmId12345RmLn1VlId0
     4 ABCDEF:PmId12345RmLn1VlId0
     5 ABCDEF:PmId12345RmLn1VlId0

Catatan :

Anda mengatakan CLOB tetapi dalam contoh Anda, Anda mengekstraksi dari string varchar2. Saya menambahkan to_clob() untuk melihat apakah/bagaimana ini bekerja pada CLOB.

Saya menggunakan instr dan substr , karena mereka sering (biasanya?) berkinerja antara lebih baik dan jauh lebih baik daripada regexp setara.

Saya menyimpan "indeks" dari setiap substring dalam string input; dalam beberapa kasus urutan token dalam string input penting. (Tidak dalam contoh Anda, Anda hanya memiliki token yang sama yang diulang lima kali.)

Jika Anda membutuhkan kinerja yang lebih baik, terutama jika CLOB Anda sangat besar, Anda mungkin lebih baik menggunakan dbms_lob.substr dan dbms_lob.instr - lihat Kinerja SUBSTR di CLOB , terutama jawaban Alex Poole, dan dokumentasi di sini:http ://docs.Oracle.com/cd/B28359_01/appdev.111/b28419/d_lob.htm#BABEAJAD . Perhatikan perbedaan sintaks vs substr biasa / instr .



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Hentikan atau hentikan kueri yang berjalan lama di JDBC

  2. Oracle Blob sebagai img src di halaman PHP

  3. Peramal; batasi nilai baris per kolom

  4. Gunakan alias tabel dalam kueri lain untuk melintasi pohon

  5. Oracle 12:Bergabung dengan daftar yang dipisahkan koma?