Функция Oracle: репликация wm_concat
В настоящее время я работаю над проектом в Crystal Reports, который отказывается использовать недокументированную функцию WM_CONCAT, которая допустима в Oracle 10g. Вот информация заголовка WM_CONCAT
WM_CONCAT(p1 IN VARCHAR2) RETURN VARCHAR2
Чтобы использовать WM_CONCAT, я передаю ему следующее: WM_CONCAT(column1); Эта функция, кажется, принимает столбец типа varchar2 и возвращает разделенный запятыми список значений из столбца. В настоящее время у меня есть пользовательская версия этой функции, которая работает (на моем рабочем компьютере), но она не является оптимальной и не требует повторного использования. Может ли кто-нибудь предоставить хорошую, многократно используемую функцию, такую как WM_CONCAT, которую я мог бы использовать?
2 ответа
Вы получаете сообщение об ошибке при использовании wm_concat? В отличие от таких функций, как to_char, он принадлежит wmsys, и вам может понадобиться использовать wmsys.wm_concat для его использования. (если, конечно, вы не создадите необходимые синонимы).
Теперь для актуального вопроса,
Этот метод называется агрегированием строк.
Вы можете найти много других альтернатив здесь.
http://www.oracle-base.com/articles/10g/StringAggregationTechniques.php Для других методов выполните поиск "stragg" на http://asktom.oracle.com/ Другая полезная ссылка: http://www.orafaq.com/node/2290
Это, наверное, самый используемый. Многие команды пишут свои собственные пользовательские функции, которые более или менее делают то же самое.
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
в то время как это решение работает для varchar2 и числа, лучшее общее решение может быть построено с использованием интерфейса Oracle ODCIAggregate.
http://download-west.oracle.com/docs/cd/B14117_01/appdev.101/b10800/dciaggfns.htm
Реализация для того же находится по первой ссылке выше на www.oracle-base.com
Я решил это, используя технику, аналогичную последней в статье oracle-base: определите пользовательский TABLE
напечатайте и напишите функцию для объединения значения этого типа в строку. Я назвал свою функцию joinstr
и тогда вы можете назвать это следующим образом:
SELECT joinstr(CAST(MULTISET(SELECT column1 FROM table1) AS my_string_table_type), ',')
FROM DUAL
Примечание: я был на 9i до недавнего времени и еще не изучал COLLECT.