在oracle9中如何实现wm_concat的功能

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在oracle9中如何实现wm_concat的功能相关的知识,希望对你有一定的参考价值。

参考技术A 方法一,使用connect by +sys_connect_by_path :
--测试数据
create table test(col varchar2(10));
insert into test values('a');
insert into test values('b');
insert into test values('c');
--SQL语句:
select ltrim(sys_connect_by_path(col, ','), ',')
from (select col, row_number() over(order by rownum) rn from test t)
where connect_by_isleaf = 1
start with rn = 1
connect by rn = prior rn + 1;
方法二,使用xmltype:
select dbms_lob.substr(rtrim(xmlagg(xmlparse(content col || ',' wellformed))
.getclobval(),
','),
4000,
1)
from test;
另外在10,11版本中也不建议使用wm_concat,这个函数属于非公开函数,在12c版本中已经失效;
参考技术B 写个函数,在函数中结合游标就处理好了,返回给SELECT 语句就可以了

SELECT DISTINCT DEPTNO,F(DEPTNO) FROM EMP;

11G可以用LISTAGG函数

方法四:不用临时表了,用函数配合SQL查询语句一次搞定
CREATE OR REPLACE FUNCTION DEALSTRING(P_DEPTNO EMP.DEPTNO%TYPE) RETURN VARCHAR2
IS
CURSOR C1 IS SELECT ENAME FROM EMP WHERE DEPTNO=P_DEPTNO; --定义游标C1
TYPE T_TYPE IS TABLE OF EMP.ENAME%TYPE; --定义嵌套表
V_T_TYPE T_TYPE:=T_TYPE(); --初始化嵌套表
V_STRING VARCHAR2(1000); --作为范围字符串
BEGIN
NULL;
OPEN C1;
FETCH C1 BULK COLLECT INTO V_T_TYPE; --一次性把游标中的所有数据读出来存放在嵌套表V_T_TYPE中,
CLOSE C1;

FOR I IN 1..V_T_TYPE.COUNT LOOP--一次读取嵌套表V_T_TYPE中的数据,进行字符串连接,处理为A,B,C,D,的形式
V_STRING:=V_STRING||V_T_TYPE(I)||',';
END LOOP;
V_STRING:=SUBSTR(V_STRING,0,LENGTH(V_STRING)-1); --把最后的逗号去掉
RETURN V_STRING; --返回字符串
END DEALSTRING;

SELECT * FROM USER_OBJECTS S WHERE S.OBJECT_NAME=UPPER('DEALSTRING');

SELECT DISTINCT DEPTNO,DEALSTRING(DEPTNO) FROM EMP WHERE DEPTNO IS NOT NULL; --避开空的原因是我的表中有一条记录的部门号为空;
参考技术C Oracle9i没有wm_concat函数,可以自己创建。创建方法参考下面地址内容:
http://www.myexception.cn/database/623259.html

以上是关于在oracle9中如何实现wm_concat的功能的主要内容,如果未能解决你的问题,请参考以下文章

Oracle的函数WM_CONCAT,在PostgreSQL中具有相同功能的函数名称是啥?

SqlServer实现Oracle的wm_concat()函数功能

oracle 怎么将查询到一列的数据 合并成一个字符串返回来 用“,”分割 如(张三,李思,。。。。)

Oracle 行列转换

ORACLE

wm_concat函数的排序问题