版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
问题:生产库用的是Oracle 11g,开发用的是Oracle 12c,存在差异,需要解决下部分函数(WMSYS.WM_CONCAT)在11g可以使用,但12c不能使用的情况
关于WM_CONCAT函数在官方文档里明确表示,最好不用wm_concat, 如下图,使用了移植性将无法保证
但当工程里已经有大量的此类函数使用时,修改代码不现实的情况下就需要保留此函数,另谋他法。
一、使用PLSQL连接开发环境数据库
二、创建WMSYS用户,并为其授权
-- 创建用户
CREATE USER WMSYS IDENTIFIED BY WMSYS123456 DEFAULT TABLESPACE isc;
--授权用户
GRANT CONNECT,RESOURCE TO WMSYS;
三、以该用户角色登录数据库
--以新建用户Login
conn WMSYS/WMSYS123456
四、创建TYPE、FUNCTION
-- 创建类型
CREATE OR REPLACE TYPE wm_concat_impl
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
);
/
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;
/
CREATE OR REPLACE FUNCTION wm_concat (p1 VARCHAR2)
RETURN VARCHAR2
AGGREGATE USING wm_concat_impl;
/
五、授权所有用户使用
--将wm_concat授权给所有人用
grant execute on wm_concat to public;
六、测试函数是否在12c能使用
扫描二维码关注公众号,回复:
7602717 查看本文章
PS.同WM_CONCAT效果相同的函数还有LISTAGG
/*SELECT
SNO,
WMSYS.WM_CONCAT(SAGE)
FROM
ABC
GROUP BY
SNO;*/
SELECT
SNO,
listagg (SAGE, ',') WITHIN GROUP (ORDER BY SAGE)
FROM
ABC
GROUP BY
SNO