Если у вас есть 10 г вместо 11 г, есть скрытая функция, похожая на LISTAGG.
WMSYS.WM_CONCAT
SELECT Contracts.contract_name
, WMSYS.WM_CONCAT(Devices.serialnum)
FROM Contracts, Devices
WHERE Contracts.contractid = Devices.fk_contractid
GROUP BY Contracts.contract_name;
WM_CONCAT не позволяет вам сортировать.
Вы также можете создать свою собственную функцию, например:
FUNCTION concat_serialnum(the_contract Contracts.contractid%TYPE)
RETURN VARCHAR2
IS
return_value VARCHAR2(4000);
CURSOR serials_cur IS
SELECT serialnum
FROM Devices
WHERE contractid = the_contract
ORDER BY serialnum;
BEGIN
FOR serials_rec IN serials_cur LOOP
return_value := return_value || ', ' || serials_rec.serialnum;
END LOOP;
RETURN LTRIM(return_value, ', ');
END concat_serialnum;
Вы должны добавить код для обработки ограничения в 4000 символов.
Ваш запрос теперь будет
SELECT contract_name
, concat_serialnum(contractid)
from Contracts;