PL/SQL:从没有循环的 select 语句生成 CSV varchar

rsh*_*haq 0 csv plsql varchar2

使用 PL/SQL,我希望从 select 语句中以编程方式生成 CSV 字符串/varchar 对象。所以 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;
Run Code Online (Sandbox Code Playgroud)

本质上,内理论上会像 PHP 内爆函数一样工作,而“,”逗号是我的分隔符。我可以自己定义内爆函数,但同样,我不能明确使用循环。

有任何想法吗?

Lit*_*oot 5

如果结果的长度不超过 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>
Run Code Online (Sandbox Code Playgroud)

如果是(超过 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>
Run Code Online (Sandbox Code Playgroud)