Oracle
 sql >> база данни >  >> RDS >> Oracle

Защо получавам следната функция за грешка LISTAGG:„резултатът от конкатенацията на низ е твърде дълъг?*

Както вече казаха други коментатори, няма начин да се избегне подобна грешка до Oracle 12.2 (където List_agg има новата опция „ON OVERFLOW TRUNCATE“).

В предишни версии на oracle, ако свържете низове, по-дълги от 4000 байта, получавате тази грешка. нямате начин да го предотвратите.

Ако все още трябва да направите това в предишни версии, трябва да напишете своя собствена функция, за да го направите, и трябва съответно да промените заявката си:

Тази персонализирана функция може да реши проблема ви

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

трябва да използвате оператора CAST/COLLECT, за да го използвате.
това е пример за използване:

   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. PLSQL:Вземете броя на записите, актуализирани спрямо вмъкнати, когато се използва оператор за сливане

  2. Актуализиране на таблицата на Oracle от макрос на Excel VBA с помощта на ODBC връзка

  3. неявни вътрешни съединения - равни ли са?

  4. Защо Oracle varchar2 има задължителен размер като дефиниционен параметър?

  5. Как мога да филтрирам данни в Apex Grid, за да покажа определени неща за определени потребителски групи?