PL/SQL:从 select 语句生成 CSV varchar,没有循环
PL/SQL: Generating CSV varchar from select statement without loops
使用 PL/SQL,我希望以编程方式从 select 语句生成 CSV string/varchar 对象。所以 select 语句的输出通常是 1-n 条记录(我只需要一列)。但更重要的是,我不能使用循环或任何迭代过程,并且必须在不使用外部库的情况下完成。
我可以自由地将数据转换为 table 或不同的数据类型,并在需要时使用更多内存。但是我不能明确地使用循环。
我想我正在寻找一种方法来做这样的事情:
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 理论上像 PHP implode 函数一样工作,',' 逗号是我的分隔符。我可以自己定义 implode 函数,但同样,我不能显式使用循环。
有什么想法吗?
如果结果的长度不超过 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>
使用 PL/SQL,我希望以编程方式从 select 语句生成 CSV string/varchar 对象。所以 select 语句的输出通常是 1-n 条记录(我只需要一列)。但更重要的是,我不能使用循环或任何迭代过程,并且必须在不使用外部库的情况下完成。
我可以自由地将数据转换为 table 或不同的数据类型,并在需要时使用更多内存。但是我不能明确地使用循环。
我想我正在寻找一种方法来做这样的事情:
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 理论上像 PHP implode 函数一样工作,',' 逗号是我的分隔符。我可以自己定义 implode 函数,但同样,我不能显式使用循环。
有什么想法吗?
如果结果的长度不超过 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>