Oracle12C关于WM_CONCAT的创建函数

Oracle12C 中,去掉了 WM_CONCAT函数。

网上众多的还是恢复wmsys 用户,然后创建用户,授权等等,太过繁琐。

那就不能创建一个用户自己的函数,不得了。所有使用的非系统函数,都变成自己的呗。

函数创建如下:

CREATE OR REPLACE TYPE WM_CONCAT_IMPL AS OBJECT  
-- AUTHID CURRENT_USER AS OBJECT  
(  
    CURR_STR VARCHAR2(32767),   
    STATIC FUNCTION ODCIAGGREGATEINITIALIZE(SCTX IN OUT WM_CONCAT_IMPL) RETURN NUMBER, 
    MEMBER FUNCTION ODCIAGGREGATEITERATE(SELF IN OUT WM_CONCAT_IMPL,  PARAM1 IN VARCHAR2) RETURN NUMBER,      
    MEMBER FUNCTION ODCIAGGREGATETERMINATE(SELF IN WM_CONCAT_IMPL,  RETURNVALUE OUT VARCHAR2,  FLAGS IN NUMBER)   RETURN NUMBER,  
    MEMBER FUNCTION ODCIAGGREGATEMERGE(SELF IN OUT WM_CONCAT_IMPL,  SCTX2 IN WM_CONCAT_IMPL) RETURN NUMBER
);  
/
--定义类型body:  
CREATE OR REPLACE TYPE BODY WM_CONCAT_IMPL IS  

    STATIC FUNCTION ODCIAGGREGATEINITIALIZE(SCTX IN OUT WM_CONCAT_IMPL)  RETURN NUMBER  IS  
    BEGIN  
		SCTX := WM_CONCAT_IMPL(NULL) ;  
		RETURN ODCICONST.SUCCESS;  
    END;  


    MEMBER FUNCTION ODCIAGGREGATEITERATE(SELF IN OUT WM_CONCAT_IMPL,PARAM1 IN VARCHAR2)  RETURN NUMBER  IS  
    BEGIN  
		IF(CURR_STR IS NOT NULL) THEN  
		CURR_STR := CURR_STR || ',' || PARAM1;  
		ELSE  
		CURR_STR := PARAM1;  
		END IF;  
		RETURN ODCICONST.SUCCESS;  
    END;  


    MEMBER FUNCTION ODCIAGGREGATETERMINATE(SELF IN WM_CONCAT_IMPL, RETURNVALUE OUT VARCHAR2,  FLAGS IN NUMBER)  RETURN NUMBER  IS  
    BEGIN  
		RETURNVALUE := CURR_STR ;  
		RETURN ODCICONST.SUCCESS;  
    END;  


    MEMBER FUNCTION ODCIAGGREGATEMERGE(SELF IN OUT WM_CONCAT_IMPL,  SCTX2 IN WM_CONCAT_IMPL)  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 wm_concat(PARAM1 VARCHAR2)  RETURN VARCHAR2 AGGREGATE USING WM_CONCAT_IMPL ;  

亲测,在Oracle12C的PDB上,可用。

猜你喜欢

转载自sharejava.iteye.com/blog/2389958