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

Mengapa saya mendapatkan fungsi LISTAGG error berikut:“hasil penggabungan string terlalu panjang?*

Seperti yang telah dikatakan oleh komentator lain, tidak ada cara untuk menghindari kesalahan seperti itu hingga Oracle 12.2 (di mana List_agg memiliki opsi baru "ON OVERFLOW TRUNCATE").

Di oracle versi sebelumnya, jika Anda menggabungkan string yang lebih panjang dari 4000 byte, Anda mendapatkan kesalahan itu. Anda TIDAK punya cara untuk mencegahnya.

Jika Anda masih perlu melakukannya di versi sebelumnya, Anda harus menulis fungsi Anda sendiri untuk melakukannya dan Anda perlu mengubah kueri Anda sesuai dengan itu:

Fungsi khusus ini mungkin menyelesaikan masalah Anda

 create or replace type TAB_STRINGS is table of varchar2(4000) 
 /
 create or replace function My_list_agg(strings in TAB_STRINGS,
                      separator  in varchar2,
                      max_len    integer) return varchar2 deterministic is
   result varchar2(32000);
   tmp    varchar2(32000);
 begin
   result := null;
   if strings is not null then
       for idx in strings.first .. strings. last loop
         tmp := strings(idx);
         if tmp is not null then
           if result is null then
             exit when length(tmp) > max_len;
             result := tmp;
           else
             exit when(length(result) + length(separator) + length(tmp)) > max_len;
             result := result || separator || tmp;
           end if;
         end if;
       end loop;
   end if;
   return result;
 end;
 /

Anda perlu menggunakan operator CAST/COLLECT untuk menggunakannya.
ini adalah contoh penggunaan:

   select table_name,
          My_list_agg(  
                 -- first argument: array of strings to be concatenated
                 cast ( collect (column_name order by column_name) as TAB_STRINGS),
                 -- second (optional) argument: the separator
                 ',',
                 -- third argument (optional): the maximum length of the string to be returned
                 1000   
          ) as column_list
   from user_tab_columns t
   group by table_name
   order by table_name



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Oracle:Menggabungkan Dua Tabel dengan Kolom Berbeda

  2. Bagaimana cara menggunakan parameter dalam klausa 'nilai di mana di ...'?

  3. Pilih di PL-SQL Errors:INTO After Select

  4. Memanggil prosedur tersimpan Oracle dengan parameter keluaran dari SQL Server

  5. ORA-12154:TNS:tidak dapat menyelesaikan pengidentifikasi koneksi yang ditentukan