Pergunta

Atualmente, estou trabalhando em um projeto da Crystal relata que se recusa a usar a função sem documentos WM_CONCAT, que é permitida no Oracle 10G. Aqui está as informações do cabeçalho WM_CONCAT

WM_CONCAT(p1 IN VARCHAR2) RETURN VARCHAR2

Para usar wm_concat, eu passo o seguinte: WM_CONCAT (Column1); Esta função parece aceitar uma coluna do tipo VARCHAR2 e retorna uma lista delimitada de vírgula de valores da coluna. Atualmente, tenho uma versão personalizada dessa função que funciona (no meu computador de trabalho), mas não é ideal e não possui reutilização. Alguém poderia fornecer uma função boa e reutilizável como WM_CONCAT que eu poderia usar?

Foi útil?

Solução

Você recebe uma mensagem de erro quando usa WM_CONCAT? Ao contrário das funções como o To_Char, é de propriedade da WMSYS e você pode precisar usar o wmsys.wm_concat para usá -lo. (a menos que você crie os sinônimos necessários, é claro).

Agora para a pergunta real,

Esta técnica é chamada de agregação de string.

Você pode encontrar muitas outras alternativas aqui.

http://www.oracle-base.com/articles/10g/stringagregationtechniques.phpPara outros métodos, procure "Stragg" em http://asktom.oracle.comOutro link útil: http://www.orafaq.com/node/2290

Este é provavelmente o mais usado. Muitas equipes escrevem suas próprias funções personalizadas que mais ou menos fazem o mesmo.

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

Embora essa solução funcione para varchar2 e número, a melhor solução genérica pode ser criada usando a interface Oracle Odciaggregate.

http://download-west.oracle.com/docs/cd/b14117_01/appdev.101/b10800/dciaggfns.htm#sthref462

A implementação para o mesmo está no primeiro link acima em www.oracle-base.com

Outras dicas

Eu resolvi isso usando uma técnica semelhante à última do artigo Oracle-Base: Defina um personalizado TABLE Digite e escreva uma função para agregar um valor desse tipo em uma string. Eu chamei minha função joinstr E então você pode chamar o seguinte:

SELECT joinstr(CAST(MULTISET(SELECT column1 FROM table1) AS my_string_table_type), ',') 
FROM DUAL

Nota: eu estava no 9i até recentemente e ainda não procurei o Collect.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top