PL/SQL: создание CSV varchar из оператора select без циклов

Используя PL/SQL, я хочу программно сгенерировать объект CSV string/varchar из оператора select. Таким образом, вывод оператора select обычно будет состоять из 1-n записей (мне нужен только один столбец). Но проблема в том, что я не могу использовать циклы или любой итеративный процесс, и это нужно делать без использования внешних библиотек.

Я могу свободно преобразовывать данные в таблицу или в другой тип данных и при необходимости использовать больше памяти. Но я не могу явно использовать циклы.

Думаю, я ищу способ сделать что-то вроде этого:

declare
   my_csv varchar2(4000);
begin
   select implode(my_column,',') into my_csv
   from my_table
   where some_column = 'some value';

   dbms_output.put_line('I got my list: ' || my_csv);
end;

Где, по сути, implode теоретически будет работать как функция implode в PHP, а запятая — мой разделитель. Я могу сам определить функцию implode, но опять же, я не могу явно использовать циклы.

Есть идеи?


person rshaq    schedule 13.12.2019    source источник
comment
Каков тип столбца my_column?   -  person Jordan Running    schedule 13.12.2019
comment
Столбец представляет собой varchar, не более 20 символов, и я никогда не ожидаю получить более 100 записей.   -  person rshaq    schedule 13.12.2019
comment
См. здесь: docs.oracle.com/cd/E11882_01 /сервер.112/e41084/   -  person Toru    schedule 14.12.2019


Ответы (1)


Если длина результата не превышает 4000 символов, может помочь listagg:

SQL> select listagg(ename, ',') within group (order by null) my_csv
  2  from emp;

MY_CSV
--------------------------------------------------------------------------------------
ADAMS,ALLEN,BLAKE,CLARK,FORD,JAMES,JONES,KING,MARTIN,MILLER,SCOTT,SMITH,TURNER,WARD

SQL>

Если это так (превышает 4000 символов), XMLAGG ваш выбор:

SQL> select
  2    rtrim(xmlagg(xmlelement(e, ename,',').extract('//text()') order by null).GetClobVal(),',')
  3    result
  4  from emp;

RESULT
--------------------------------------------------------------------------------------------------
SMITH,ALLEN,WARD,JONES,MARTIN,BLAKE,CLARK,SCOTT,KING,TURNER,ADAMS,JAMES,FORD,MIL

SQL>
person Littlefoot    schedule 13.12.2019
comment
Как описано здесь: stackoverflow.com/a/29030511/802058 - person Toru; 14.12.2019
comment
Это не совсем задокументировано, @Toru. Документация - это нечто другое, это ответ, опубликованный на Stack Overflow. Но, да... это хорошо известная тема, ничего особенного в ней нет. - person Littlefoot; 14.12.2019