sql >> Database >  >> RDS >> Oracle

Waarom krijg ik de volgende foutmelding LISTAGG-functie:"resultaat van aaneenschakeling van tekenreeksen is te lang?*

Zoals andere commentatoren al zeiden, is er geen manier om een ​​dergelijke fout te vermijden tot Oracle 12.2 (waar List_agg de nieuwe optie "ON OVERFLOW TRUNCATE" heeft).

Als je in eerdere versies van Oracle strings langer dan 4000 bytes samenvoegt, krijg je die foutmelding. je hebt GEEN manier om het te voorkomen.

Als u dat in eerdere versies nog steeds moet doen, moet u uw eigen functie schrijven om dit te doen en moet u uw vraag dienovereenkomstig aanpassen:

Deze aangepaste functie kan uw probleem mogelijk oplossen

 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;
 /

je moet de CAST/COLLECT-operator gebruiken om het te gebruiken.
dit is een gebruiksvoorbeeld:

   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. MySQL &MariaDB Load Balancing met ProxySQL

  2. Verbinding maken met een Oracle-database Verbinding vanuit .Net Core

  3. Hoe verbinding maken met een externe MySQL-database met Java?

  4. Waarom retourneert AES_DECRYPT null?