我有一个以下类型的PL / SQL集合
type p_typ_str_tab is table of varchar2(4000) index by pls_integer;
我想使用简单的内联函数(如LISTAGG
)将值聚合到单个字符串中,而无需编写任何自定义函数或for循环。 LISTAGG
的所有示例都没有显示如何使用PL / SQL集合。我正在使用Oracle 11g R2。这可能吗?
答案 0 :(得分:9)
为了能够将LISTAGG
函数与集合一起使用,必须将集合声明为嵌套表而不是关联数组,并且必须创建为sql类型(模式对象),因为它不可能使用pl / select语句中的sql类型。为此,您可以执行以下操作:
--- create a nested table type
SQL> create or replace type t_tb_type is table of number;
2 /
Type created
--- and use it as follows
SQL> select listagg(column_value, ',') within group(order by column_value) res
2 from table(t_tb_type(1,2,3)) -- or call the function that returns data of
3 / -- t_tb_type type
RES
-------
1,2,3
否则loop
是您唯一的选择。
答案 1 :(得分:5)
LISTAGG
是一个分析SQL函数,它不针对PL / SQL集合,而是针对游标/行集。
所以,简而言之,不,这是不可能的。
也就是说,迭代PL / SQL表来构建连接字符串是微不足道的:
l_new_string := null;
for i in str_tab.first .. str_tab.last
loop
if str_tab(i) is not null then
l_new_string := str_tab(i) || ', ';
end if;
end loop;
-- trim off the trailing comma and space
l_new_string := substr(l_new_string, 1, length(l_new_string) - 2);