有时工作中会用到 wm_concat 列转行的函数, 但是从 10205 之后, 其返回结果为 CLOB 类型, 在 PL/SQL developer 中显示为这样:
但是在 sqlplus 中显示正常:
- SQL> SELECT wm_concat(column_name) FROM t1 GROUP BY table_name;
- WM_CONCAT(COLUMN_NAME)
- --------------------------------------------------------------------------------
- ENAME,COMM,SAL,JOB
- DEPTNO,LOC,DNAME
- EMPNO,DEPTNO,COMM,SAL,HIREDATE,MGR,JOB,ENAME
- GRADE,HISAL,LOSAL
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
此时可以使用 dbms_lob 函数:
另:
在 11GR2 中, 使用 listagg() 函数代替 wm_concat(), 可以提高效率; 而且 listagg() 还可以作为分析函数使用, 添加 over 子句.
- SELECT deptno,dbms_lob.substr(wm_concat(ename))
- FROM scott.emp a
- GROUP BY deptno;
- SELECT deptno,listagg(ename,',') WITHIN GROUP (ORDER BY ename)
- FROM scott.emp a
- GROUP BY deptno;
- SELECT DISTINCT deptno,listagg(ename,',') WITHIN GROUP (ORDER BY ename) OVER (PARTITION BY deptno)
- FROM scott.emp a;
来源: http://www.bubuko.com/infodetail-3616225.html