1、VARVHAR2类型的字段值进行聚合,并用","隔开,使用LISTAGG函数,自带去重功能:
LISTAGG(TANK, ',' ) WITHIN
GROUP (
ORDER BY INSP_DATE ) AS TANK
TANK TANK
----- -------
Q123 处理结果为: Q123,Q124,Q125
Q124 --------------->
Q125
但是对于以下情况的处理结果为:
TANK TANK
----- -------
Q123,Q124 处理结果为: Q123,Q124,Q125,Q124,Q125,Q125
Q124,Q125 --------------->
Q125
Q125
所以需要去重方式来实现,如下:
2、创建存储类型
CREATE OR REPLACE TYPE RPTMGR.t_ret_table IS TABLE OF VARCHAR2(4);
3、创建方法
CREATE OR REPLACE FUNCTION RPTMGR.FN_SPLIT_STRING(VAR_STR IN STRING,
VAR_SPLIT IN STRING)
RETURN VARCHAR2 IS
VAR_OUT T_RET_TABLE;
VAR_TMP VARCHAR2(4000);
VAR_ELEMENT VARCHAR2(4000);
V_RS VARCHAR2(4000);
BEGIN
VAR_TMP := VAR_STR;
VAR_OUT := T_RET_TABLE();
WHILE INSTR(VAR_TMP, VAR_SPLIT) > 0 LOOP
VAR_ELEMENT := SUBSTR(VAR_TMP, 1, INSTR(VAR_TMP, VAR_SPLIT) - 1);
VAR_TMP := SUBSTR(VAR_TMP,
INSTR(VAR_TMP, VAR_SPLIT) + LENGTH(VAR_SPLIT),
LENGTH(VAR_TMP));
VAR_OUT.EXTEND(1);
VAR_OUT(VAR_OUT.COUNT) := VAR_ELEMENT;
END LOOP;
VAR_OUT.EXTEND(1);
VAR_OUT(VAR_OUT.COUNT) := VAR_TMP;
FOR V_ROW IN (SELECT DISTINCT (COLUMN_VALUE) COLUMN_VALUE
FROM TABLE(VAR_OUT)
ORDER BY COLUMN_VALUE) LOOP
EXIT WHEN V_ROW.COLUMN_VALUE IS NULL;
IF V_RS IS NOT NULL THEN
V_RS := V_RS || ',' || V_ROW.COLUMN_VALUE;
ELSE
V_RS := V_ROW.COLUMN_VALUE;
END IF;
END LOOP;
--DBMS_OUTPUT.put_line(V_RS);
RETURN V_RS;
END FN_SPLIT_STRING;