--定义类型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;/
解决Oracle-12C没有wm_concat函数Oracle-12C中wm_concat函数的替代方案Oracle-12C中wm_concat函数的替代方案解锁wmsys用户;alter user wmsys account unlock;为wmsys用户授权,可根据需要授权;grant all privileges to wmsys;修改wmsys密码;alter user wmsys identified by 123456;使用wmsys用户登录,执行创建语句,在