如果你不知道这个函数没有关系,因为您可以有其他的办法来实现。如果你已经在使用这个函数,一定要注意。

wmsys.wm_concat 是ORACLE内部函数,没有对外公布,也就是说,你可以使用,但是如果发生什么问题ORACLE概不负责。最显然的是ORACLE版本从10.2.0.4 =》10.2.0.5 只是一个小版本的变更,足以让你的系统出现问题。当然,你可以选择不升级数据库版本。

那么有没有办法实现替换呢?答案当然是有的,使用自定义聚合函数或更换到Oracle 11g Release 2(此版本引入了LISTAGG 函数,使得聚集连接字符串变得很容易。并且允许使用我们指定连接串中的字段顺序)。现在我们在不改变版本的基础上,自己实现一个替换吧,ORACLE文档上就有现成的例子。直接修改一下就OK了。

由于聚合函数只支持一个参数,如果像我们现在这样实现的话,不能像LISTAGG一样,使用动态字符连接,比如| + =等自定义符号。

不过,这里也给了我们一上思考,可以定义一下Type,然后传入就可以了。如下。

首先创建一个类型。然后修改相应的传入参数便可,请参照下面蓝色(普通类型)与红色(自定义类型)对比,当然,你可以更深的扩展,以便完成更复杂的功能。

create or replace type ConcatObj as object(

fieldValue varchar2(1024),

separator varchar2(100)

)

  1. Implement the type ConcatStrImpl to contain the ODCIAggregate routines:

    create type ConcatStrImpl as object  (    default_str varchar2(32767), -- 也只能这么大,再大就越界了    sep varchar2(100), --定义分隔符,以便以后使用    static function ODCIAggregateInitialize(sctx IN OUT ConcatStrImpl)    return number,    member function ODCIAggregateIterate(self IN OUT ConcatStrImpl,      value IN varchar2) return number,    member function ODCIAggregateIterate(self IN OUT ConcatStrImpl,       value IN ConcatObj) return number,    member function ODCIAggregateTerminate(self IN ConcatStrImpl,      returnValue OUT varchar2, flags IN number) return number,    member function ODCIAggregateMerge(self IN OUT ConcatStrImpl,      ctx2 IN ConcatStrImpl) return number  );
  2. Implement the type body for ConcatStrImpl:
    create or replace type body ConcatStrImpl is  static function ODCIAggregateInitialize(sctx IN OUT ConcatStrImpl)  return number is  begin    sctx:= ConcatStrImpl(null);    sctx:= ConcatStrImpl(null,null);    return ODCIConst.Success;  end;    member function ODCIAggregateIterate(self IN OUT ConcatStrImpl,    value IN varchar2) return number is  begin    if self.default_str is not null then      self.default_str := self.default_str || ',' || value; -- 逗号分隔    else      self.default_str:= value;    end if;    return ODCIConst.Success;  end;    member function ODCIAggregateIterate(self IN OUT ConcatStrImpl,     value IN ConcatObj) return number is  begin    if self.default_str is not null and value.fieldValue is not null  then      self.default_str := self.default_str || self.sep|| value.fieldValue;     elsif value.fieldValue is not null then      self.default_str:= value.fieldValue;      self.sep:= value.separator;    end if;    return ODCIConst.Success;  end;    member function ODCIAggregateTerminate(self IN ConcatStrImpl,      returnValue OUT varchar2, flags IN number) return number is  begin    returnValue := self.default_str;    return ODCIConst.Success;  end;    member function ODCIAggregateMerge(self IN OUT ConcatStrImpl,    ctx2 IN ConcatStrImpl) return number is  begin    if ctx2.default_str is not null then      self.default_str := self.default_str || ',' ||ctx2.default_str;    end if;    return ODCIConst.Success;  end;  member function ODCIAggregateMerge(self IN OUT ConcatStrImpl,    ctx2 IN ConcatStrImpl) return number is  begin    if ctx2.default_str is not null and self.default_str is not null then      self.default_str := self.default_str || self.sep||ctx2.default_str;     elsif ctx2.default_str is not null then       self.default_str := ctx2.default_str;   end if;   return ODCIConst.Success;  end;  end;
  3. Create the user-defined aggregate:
    CREATE FUNCTION ConcatStr (input varchar2) RETURN varchar2  PARALLEL_ENABLE AGGREGATE USING ConcatStrImpl;  CREATE FUNCTION ConcatStr1 (input ConcatObj) RETURN varchar2  PARALLEL_ENABLE AGGREGATE USING ConcatStrImpl1;
  4. Use ConcatStr():
    SELECT ConcatStr(salary), department_id FROM employees;  SELECT ConcatStr1(ConcatObj(salary,'=')), department_id FROM employees;

Oracle相关文档,链接地址:http://docs.oracle.com/cd/B19306_01/appdev.102/b14289/dciaggfns.htm

其他:

替代Oracle函数wmsys_wm_concat()函数

1.

create or replace function postgresql(p_tname varchar2, p_colname varchar2)
return clob is

v_tmp    varchar2(200);
v_result clob;
v_cum    sys_refcursor;
begin

open v_cum for 'select ' || p_colname || ' from ' || p_tname;
loop
    fetch v_cum
      into v_tmp;
    exit when v_cum%notfound;
    v_result := v_result || v_tmp;
end loop;
dbms_output.put_line(v_result);
return v_result;
end;

select postgresql('emp','ename') from dual

2.sys_connect_by_path

3.create or replace TYPE zh_concat_im 
AUTHID CURRENT_USER AS OBJECT
(
   CURR_STR VARCHAR2(32767),
   STATIC FUNCTION ODCIAGGREGATEINITIALIZE(SCTX IN OUT zh_concat_im) RETURN NUMBER,
   MEMBER FUNCTION ODCIAGGREGATEITERATE(SELF IN OUT zh_concat_im, 
            P1 IN VARCHAR2) RETURN NUMBER,
   MEMBER FUNCTION ODCIAGGREGATETERMINATE(SELF IN zh_concat_im,
                              RETURNVALUE OUT VARCHAR2,
                              FLAGS IN NUMBER)
                  RETURN NUMBER,
   MEMBER FUNCTION ODCIAGGREGATEMERGE(SELF IN OUT zh_concat_im, 
                   SCTX2 IN   zh_concat_im) RETURN NUMBER
);
/

create or replace TYPE BODY zh_concat_im
IS
   STATIC FUNCTION ODCIAGGREGATEINITIALIZE(SCTX IN OUT zh_concat_im)
   RETURN NUMBER 
   IS
   BEGIN
SCTX := zh_concat_im(NULL) ;
RETURN ODCICONST.SUCCESS;
   END;
   MEMBER FUNCTION ODCIAGGREGATEITERATE(SELF IN OUT zh_concat_im,
      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 zh_concat_im,
                              RETURNVALUE OUT VARCHAR2,
                              FLAGS IN NUMBER)
RETURN NUMBER 
   IS
   BEGIN
RETURNVALUE := CURR_STR ;
RETURN ODCICONST.SUCCESS;
   END;
   MEMBER FUNCTION ODCIAGGREGATEMERGE(SELF IN OUT zh_concat_im, 
                                  SCTX2 IN zh_concat_im) 
   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 zh_concat(P1 VARCHAR2) 
RETURN VARCHAR2 AGGREGATE USING zh_concat_im ;

修改标红部门,可调整字段间分隔符

Oracle内部函数 wmsys.wm_concat 替换办法及思考相关推荐

  1. oracle拼接字符串报错,Oracle 中wmsys.wm_concat拼接字符串,结果过长报错解决

    备忘:这个函数最大是4000,根据拼接列的长度,通过限制拼接条数来防止拼接字符串过长错误 --这个情况是从子表中读取出具,这里直接把它当做查询字段处理,在子表中有所有数据 select info.id ...

  2. oracle自定义长度异常,Oracle 自定义wmsys.wm_concat 避免长度限制

    Oracle自定义wmsys.wm_concat避免长度限制网上搜索到这段类似代码但是长度过程还是不行,经过我的修改,亲测可以. CREATEORREPLACETYPEZH_CONCAT_IM AUT ...

  3. owmctab.plb oracle,ORA-00904: WMSYS.WM_CONCAT: invalid identifier

    同事玩 Docker ,在 Docker 里面启了一个 Oracle 10g Express 版本,在测试过程中遇到了 ORA-00904: "WMSYS"."WM_CO ...

  4. Oracle 11g行字段拼接WMSYS.WM_CONCAT问题Not A LOB

    Oracle 11g行字段拼接WMSYS.WM_CONCAT问题Not A LOB 一.问题出现 项目中的某个查询需要将表中某个字段不重复地拼接起来,百度得到该函数WMSYS.WM_CONCAT(字段 ...

  5. Oracle中的wmsys.wm_concat

    Oracle中的wmsys.wm_concat主要实现行转列功能(说白了就是将查询的某一列值使用逗号进行隔开拼接,成为一条数据). wmsys.wm_concat除了单独使用外还可以和over函数结合 ...

  6. oracle内置函数 wmsys.wm_concat使用

    函数名:wmsys.wm_concat 作用:以逗号分隔连接列的值 oracle 10g引入.使用时直接用wm_concat也可以. 以下介绍一些实际使用的状况.介绍实际Case前先建立一个测试tab ...

  7. 多个值合并成一个字段oracle排序,Oracle之多行记录变一行记录,行变列,并排序(wmsys.wm_concat)...

    原帖:http://www.cnblogs.com/nayitian/p/3231734.html wmsys.wm_concat Definition: The Oracle PL/SQL WM_C ...

  8. oracle 11 wm concat,【Oracle开发】关于11.2上WMSYS.WM_CONCAT的workaround

    有很多人问关于新版本中WMSYS.WM_CONCAT函数无法使用的问题. 对于该函数,Oracle官方的态度是其从来没有将该函数列入任何官方文档中,这个函数仅仅是让Oracle Dev研发在针对内部对 ...

  9. mysql中sql语句中常见的group_concat()函数意思以及用法,oracle中与其一样的功能函数是wmsys.wm_concat()

    1.group_concat(),手册上说明:该函数返回带有来自一个组的连接的非NULL值的字符串结果.比较抽象,难以理解. 通俗点理解,其实是这样的:group_concat()会计算哪些行属于同一 ...

最新文章

  1. Codeforces 903F Clear The Matrix(状态压缩DP)
  2. Shiny平台构建与R包开发(五)——ui美化
  3. AVAudioPlayer播放音频
  4. Kubernetus自传
  5. 最短路之Dijkstra算法
  6. 在浙学计算机基础2020答案,浙江大学2020年硕士研究生复试分数线的基本要求
  7. how to learn
  8. linux uvc协议_linux使用UVC采集数据
  9. 机器学习对价格预测做模型与应用
  10. Redis高可用详解:持久化技术及方案选择
  11. Bootstrap 容器(container)
  12. java jtree 监听_Java JTree.addTreeExpansionListener方法代码示例
  13. Eigen教程(6)之高级初始化方法
  14. [转]C语言嵌入式系统编程修炼之背景篇
  15. Atitit  404错误的排查流程总结 v3 qaf
  16. 智慧城市大数据分析系统解决方案
  17. 淘客返利机器人,淘宝,拼多多,京东三合一查券返利机器人搭建教程
  18. 男生说fb是什么梗_男生聊污是什么意思 男生会对谁聊污
  19. 卷积神经网络 ——卷积神经网络的结构
  20. 华为携手思迈特软件成立BYOD移动办公联盟

热门文章

  1. 博奥智源微信图书馆解决方案
  2. 花瓣网首页头部背景图效果
  3. PFP, CPA, CPS, CPM, CPC, CPL, CPP, CPR概念及其特点
  4. 模拟支付宝、淘宝登录2
  5. [线性代数]向量究竟是什么?
  6. 小型断路器的C型和D型在选型上的区别
  7. EasyExcel自定义表头导出模板并封装数据下拉选择
  8. 同态加密BGV与BFV方案对比与梳理
  9. 1202:Pell数列
  10. 光伏发电物联网数字化解决方案