У меня есть таблица со списком пользователей.
USER_TABLE
USER_ID DEPT
------- ----
USER1 HR
USER2 FINANCE
USER3 IT`
Используя оператор SQL, мне нужно получить список пользователей в виде строки с разделителями, возвращаемой как varchar2 - это единственный тип данных, который я могу использовать в соответствии с приложением, которое я использую, например,
USER1, USER2, USER3
У меня проблема с тем, что список будет превышать 4000 символов. У меня есть следующее, которое будет вручную объединять пользователей в списки по 150 пользователей за раз (исходя из максимального размера user_id, равного 20 символам, и разделителей, которые можно уместить в 4000 символов).
SELECT LISTAGG(USER_ID, ',') WITHIN GROUP (ORDER BY USER_ID)
FROM (SELECT DISTINCT USER_ID AS USER_ID, ROW_NUMBER() OVER (ORDER BY USER_ID) RN FROM TABLE_NAME)
WHERE RN <= 150
START WITH RN = 1
CONNECT BY PRIOR RN = RN - 1
UNION
SELECT LISTAGG(USER_ID, ',') WITHIN GROUP (ORDER BY USER_ID)
FROM (SELECT DISTINCT USER_ID AS USER_ID, ROW_NUMBER() OVER (ORDER BY USER_ID) RN FROM TABLE_NAME)
WHERE RN > 150 AND RN <= 300
START WITH RN = 1
CONNECT BY PRIOR RN = RN - 1
Это руководство, для которого потребуется дополнительный UNION для каждого блока из 150 пользователей, и общее число пользователей может увеличиться в более поздний срок.
Возможно ли сделать это так, чтобы разделенные строки user_ids генерировались динамически, чтобы они вписывались в несколько фрагментов по 4000 символов и ни один user_ids не разделялся на несколько строк?
В идеале, я бы хотел, чтобы результат выглядел так:
USER1, USER2, USER3 (to) USER149
USER150, USER151, USER152 (to) USER300
USER301, USER302, USER303 (to) USER450`
Решением должен быть оператор SELECT, поскольку схема доступна только для чтения, и мы не можем создавать объекты в базе данных. Мы используем Oracle 11g.