Función de Oracle: Replicar wm_concat
-
21-09-2019 - |
Pregunta
Actualmente estoy trabajando en un proyecto dentro de Crystal Reports que se niega a utilizar la función de WM_CONCAT indocumentado, que es permisible dentro de Oracle 10g. Aquí está la información de la cabecera WM_CONCAT
WM_CONCAT(p1 IN VARCHAR2) RETURN VARCHAR2
Para utilizar WM_CONCAT lo paso la siguiente: WM_CONCAT (column1); Esta función parece aceptar una columna de tipo VARCHAR2, y devuelve una lista separada por comas de los valores de la columna. Actualmente tengo una versión personalizada de esta función que las obras (en mi equipo de trabajo), pero no es óptima y carece de aptitud para la reutilización. ¿Alguien podría proporcionar una buena función reutilizable, como WM_CONCAT que podría utilizar?
Solución
¿Recibe un mensaje de error cuando se utiliza wm_concat? A diferencia de funciones como to_char, que es propiedad de wmsys y es posible que tenga que utilizar wmsys.wm_concat usarlo. (A menos que cree los sinónimos necesarias, por supuesto).
Ahora la pregunta real,
Esta técnica se denomina agregación cadena.
Se puede encontrar una gran cantidad de otras alternativas aquí.
http://www.oracle-base.com/ artículos / 10g / StringAggregationTechniques.php Para otros métodos, Búsqueda de "Stragg" en la http://asktom.oracle.com Otro enlace útil: http://www.orafaq.com/node/2290
Este es probablemente el más utilizado. Una gran cantidad de equipos de escribir sus propias funciones personalizadas que más o menos lo mismo.
CREATE OR REPLACE FUNCTION get_employees (p_deptno in emp.deptno%TYPE)
RETURN VARCHAR2
IS
l_text VARCHAR2(32767) := NULL;
BEGIN
FOR cur_rec IN (SELECT ename FROM emp WHERE deptno = p_deptno) LOOP
l_text := l_text || ',' || cur_rec.ename;
END LOOP;
RETURN LTRIM(l_text, ',');
END;
/
SHOW ERRORS
Mientras que esta solución funciona para varchar2 y número, la mejor solución genérica se puede construir utilizando la interfaz de Oracle ODCIAggregate.
http: // download -west.oracle.com/docs/cd/B14117_01/appdev.101/b10800/dciaggfns.htm#sthref462
Implementación para el mismo está en el primer enlace de arriba en www.oracle-base.com
Otros consejos
He resuelto esto utilizando una técnica similar a la anterior en el artículo de Oracle-base: definir un tipo TABLE
costumbre y escribir una función para agregar un valor de ese tipo en una cadena. Llamé a mi función joinstr
y luego se le puede llamar de la siguiente manera:
SELECT joinstr(CAST(MULTISET(SELECT column1 FROM table1) AS my_string_table_type), ',')
FROM DUAL
Nota: yo estaba en 9i hasta hace poco y no he estudiado aún COLLECT
.