自定义函数替换wm_concat函数,在oracle会出现啥不可控因素吗
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了自定义函数替换wm_concat函数,在oracle会出现啥不可控因素吗相关的知识,希望对你有一定的参考价值。
create or replace TYPE BODY en_concat_im IS
STATIC FUNCTION ODCIAGGREGATEINITIALIZE(SCTX IN OUT en_concat_im)
RETURN NUMBER IS
BEGIN
SCTX := en_concat_im(NULL);
RETURN ODCICONST.SUCCESS;
END;
MEMBER FUNCTION ODCIAGGREGATEITERATE(SELF IN OUT en_concat_im,
P1 IN VARCHAR2) RETURN NUMBER IS
BEGIN
IF (CURR_STR IS NOT NULL) THEN
CURR_STR := CURR_STR || ';' || P1;
ELSE
CURR_STR := P1;
END IF;
RETURN ODCICONST.SUCCESS;
END;
MEMBER FUNCTION ODCIAGGREGATETERMINATE(SELF IN en_concat_im,
RETURNVALUE OUT VARCHAR2,
FLAGS IN NUMBER)
RETURN NUMBER IS
BEGIN
RETURNVALUE := CURR_STR;
RETURN ODCICONST.SUCCESS;
END;
MEMBER FUNCTION ODCIAGGREGATEMERGE(SELF IN OUT en_concat_im,
SCTX2 IN en_concat_im) RETURN NUMBER IS
BEGIN
IF (SCTX2.CURR_STR IS NOT NULL) THEN
SELF.CURR_STR := SELF.CURR_STR || ';' || SCTX2.CURR_STR;
END IF;
RETURN ODCICONST.SUCCESS;
END;
END;
create or replace FUNCTION en_concat(P1 VARCHAR2) RETURN VARCHAR2 AGGREGATE USING en_concat_im ;
create or replace TYPE en_concat_im AUTHID CURRENT_USER AS OBJECT
(
CURR_STR VARCHAR2(32767),
STATIC FUNCTION ODCIAGGREGATEINITIALIZE(SCTX IN OUT en_concat_im)
RETURN NUMBER,
MEMBER FUNCTION ODCIAGGREGATEITERATE(SELF IN OUT en_concat_im,
P1 IN VARCHAR2) RETURN NUMBER,
insert into test values('bbb','2');
insert into test values('ccc','5');
insert into test values('ddd','3');
select wm_concat(a),wm_concat(b) from test;
WM_CONCAT(A) WM_CONCAT(B)
1 aaa,bbb,ccc,ddd 1,2,5,3
没有问题的。
drop table test;
create table test(a varchar2(30),b varchar2(30),c varchar2(30));
insert into test values('aaa','1','a');
insert into test values('bbb','2','a');
insert into test values('ccc','5','a');
insert into test values('ddd','3','a');
insert into test values('aaaaa','11','b');
insert into test values('bbbbb','22','b');
insert into test values('ccccc','55','b');
insert into test values('ddddd','33','b');
select c,max(a),max(b) from (
select c,wm_concat(a) over (partition by c order by a) a,
wm_concat(b) over (partition by c order by a) b from test
) tt
group by c ;
C MAX(A) MAX(B)
a aaa,bbb,ccc,ddd 1,2,5,3
b aaaaa,bbbbb,ccccc,ddddd 11,22,55,33
oracle的wm_concat()函数
参考技术A wm_concat(列名)这个神奇的函数,他可以把列值用“,”分隔开,而且是显示成一行,下面来看一下这个函数是如何用的。表明:test
id names num
1 香蕉 3
2 苹果 2
3 葡萄 5
1 橘子 4
3 西瓜 6
想要实现的方式为:
id names
1 香蕉(3斤),橘子(4斤)
2 苹果(2斤)
3 葡萄(5斤),西瓜(6斤)
使用oracle的wm_concat(column)函数实现
select id,wm_concat(names || '(' || num ||'斤)')names from test group by id;
以上是关于自定义函数替换wm_concat函数,在oracle会出现啥不可控因素吗的主要内容,如果未能解决你的问题,请参考以下文章
oracle 12c 关于wm_concat 的替换;LISTAGG