sql >> Databasteknik >  >> RDS >> Oracle

Varför får jag följande fel LISTAGG-funktion:"result of string concatenation is too long?*

Som andra kommentatorer redan har sagt finns det inget sätt att undvika ett sådant fel förrän Oracle 12.2 (där List_agg har det nya alternativet "ON OVERFLOW TRUNCATE").

I tidigare versioner av oracle, om du sammanfogar strängar längre än 4000 byte, får du det felet. du har INGET sätt att förhindra det.

Om du fortfarande behöver göra det i tidigare versioner måste du skriva din egen funktion för att göra det och du måste ändra din fråga därefter:

Denna anpassade funktion kan lösa ditt problem

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

du måste använda CAST/COLLECT-operatorn för att använda den.
det här är ett användningsexempel:

   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. Hur man lagrar AES-krypterad information i MySQL-databas

  2. MySQL CONVERT_TZ()

  3. Hur man gör innodb som standardmotor

  4. Mysql-fråga för att ta bort poster efter att ha valt...?