解决WMSYS.WM_CONCAT在12c无法使用的问题

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/qq_34868715/article/details/101777460

问题:生产库用的是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

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/qq_34868715/article/details/101777460