在oracle9中如何实现wm_concat的功能
3个回答
展开全部
方法一,使用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版本中已经失效;
--测试数据
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版本中已经失效;
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
写个函数,在函数中结合游标就处理好了,返回给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; --避开空的原因是我的表中有一条记录的部门号为空;
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; --避开空的原因是我的表中有一条记录的部门号为空;
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
Oracle9i没有wm_concat函数,可以自己创建。创建方法参考下面地址内容:
http://www.myexception.cn/database/623259.html
http://www.myexception.cn/database/623259.html
本回答被网友采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询
广告 您可能关注的内容 |