oracle - una - listagg sql server
Función de Listagg con colección PLSQL (2)
Para poder utilizar la función LISTAGG
con una colección, la colección debe declararse como tabla anidada no como una matriz asociativa y debe crearse como tipo sql (objeto de esquema) porque no es posible usar el tipo pl / sql en una instrucción select. Con ese fin, puede hacer lo siguiente:
--- 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
De lo contrario, el loop
es tu única opción.
Tengo una colección PL / SQL de tipo siguiente
type p_typ_str_tab is table of varchar2(4000) index by pls_integer;
Me gustaría agregar los valores en una sola cadena con una función simple en línea como LISTAGG
sin escribir ninguna función personalizada o para bucles. Todos los ejemplos de LISTAGG
no muestran cómo usar colecciones PL / SQL. Estoy usando Oracle 11g R2. es posible?
LISTAGG
es una función analítica de SQL, y no opera en colecciones PL / SQL, sino en cursores / conjuntos de filas.
Entonces, en resumen, no, no es posible.
Dicho esto, iterar sobre una tabla PL / SQL para construir una cadena concatenada es trivial:
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);