Oracle
 sql >> Baza danych >  >> RDS >> Oracle

Dlaczego otrzymuję następującą funkcję LISTAGG błędu:„wynik konkatenacji ciągów jest za długi?*

Jak powiedzieli już inni komentatorzy, nie ma sposobu na uniknięcie takiego błędu aż do Oracle 12.2 (gdzie List_agg ma nową opcję "ON OVERFLOW TRUNCATE").

W poprzednich wersjach Oracle, jeśli połączysz ciągi dłuższe niż 4000 bajtów, otrzymasz ten błąd. NIE masz możliwości, aby temu zapobiec.

Jeśli nadal musisz to zrobić w poprzednich wersjach, musisz napisać własną funkcję do tego i odpowiednio zmodyfikować zapytanie:

Ta niestandardowa funkcja może rozwiązać Twój 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;
 /

musisz użyć operatora CAST/COLLECT, aby go użyć.
To jest przykład użycia:

   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. Archiwizator zawieszony ze względu na KOMPATYBILNY ORA-16484

  2. Kluczowe zmiany technologiczne w E-Business Suite 12.2

  3. Usługi baz danych na AWS i Oracle Cloud Platform

  4. zwiększaj numer wiersza, gdy zmienia się wartość pola w Oracle

  5. Jak zaktualizować wartości kolumn jednej tabeli wartościami kolumn innej tabeli?