创建wm_concat函数

2025-10-16 19:46:24

1、一.解锁wmsys用户

alter user wmsys account unlock;

解锁后,如果还是登录不了,可以登录system找到wmsys用户,设置密码和权限

2、二.创建包、包体和函数

以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,  

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 IN OUT WM_CONCAT_IMPL,  

SCTX2 IN WM_CONCAT_IMPL) RETURN NUMBER  

);  

3、--定义类型

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,  

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 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; 

4、--自定义行变列函数:  

CREATE OR REPLACE FUNCTION wm_concat(P1 VARCHAR2)  

RETURN VARCHAR2 AGGREGATE USING WM_CONCAT_IMPL ;  

/

-- 创建同义词并授权

create public synonym WM_CONCAT_IMPL for wmsys.WM_CONCAT_IMPL;

create public synonym wm_concat for wmsys.wm_concat;

grant execute on WM_CONCAT_IMPL to public;

grant execute on wm_concat to public;

声明:本网站引用、摘录或转载内容仅供网站访问者交流或参考,不代表本站立场,如存在版权或非法内容,请联系站长删除,联系邮箱:site.kefu@qq.com。
猜你喜欢