sql >> Database teknologi >  >> RDS >> Oracle

Hvorfor får jeg følgende fejl LISTAGG-funktion:"resultat af strengsammenkædning er for lang?*

Som andre kommentatorer allerede har sagt, er der ingen måde at undgå en sådan fejl før Oracle 12.2 (hvor List_agg har den nye mulighed "ON OVERFLOW TRUNCATE").

I tidligere versioner af oracle, hvis du sammenkæder strenge længere end 4000 bytes, får du denne fejl. du har INGEN måde at forhindre det på.

Hvis du stadig har brug for at gøre det i tidligere versioner, skal du skrive din egen funktion for at gøre det, og du skal ændre din forespørgsel i overensstemmelse hermed:

Denne brugerdefinerede funktion kan muligvis løse dit 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 skal bruge CAST/COLLECT-operatoren for at bruge den.
dette er et brugseksempel:

   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. Formatering af powershell SQL Server-output i kolonner og rækker

  2. SQL-forespørgsel:liste over alle id'er, der var aktive i et givet tidsinterval, sorteret efter deres starttidspunkt

  3. Hvordan finder man forskellen mellem to MySQL-tabeller ved hjælp af MySQL-sætning?

  4. Få standard seriel værdi efter INSERT inde i PL/pgSQL