-- 创建wm_concat函数-- 首先使用dba账号登录oracle数据库-- 解锁wmsys用户alteruser wmsys account unlock;-- 并为wmsys用户授权,可根据需要授权,不建议授权所有权限grantallprivilegesto wmsys;-- 如果不知道wmsys用户的密码,可以修改其密码alteruser wmsys identified by123456;-- 使用wmsys用户登录数据库
conn wmsys/123456-- 在wmsys下创建可用的wm_concat函数,直接执行以下语句-- 定义类型CREATEORREPLACETYPE WM_CONCAT_IMPL AS OBJECT
(
CURR_STR VARCHAR2(32767),
STATIC FUNCTION ODCIAGGREGATEINITIALIZE(SCTX INOUT WM_CONCAT_IMPL)RETURN NUMBER,
MEMBER FUNCTION ODCIAGGREGATEITERATE(SELF INOUT WM_CONCAT_IMPL,
P1 IN VARCHAR2)RETURN NUMBER,
MEMBER FUNCTION ODCIAGGREGATETERMINATE(SELF IN WM_CONCAT_IMPL,
RETURNVALUE OUT VARCHAR2,
FLAGS IN NUMBER)RETURN NUMBER,
MEMBER FUNCTION ODCIAGGREGATEMERGE(SELF INOUT WM_CONCAT_IMPL,
SCTX2 IN WM_CONCAT_IMPL)RETURN NUMBER
);/-- 定义类型body:CREATEORREPLACETYPE BODY WM_CONCAT_IMPL
IS
STATIC FUNCTION ODCIAGGREGATEINITIALIZE(SCTX INOUT WM_CONCAT_IMPL)RETURN NUMBER
ISBEGIN
SCTX := WM_CONCAT_IMPL(NULL);RETURN ODCICONST.SUCCESS;END;
MEMBER FUNCTION ODCIAGGREGATEITERATE(SELF INOUT WM_CONCAT_IMPL,
P1 IN VARCHAR2)RETURN NUMBER
ISBEGINIF(CURR_STR ISNOTNULL)THEN
CURR_STR := CURR_STR ||','|| P1;ELSE
CURR_STR := P1;ENDIF;RETURN ODCICONST.SUCCESS;END;
MEMBER FUNCTION ODCIAGGREGATETERMINATE(SELF IN WM_CONCAT_IMPL,
RETURNVALUE OUT VARCHAR2,
FLAGS IN NUMBER)RETURN NUMBER
ISBEGIN
RETURNVALUE := CURR_STR ;RETURN ODCICONST.SUCCESS;END;
MEMBER FUNCTION ODCIAGGREGATEMERGE(SELF INOUT WM_CONCAT_IMPL,
SCTX2 IN WM_CONCAT_IMPL)RETURN NUMBER
ISBEGINIF(SCTX2.CURR_STR ISNOTNULL)THEN
SELF.CURR_STR := SELF.CURR_STR ||','|| SCTX2.CURR_STR ;ENDIF;RETURN ODCICONST.SUCCESS;END;END;/--自定义行变列函数:CREATEORREPLACEFUNCTION wm_concat(P1 VARCHAR2)RETURN VARCHAR2 AGGREGATE USING WM_CONCAT_IMPL ;/-- 创建完成,给其创建同义词及授权,以供其他用户能正常使用。createpublic synonym WM_CONCAT_IMPL for wmsys.WM_CONCAT_IMPL
/createpublic synonym wm_concat for wmsys.wm_concat /grantexecuteON wm_concat_impl topublic/GRANTEXECUTEON wm_concat TOPUBLIC/
1-2 wm_concat方法实现:
-- 说明:使用wm_contat方法实现 ,借助over(partition by xx order by ...实现)-- wm_concat over(partition by 分组字段 order by 排序字段)后,-- 外面再套max和group by 查询select seq,max(remark) remark
from(select seq,
wm_concat('['|| to_char(createtime,'yyyy-mm-dd')||']'|| remark)over(partitionby seq orderby createtime) remark
from tb
)groupby seq;