Вот версия на чистом SQL, которая устраняет необходимость во временных таблицах и ненужных DDL.
with C1_R as (
SELECT DISTINCT SOUR.SOUR_ID_SEQ,
SRNM.SRNM_NM,
SOUR.FORK_NM,
DECODE(POD.UNNAMED_TRIBUTARY,
'N',
NULL,
'Y',
'UNNAMED TRIBUTARY') POD_UT,
MRTP.DESCR POD_MINORTYPE,
DECODE(POD.MAJOR_TYPE,
'S',
'SURFACE WATER',
'G',
'GROUNDWATER',
NULL,
NULL) POD_MAJORTYPE
FROM WRD_SOURCES SOUR,
WRD_SOURCE_NAMES SRNM,
WRD_POINT_OF_DIVERSIONS POD,
WRD_MINOR_TYPES MRTP,
WRD_VERSION_APPLICATION_XREFS VAX
WHERE SOUR.SOUR_ID_SEQ = POD.SOUR_ID_SEQ
AND SOUR.SRNM_ID_SEQ = SRNM.SRNM_ID_SEQ
AND POD.MRTP_CD = MRTP.MRTP_CD(+)
AND POD.WRGT_ID_SEQ = VAX.WRGT_ID_SEQ
AND POD.VERS_ID_SEQ = VAX.VERS_ID_SEQ
AND VAX.APPL_ID_SEQ = I_APPL_ID_SEQ;
) , fmt as (
select distinct nvl2(C1_R.POD_MINORTYPE, C1_R.POD_MINORTYPE || ', ', null)
|| nvl2(C1_R.POD_UT C1_R.POD_UT || ' OF ', null)
|| C1_R.SRNM_NM
|| nvl2(C1_R.FORK_NM IS, ', '|| C1_R.FORK_NM, null)
as SRC_NAME;
from C1_R
)
select listagg(src_name, '|') within group (order by source_name) as rtn_val
from fmt
/
Единственное, что это не делает, - это обрабатывает сцепленные строки, превышающие ограничение в 4000 символов. В 12cR2 Oracle дал нам ON OVERFLOW TRUNCATE для предложения listagg()
, но вряд ли кто-то еще находится на 12cR2; У Stew Ashton есть обходной путь для более ранних версий. Проверьте это.