自定义函数替换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,

参考技术A insert into test values('aaa','1');
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函数--合并,替换,拼接,截取,查找

oracle 12c 关于wm_concat 的替换;LISTAGG

ORACLE创建自定义函数返回varchar类型

Oracle列转行函数vm_concat在19C版本不兼容解决方案

incepter中支持wm_concat函数吗?

Jpa 重写方言dialect 使用oracle / mysql 数据库自定义函数