Какие SKU Oracle поддерживают WM_CONCAT? - PullRequest
2 голосов
/ 02 ноября 2011

У меня следующий запрос:

SELECT wm_concat(DISTINCT NAME) as Methods FROM TPM_TRAININGPLAN
JOIN TPM_DELIVERYMETHODS USING (METHODID)
WHERE PROJECTID=735 AND VERSIONID=1
ORDER BY NAME

В нашей производственной базе данных (немного более дорогой Oracle SKU, который стоит больше, чем мой дом *), возвращается:

I/OLT,ILT-WEB,OLT,QRG

Однако на моем локальном экземпляре Oracle Express (11g), который я использую для разработки, я получаю ошибку:

>[Error] Script lines: 13-16 ------------------------
 ORA-00904: "WM_CONCAT": invalid identifier
 Script line 13, statement line 1, column 7

Не поддерживает ли Oracle Express это или есть обходной путь (например, можно ли скопировать функцию с нашего производственного сервера или запустить какой-нибудь сценарий для ее «подражания»?) Спасибо!

* Нет, серьезно, на самом деле это стоит больше, чем мой дом.

UPDATE:

Как и предполагалось, я попробовал функцию LISTAGG (которая действительно включена в Express 11g и в SKU «Должны ли мы купить лицензию Oracle или вторую яхту»). Это, кажется, почти работает, но имеет несколько недостатков, которые я могу Найти хороший обходной путь для. Во-первых, запрос:

SELECT LISTAGG(NAME, ',') WITHIN GROUP (ORDER BY NAME) Methods FROM
TPM_TRAININGPLAN
JOIN TPM_DELIVERYMETHODS USING (METHODID) WHERE PROJECTID=240 AND VERSIONID=1

Вернется:

COMM,COMM,ILT-F2F,ILT-F2F,ILT-F2F,ILT-F2F,ILT-F2F

Однако я хочу удалить обманщиков. Изменение NAME на DISTINCT NAME приведет к ошибке DISTINCT option not allowed for this function

Отлично, мы просто подбросим туда CTE:

WITH Methods AS
   (SELECT DISTINCT NAME
    FROM TPM_TRAININGPLAN
    JOIN TPM_DELIVERYMETHODS USING (METHODID) WHERE PROJECTID=240 AND VERSIONID=1)
SELECT LISTAGG(NAME, ',') WITHIN GROUP (ORDER BY NAME) Methods FROM Methods

Это работает, однако я забыл упомянуть, что я запускаю всю эту вещь как вложенный выбор в большем запросе. Кажется, вы можете иметь вложенные селекторы, которые включают в себя CTE, однако в запросе вы больше не можете ссылаться на корневой запрос, только на CTE. Так что теперь я не могу заменить 240 и 1 соответствующими значениями из строки, в которой я нахожусь.

1 Ответ

2 голосов
/ 02 ноября 2011

если вы находитесь в 11GR2, вы должны быть в состоянии сделать listagg

with fake_data as(

select 'I/OLT' NAME , 1 aa from dual
union all
select 'ILT-WEB' NAME,2 from dual
union all
select 'OLT' NAME,3 from dual
union all
select 'QRG' NAME,4 from dual
)
SELECT 
       LISTAGG(NAME, ', ') WITHIN GROUP (ORDER BY name)  name_list
FROM fake_data
;

NAME_LIST                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                      
--------------------------
I/OLT, ILT-WEB, OLT, QRG  

У меня нет Oracle Express 11Gr2 для проверки этого (только на предприятии). Но Oracle Express не поддерживает Java, но вы можете попробовать реализовать его с помощью пользовательских типов (еще раз, у меня нет Express для тестирования!) http://asktom.oracle.com/pls/asktom/f?p=100:11:0::NO::P11_QUESTION_ID:2196162600402

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...