Função Oracle: Replique WM_CONCAT
-
21-09-2019 - |
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?
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.