Вопрос

В настоящее время я работаю над проектом в Crystal Reports, который отказывается использовать недокументированную функцию WM_CONCAT, которая допустима в Oracle 10g.Вот информация о заголовке WM_CONCAT

WM_CONCAT(p1 IN VARCHAR2) RETURN VARCHAR2

Чтобы использовать WM_CONCAT, я передаю ему следующее:WM_CONCAT(столбец 1);Похоже, что эта функция принимает столбец типа varchar2 и возвращает список значений из столбца, разделенный запятыми.В настоящее время у меня есть пользовательская версия этой функции, которая работает (на моем рабочем компьютере), но она не оптимальна и не поддается повторному использованию.Может ли кто-нибудь предоставить хорошую, многоразовую функцию, такую как WM_CONCAT, которую я мог бы использовать?

Это было полезно?

Решение

Получаете ли вы сообщение об ошибке при использовании 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 и number, лучшее универсальное решение может быть создано с использованием интерфейса Oracle ODCIAggregate.

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

Реализация для того же самого находится по первой ссылке выше по адресу 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.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top