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?

¿Fue útil?

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

.
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top