varios una sola registros listagg group_concat concatenar columnas columna cadena 10g oracle collections plsql oracle11g aggregate-functions

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);